📄 ch451sa.c
字号:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#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显示 //串行命令加载,上升延激活
sbit ch451_dclk=P1^6; //串行数据时钟上升延激活
sbit ch451_din=P1^5; // 串行数据输出,接CH451的数据输入
sbit ch451_load0=P2^4; //数码管显示芯片片选
sbit ch451_load1=P2^5; //键盘和LED控制芯片片选
uchar ch451_key;
sbit ch451_dout=P3^3; //键盘中断输出
sbit sy=P1^7; //蜂鸣器控制,高时输出声音
uchar flag; //中断标志
typedef unsigned char byte; //按键定义
//CH451初始化
void ch451_init()
{
ch451_din=0;
ch451_din=1;
ch451_load0=1;
ch451_load1=1;
IT1=0; //设置下降沿触发
IE1=0; //清中断标志
PX1=0; //设置低优先级
EX1=1; //开中断
EA=1; //开启CPU中断
sy=0; //初始化
}
void ch451_write(unsigned int command)
{
uchar i;
EX1=0; //禁止键盘中断
ch451_load0=0; //命令开始
for(i=0;i<12;i++){ //送入12位数据,低位在前
ch451_din=command&1;
ch451_dclk=0;
command>>=1;
ch451_dclk=1; //上升沿有效
}
ch451_load0=1;
EX1=1;
}
//输入命令子程序,MCU从451读一字节
unsigned char ch451_read()
{
unsigned char i;
unsigned char command,keycode; //定义命令字,和数据存储器
EX1=0; //关中段
command=0x07; //输入读451命令字
ch451_load1=0;
for(i=0;i<4;i++){
ch451_din=command&1; //送入最低位
ch451_dclk=0;
command>>=1; //往右移一位
ch451_dclk=1; //产生时钟上升沿锁通知CH451输入位数据
}
ch451_load1=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); //反回键值
}
//键盘扫描和LED显示驱动芯片另外一片CH451的数据写入
void ch451_write1(unsigned int command)
{
uchar i;
EX1=0; //禁止键盘中断
ch451_load1=0; //命令开始
for(i=0;i<12;i++){ //送入12位数据,低位在前
ch451_din=command&1;
ch451_dclk=0;
command>>=1;
ch451_dclk=1; //上升沿有效
}
ch451_load1=1;
EX1=1;
}
//*************************************************
//中断子程序 使用中断2,寄存器组1
void ch451_inter() interrupt 2 using 1
{
flag=1; //按键输入置位
IE1=0; //清中断标志
}
void keysmiao(byte k)
{
switch(k)
{
case 0x68:ch451_write(CH451_DIG3|0xed) ;break; //0
case 0x6c:ch451_write(CH451_DIG3|0x84) ;break; //1
case 0x6b:ch451_write(CH451_DIG3|0xd9) ;break; //2
case 0x6a:ch451_write(CH451_DIG3|0xdc) ;break;//3
case 0x74:ch451_write(CH451_DIG3|0x7d) ;break; //6
case 0x73:ch451_write(CH451_DIG3|0xc4) ;break; //7
case 0x72:ch451_write(CH451_DIG3|0xfd) ;break; //8
case 0x7c:ch451_write(CH451_DIG7|0xed) ;break;//0
case 0x7b:ch451_write(CH451_DIG6|0x84) ;break;//1
case 0x7a:ch451_write(CH451_DIG5|0xd9) ;break;//2
case 0x69:ch451_write(CH451_DIG3|0xb4) ;break; //4
case 0x70:ch451_write(CH451_DIG3|0x7c) ;break; //5
case 0x71:ch451_write(CH451_DIG3|0xfc) ;break; //9
case 0x78:ch451_write(CH451_DIG3|0xf5) ;break; //a
case 0x79:ch451_write(CH451_DIG4| 0xdc) ;break;
case 0x61:ch451_write(CH451_DIG3|0x3d) ;break; //b
case 0x64:ch451_write(CH451_DIG3|0x19) ;break; //c
case 0x60:ch451_write(CH451_DIG3|0x9d) ;break; //d
default: break;
}
}
void main(void)
{
uchar r1;
byte k;
ch451_init();
ch451_write(CH451_RESET);
ch451_write(CH451_SYSON1);
ch451_write(CH451_DSP);
ch451_write1(CH451_RESET);
ch451_write1(CH451_SYSON2);
ch451_write1(CH451_DSP);
while(1)
{ if(flag==1) //有键按下?
{ flag=0;
k=ch451_read();
do{r1=ch451_read();}while(r1&0x40);
keysmiao(k);
}
else
{
ch451_write(CH451_DIG0|0xfd);
}
}
} //加载数据
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -