📄 keyborad2.c
字号:
#include <REGX51.H>
#include <absacc.h>
#include <Key.h>
#define uchar unsigned char
#define CTRL XBYTE[0x0100] /*控制字地址*/
#define PA XBYTE[0x0101] /*PA口地址*/
#define PB XBYTE[0x0102] /*PB口地址*/
#define PC XBYTE[0x0103] /*PC口地址*/
code uchar cod[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6D,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//字段码
uchar keyscan(void)
{
code uchar keycod[16]={0,0,0,0,
0,0,0,1, //算法为:retVal=keycod[x]*4+keycod[y]
0,0,0,2,
0,3,4,0};
uchar x,y,retVal;
PB=0x0f; //低四位 高四位输出0
x=PB&0x0f; //PB输入后清高四位,作为X值
PB=0xf0; //高四位 低四位输出0
y=(PB>>4)&0x0f; //PB输入后移位到低四位,并清高四位
retVal=keycod[x]*4+keycod[y]; //根据公式倒算键盘编码
if(retVal==0) return(0);
else return(retVal-4);
}
void timer0int(void) interrupt 1
{
static uchar sts=0 ;
TL0=-20000; //方式1为软件重载
TH0=(-20000)>>8; //右移8位,实际上是取高8位
PB=0x00; //输入引脚为高电平
switch(sts)
{
case 0:if(keyscan()!=0) sts=1;break; //按键则进入状态1
case 1:
if(keyscan()==0) sts=0; //假按错,或干扰,回状态0
else{sts=2;keyPut(keyscan);} //确按键,键值进入队列,并转状态2
break;
case 2:if(keyscan()==0) sts=3;break; //如果松键则转状态3
case 3:
if(keyscan()!=0) sts=2; //假松键回状态2
else sts=0; //真松键,回状态0,等待下一次按键过程
}
}
main()
{
//uchar i;
CTRL=0x0d; //控制口,AC均为输出,B为输入
TMOD=(TMOD&0xf0)|0x01;
TL0=-20000;
TH0=(-20000)>>8;
TR0=1; //允许T0开始计数
ET0=1; //允许T0记计数溢出时产生中断
EA=1; //允许cpu响应中断
while(1)
{
if(keyHit()!=0) // 如果队列中有按键
//PA=1; // 段码输出
PC=cod[keyGet()]; //从队列中取出按键值并且显示在数码管上
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -