T0定时器中断延时,矩阵键盘扫描(线反转法)
/*********************************
功能描述:T0定时器中断法,矩阵键盘扫描(线反转法)。
返回值:key键值为1-16,出错码为0。
*********************************/
#include<reg52.h> /*头文件*/
unsigned char keydelay; /*keydelay按键持续ms数; */
bit nkey,okey; /*按键(新/旧)状态*/
void main()
{
TMOD=0x01; /*T0工作方式1*/
TH0=0xfc; /*T0装载初值,定时1ms*/
TL0=0x18;
EA=1; /*开中断*/
ET0=1;
TR0=1; /*启动T0*/
while (1)
{
/*以下为键值计算核心*/
if (nkey!=okey) /*按键的新旧状态不相等?*/
{
okey=nkey; /*把当前按键状态保存起来*/
if (nkey&&(P3!=0x0f)) /*按键是否按下,没有松开?*/
{
unsigned char keyX,keyY,key; /*keyX按键行坐标;keyY按键列坐标;key按键键值*/
keyX=P3&0x0f; /*开始用线反转法计算键值*/
P3=0xf0;
keyY=P3&0xf0;
key=keyX|keyY;
switch (key)
{
case 0xee: key=1;
break;
case 0xde: key=2;
break;
case 0xbe: key=3;
break;
case 0x7e: key=4;
break;
case 0xed: key=5;
break;
case 0xdd: key=6;
break;
case 0xbd: key=7;
break;
case 0x7d: key=8;
break;
case 0xeb: key=9;
break;
case 0xdb: key=10;
break;
case 0xbb: key=11;
break;
case 0x7b: key=12;
break;
case 0xe7: key=13;
break;
case 0xd7: key=14;
break;
case 0xb7: key=15;
break;
case 0x77: key=16;
break;
default: key=0; /*出错码*/
break;
}
P1=key; /*P1流水灯显示按键值*/
}
}
}
}
void Time0 () interrupt 1 /*T0中断服务程序*/
{
TH0=0xfc; /*T0装初值定时1ms*/
TL0=0x18;
/**************************中断法检测按键代码:开始**************************/
P3=0x0f; /*线反转法*/
if (P3!=0x0f) /*判断按键按下?*/
{
keydelay++; /*按键按下持续时间++,单位ms*/
if (keydelay>=15) /*按键按下等于15ms,则认为按键按下*/
{
keydelay=0; /*清零*/
nkey=1; /*按键已按下*/
}
}
else
{
keydelay=0;
nkey=0;
}
/**************************中断法检测按键代码:结束**************************/
}
谢谢分享谢谢分享
