📄 irqkeyread.c
字号:
#include<reg51.h>
#include<intrins.h>
#include"ch451.h"
LEDDisplay(char MODE,uint data1)
{
uint i;
void WriteCh451(uint da);
void Delay();
WriteCh451(CH451_SYSON2);
WriteCh451(CH451_BCD);
if(MODE==0) //突发显示
{
if(1) //如果条件成立时显示
WriteCh451(data1);
}
if(MODE==1) //定周期显示
{
for(i=0;i<10000;i++); //定时周期
WriteCh451(data1);
}
}
void WriteCh451(uint da)
{
uint i;
EX1=0; //关闭键盘中断
CH451_LOAD=0; //复位LOAD信号
for(i=0;i<12;i++)
{
if((da&0x1)==1)
CH451_DIN=1;
else
CH451_DIN=0;
CH451_DCLK=0;
da>>=1;
CH451_DCLK=1; //上升沿读取数据
}
CH451_LOAD=1; //加载数据
Delay();
EX1=1; //打开键盘中断
}
void Delay()
{
_nop_();
_nop_();
}
uint ReadCh451()
{
uchar i;
uchar cmd ,keycode;
EX1=0; //禁止键盘中断
cmd=0x07; //获取按键值
CH451_LOAD=0;
for(i=0;i<4;i++)
{
if((cmd&0x1)==1)
CH451_DIN=1;
else
CH451_DIN=0;
CH451_DCLK=0;
cmd>>=1;
CH451_DCLK=1;
}
CH451_LOAD=1;
keycode=0;
for(i=0;i<7;i++)
{
keycode<<=1; //数据移入keycode
keycode|=CH451_DOUT;//从高到低读入451的数据
CH451_DCLK=0; //时钟下降沿通知ch451输出下一位
Delay();
CH451_DCLK=1;
}
IE=0; //清除中断标志
EX1=1;
return(keycode);
}
void IRQKeyRead() interrupt 2
{
uchar key;
uchar key0,key1;
key=ReadCh451();
key=key&0x3f;
key0=key/10;
key1=key%10;
if(key0!=0)
LEDDisplay(0,CH451_DIG1|key0);
else
LEDDisplay(0,CH451_DIG1|0x10);
LEDDisplay(0,CH451_DIG0|key1);
}
void InitSys()
{
EA=1;
//LEDDisplay(0,CH451_DSP);
WriteCh451(CH451_SYSON2);
WriteCh451(CH451_BCD);
EX1=1;
}
void main()
{
LEDDisplay(0,0x0800);
LEDDisplay(0,0x0900);
LEDDisplay(0,0x0a00);
LEDDisplay(0,0x0b00);
LEDDisplay(0,0x0c00);
LEDDisplay(0,0x0d00);
LEDDisplay(0,0x0e00);
LEDDisplay(1,0x0f00);
for(;;)
{
InitSys();
while(0);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -