#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显示
#define CH451_KEY 0x0700 //读键盘代码
#include <reg51.h>
//如果使用键盘中断请定义
#define USE_KEY 1
#define uchar unsigned char
#define uint unsigned int
//须主程序定义的参数
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_keyzhi; // 存放键盘中断中读取的键值
uint code DigCode[8]={CH451_DIG0,CH451_DIG1,CH451_DIG2,CH451_DIG3,
CH451_DIG4,CH451_DIG5,CH451_DIG6,CH451_DIG7};
//共阴数码管编码表
uchar code DSYCode[18]={0x3F,0x06,0x5B,0x4F,//0,1,2,3
0x66,0x6D,0x7D,0x07,//4,5,6,7
0x7F,0x6F,0x77,0x7C,//8,9,A,b
0x39,0x5E,0x79,0x71,//C,d,E,F
0x40,0x00};//-,全灭
//键盘编码表
uchar code KeyCode[16]={0x40,0x41,0x42,0x43,//0,1,2,3
0x48,0x49,0x4A,0x4B,//4,5,6,7
0x50,0x51,0x52,0x53,//8,9,A,B
0x58,0x59,0x5A,0x5B};//C,D,E,F
//*************************************************
//延时程序
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
EA=1;
IT1=0; //设置下降沿触发
IE1=0; //清中断标志
PX1=0; //设置低优先级
EX1=1; //开中断
#endif
}
//*****************************************************
//输出命令子程序
//定义一无符号整型变量存储12字节的命令字。
void ch451_write(uint 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
//CH451显示一位数码管,DIG选择数码管,要显示的数据,
void CH451_DisplayDig(uchar DIG,uchar Data,uchar Point){
if(Point==1){
ch451_write(DigCode[DIG]|(DSYCode[Data]|0x80));
}else{
ch451_write(DigCode[DIG]|DSYCode[Data]);
}
}
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_keyzhi=keycode; //保存上次的键值
IE1=0; //清中断标志
}
//***********************************************
#endif
//************************************************
void main()
{
uchar a,b,c,d;
d=0;
ch451_init(); //调用初始化
ch451_write(0x403);
ch451_write(0x580); //测试送入命令
ch451_keyzhi=0x0ff;
ch451_write(CH451_KEY);
CH451_DisplayDig(CH451_DIG0,ch451_keyzhi,1);
}
一周热门 更多>