📄 键盘模块.c
字号:
#include <STC12C5410AD.h>
#define uchar unsigned char
sbit list_1=P1^2;
sbit list_2=P1^1;
uchar KeyTemp;
void initial_232()
{
TMOD=0x01;
TH0=(65536-50000)/256;//装初值,定时时间是200us
TL0=(65536-50000)%256;
TR0=1; //启动T0
ET0=1; //允许T0中断
EA=1;//中断开
}
void delay(uchar z)//z等于3时大约是1ms
{
uchar i,j;
for(i=z;i>0;i--)
for(j=100;j>0;j--);
}
uchar KeyScan()
{ uchar key=0;
uchar temp;
P2=0xff;
list_1=0;
list_2=0;
if(P2!=0xff)//如果有键按下
{
delay(30);
list_1=1;
list_1=0;//扫描第一行
if(P2!=0xff)//确实有键按下
{
temp=P2&0xff;
switch(temp)
{
case 0xfe:
key=1;break;
case 0xfd:
key=2;break;
case 0xfb:
key=3;break;
case 0xf7:
key=4;break;
case 0xef:
key=5;break;
case 0xdf:
key=6;break;
case 0xbf:
key=7;break;
case 0x7f:
key=8;break;
}
}
list_1=0;
list_1=1;//扫描第二行
if(P2!=0xff)//确实有键按下
{
temp=P2;
switch(temp)
{
case 0xfe:
key=9;break;
case 0xfd:
key=10;break;
case 0xfb:
key=11;break;
case 0xf7:
key=12;break;
case 0xef:
key=13;break;
case 0xdf:
key=14;break;
case 0xbf:
key=15;break;
case 0x7f:
key=16;break;
}
}
}
return(key); //返回键值
}
uchar key_free()//等待按键释放程序
{
uchar key_value;
key_value=KeyScan();//取扫描到的键值
P2=0xff;//置列线全为低电平
list_1=0;
list_2=0;//行线全为高电平
while(P2!=0xff)
{
}
return(key_value);//返回键值
}
void key_deal(uchar temp)//键处理程序
{
switch(temp)
{
case 1:
P1=0xfe;
break;
case 2:
P1=0xfd;
break;
case 3:
P1=0xfb;
break;
case 4:
P1=0xf7;
break;
case 5:
P1=0xef;
break;
case 6:
P1=0xdf;
break;
case 7:
P1=0xbf;
break;
case 8:
P1=0x7f;
break;
case 9:
P1=0xee;
break;
case 10:
P1=0xed;
break;
case 11:
P1=0xeb;
break;
case 12:
P1=0xe7;
break;
case 13:
P1=0xde;
break;
case 14:
P1=0xbe;
break;
case 15:
P1=0x7e;
break;
case 16:
P1=0x00;
break;
default:
break;
}
}
//主函数
void main()
{
initial_232();
while(1)
{
}
}
void timer0() interrupt 1
{
TR0=0;
KeyTemp=KeyScan();
if(KeyTemp!=0)
{
key_free();//按键释放
key_deal(KeyTemp);//键处理程序
}
TH0=(65536-50000)/256;//装初值,定时时间是200us
TL0=(65536-50000)%256;
TR0=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -