📄 51
字号:
//-----------------------函数声明,变量定义---------------------------
#include <reg51.h> //头文件
#include <absacc.h> //XBYTE 宏定义
#define uchar unsigned char//类型定义
#define uint unsigned int //类型定义
#define com XBYTE[0x7f00] //8155命令状态寄存器地址
#define pa XBYTE[0x7f01] //8155的A口地址
#define pb XBYTE[0x7f02] //8155的B口地址
#define pc XBYTE[0x7f03] //8155的C口地址
#define LED1 P1 //键号十位显示数码管驱动口
#define LED2 P2 //键号个位显示数码管驱动口
sbit iom=P1^7; //8155的I/O与RAM选择端口
const uchar tab[]={ //7段共阳极数码管的段选码表
0xc0,0xf9,0x24,0x30, //0~3
0x19,0x12,0x02,0x78, //4~7
0x00,0x18,0x08,0x03, //8~b
0x46,0x21,0x06,0x0e, //c~f
0x7f // 数码管灭
};
//-----------------------函数声明------------------------------------
bit press(void); //判断是否有键按下,有返回1,没有返回0
uchar read(void); //扫描键盘,返回键值
uchar show(uchar row); //显示键号
void delay_50us(uint m); //延时子程序
//****************************//
main()
{
uchar row3;
iom=1; //8155的IO定义
com=0x0c; //8155 C口设置为输出口,A口设置为输入口
while(1)
{
row3=read(); //读按键号
show(row3); //显示键号
while(press()); //等待键释放
delay_50us(50); //延时,防止数码管闪烁
}
}
bit press(void)
{
uchar hang;
pc=0x00; //4行输出全‘0’
hang=pa; //读A口数据 列号
if(hang!=0xff) //看是否不全为高电平
return(1); //有低电平时,表示有键按下,返回1
else
return(0); //全为高电平时,表示无键按下,返回0
}
uchar read(void)
{
uint t;
uchar hang,lie,keyscan,j,value;
value=0x00;
if(press()==1)
{
delay_50us(200); //延时去抖
if(press()==1)
{
hang=0xfe; //输出监测行号赋初值,监测第1行
//****************逐行扫描开始****************//
for(t=0;t<4;t++) //逐行监测循环
{
pc=hang; //输出行监测码
lie=pa; //读列号段码,有键按下的位为0
if(lie!=0xff) //如果不为全1,表示该行有键按下
//****************计算键号开始****************//
for(j=0;j<8;j++) //看是8列中的哪列有键按下
{
if((lie&0x01)!=0x01) //是第j列吗
{ //是
keyscan=j+value; //列号+行号×8=键号
return(keyscan); //返回键号
}
else //不是
{
lie>>=1; //列段码右移,继续监测最低位
}
}
//****************计算键号结束****************//
else //否则,该行无键按下准备监测下一行
{
hang=(hang<<1)|0x01; //行监测码左移
value+=0x08; //每监测一行无键按下时,键号加8
}
}
//****************逐行扫描结束****************//
}
return(0xff);
}
return(0xff); //无键按下时,返回FFH
}
uchar show(uchar row)
{
uchar row1,row2;
if(row==0xff) //无键按下时
{
LED1=tab[16]; //2个数码管灭
LED2=tab[16];
}
else
{ //有键按下
row1=row/10; // 16进制键号除以10,得十位
row2=row%10; // 16进制键号对10求余数,得个位
LED1=tab[row1]; //显示十位
LED2=tab[row2]; //显示个位
}
}
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -