?? demo451.c
字號:
/*******************************************************************************
* 標題: 藍海微芯LJD-SY-5100單片機開發系統演示程序 *
* 文件: CH451.C *
* 日期: 2005-7-4 *
* 版本: 1.0 *
* 作者: 藍海微芯 *
* 網站: http://www.bluemcu.com *
********************************************************************************
* 描述: *
* 數碼管循環顯示0~9的數字 *
* *
* *
********************************************************************************
* 【版權】 Copyright(C)微芯科技 http://www.ljd-2008.com All Rights Reserved *
* 【聲明】 此程序僅用于學習與參考,引用請注明版權和作者信息! *
*******************************************************************************/
#define CH451_RESET 0x0201 //復位
#define CH451_LEFTMOV 0x0300 //設置移動方式-作移
#define CH451_LEFTCYC 0x0301 //設置移動方式-左循
#define CH451_RIGHTMOV 0x0302 //設置移動方式-右移
#define CH451_RIGHTCYC 0x0303 //設置移動方式-右循
#define CH451_SYSOFF 0x0400 //關顯示、鍵盤、看門狗
#define CH451_SYSON1 0x0401 //開顯示
#define CH451_SYSON2 0x0403 //開顯示、鍵盤
#define CH451_SYSON3 0x0407 //開顯示、鍵盤、看門狗功能
#define CH451_DSP 0x0500 //設置默認顯示方式
#define CH451_BCD 0x0580 //設置BCD譯碼方式
#define CH451_TWINKLE 0x0600 //設置閃爍控制
#define CH451_DIG0 0x0800 //數碼管位0顯示
#define CH451_DIG1 0x0900 //數碼管位1顯示
#define CH451_DIG2 0x0a00 //數碼管位2顯示
#define CH451_DIG3 0x0b00 //數碼管位3顯示
#define CH451_DIG4 0x0c00 //數碼管位4顯示
#define CH451_DIG5 0x0d00 //數碼管位5顯示
#define CH451_DIG6 0x0e00 //數碼管位6顯示
#define CH451_DIG7 0x0f00 //數碼管位7顯示
#include <reg51.h>
//如果使用鍵盤中斷請定義
#define USE_KEY 1
#define uchar unsigned char
//須主程序定義的參數
sbit ch451_load=P1^2;
sbit ch451_din=P1^0;
sbit ch451_dclk=P1^1; //串行數據時鐘上升延激活
// 串行數據輸出,接CH451的數據輸入
//串行命令加載,上升延激活
sbit ch451_dout=P3^3; //INT1,鍵盤中斷和鍵值數據輸入,接CH451的數據輸出
uchar ch451_key; // 存放鍵盤中斷中讀取的鍵值
//*************************************************
//延時程序
void delay(){ //在12P下延時十毫秒
uchar i,j,k;
for(i=0;i<10;i++)
for(j=0;j<60;j++)
for(k=0;k<120;k++);
}
//初始化子程序
void ch451_init()
{ P1=0x60;
ch451_din=0;
ch451_dclk=1; //先低后高,選擇4線輸入
ch451_din=1;
ch451_load=1;
ch451_dout=1;
#ifdef USE_KEY
IT1=0; //設置下降沿觸發
IE1=0; //清中斷標志
PX1=0; //設置低優先級
EX1=1; //開中斷
#endif
}
//*****************************************************
//輸出命令子程序
//定義一無符號整型變量存儲12字節的命令字。
void ch451_write(unsigned int command)
{
unsigned char i;
#ifdef USE_KEY
EX1=0; //禁止鍵盤中斷
#endif
ch451_load=0; //命令開始
for(i=0;i<12;i++){ //送入12位數據,低位在前
ch451_din=command&1;
ch451_dclk=0;
command>>=1;
ch451_dclk=1; //上升沿有效
}
ch451_load=1; //加載數據
#ifdef USE_KEY
EX1=1;
#endif
}
#ifdef USE_KEY
//*************************************************
//輸入命令子程序,MCU從451讀一字節
unsigned char ch451_read()
{
unsigned char i;
unsigned char command,keycode; //定義命令字,和數據存儲器
EX1=0; //關中段
command=0x07; //輸入讀451命令字
ch451_load=0;
for(i=0;i<4;i++){
ch451_din=command&1; //送入最低位
ch451_dclk=0;
command>>=1; //往右移一位
ch451_dclk=1; //產生時鐘上升沿鎖通知CH451輸入位數據
}
ch451_load=1; //產生加載上升沿通知CH451處理命令數據
keycode=0; //清除keycode
for(i=0;i<7;i++){
keycode<<=1; //數據移入keycode,高位在前,低位在后
keycode|=ch451_dout; //從高到低讀入451的數據
ch451_dclk=0; //產生時鐘下升沿通知CH451輸出下一位
ch451_dclk=1;
}
IE1=0; //清中斷標志
EX1=1;
return(keycode); //反回鍵值
}
//*************************************************
//中斷子程序 使用中斷2,寄存器組1
void ch451_inter() interrupt 2 using 1
{
unsigned char i; //定義循環變量
unsigned char command,keycode; //定義控制字寄存器,和中間變量定時器
command=0x07; //讀取鍵值命令的高4位0111B
ch451_load=0; //命令開始
for(i=0;i<4;i++){
ch451_din=command&1; //低位在前,高位在后
ch451_dclk=0;
command>>=1; //右移一位
ch451_dclk=1; //產生時鐘上升沿鎖通知CH451輸入位數據
}
ch451_load=1; //產生加載上升沿通知CH451處理命令數據
keycode=0; //清除keycode
for(i=0;i<7;i++){
keycode<<=1; //數據作移一位,高位在前,低位在后
keycode|=ch451_dout; //從高到低讀入451的數據
ch451_dclk=0; //產生時鐘下升沿通知CH451輸出下一位
ch451_dclk=1;
}
ch451_key=keycode; //保存上次的鍵值
IE1=0; //清中斷標志
}
//***********************************************
#endif
//************************************************
void main(){
uchar a,b,c,d;
d=0;
ch451_init(); //調用初始化
ch451_write(0x403);
ch451_write(0x580); //測試送入命令
//ch451_write(CH451_DIG0|0X01); //最低位顯示1
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//while(1)
//{
ch451_write(CH451_DIG0|0x00);
delay();
ch451_write(0x301);
ch451_write(CH451_DIG0|0x01);
delay();
ch451_write(0x300);
ch451_write(CH451_DIG0|0x02);
delay();
ch451_write(0x300);
ch451_write(CH451_DIG0|0x03);
delay();
ch451_write(0x300);
ch451_write(CH451_DIG0|0x04);
delay();
ch451_write(0x300);
ch451_write(CH451_DIG0|0x05);
delay();
ch451_write(0x300);
ch451_write(CH451_DIG0|0x06);
delay();
ch451_write(0x300);
ch451_write(CH451_DIG0|0x07);
delay();
ch451_write(0x300);
ch451_write(CH451_DIG0|0x08);
delay();
ch451_write(0x300);
ch451_write(CH451_DIG0|0x09);
delay();
ch451_write(0x300);
//ch451_write(0x600);
//}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//等待中斷
/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
a=ch451_key;
ch451_key=0x0ff;
a&=0x3f;
b=a;
a/=10;
ch451_write(CH451_DIG1|a);
b%=10;
ch451_write(CH451_DIG0|b);
delay();
delay();
/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/
a=ch451_key;
d=a;
ch451_key=0x0ff;
ch451_write(0x300); //左移兩位
//ch451_write(0x300);
a&=0x3f; //顯示十進制數據
b=a;
a/=10;
ch451_write(CH451_DIG0|a);
b%=10;
ch451_write(CH451_DIG0|b);
delay();
c=ch451_read();
//while(c==d) //測試按鍵是否釋放
//{
//ch451_write(CH451_DIG0|b|0x80);
//delay();
//c=ch451_read();
//}
//ch451_write(CH451_DIG0|b);*/
}
//}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -