|
本帖最后由 2842687945 于 2014-10-26 20:48 編輯
/*******************利用定時(shí)器掃描讀取鍵碼*******************/
#include <reg52.h>
typedef unsigned int uint16;
typedef unsigned char uint8;
//定時(shí)器0的初始化
void time0(void)
{
TMOD = 0x01;//設(shè)置定時(shí)器0的工作方式為1
TH0 = 0xff;//定時(shí)10us定時(shí)器0的高位端
TL0 = 0xf6;//定時(shí)10us定時(shí)器0的低位端
ET0 = 1;//開啟定時(shí)器0中斷
TR0 = 1;//啟動(dòng)定時(shí)器0
EA = 1;//開啟總中斷
}
//矩陣鍵盤函數(shù)
void key_P1(void)
{
uint8 code led[] = {
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};//共陰數(shù)碼管的段碼
P1 = 0xef;//打開第一列
//第一列的鍵碼
switch(P1)
{
case 0xee:P0 = led[0];break;
case 0xed:P0 = led[1];break;
case 0xeb:P0 = led[2];break;
case 0xe7:P0 = led[3];break;
default :break;
}
P1 = 0xdf;//打開第二列
//第二列的鍵碼
switch(P1)
{
case 0xde:P0 = led[4];break;
case 0xdd:P0 = led[5];break;
case 0xdb:P0 = led[6];break;
case 0xd7:P0 = led[7];break;
default :break;
}
P1 = 0xbf;//打開第三列
//第三列的鍵碼
switch(P1)
{
case 0xbe:P0 = led[8];break;
case 0xbd:P0 = led[9];break;
case 0xbb:P0 = led[10];break;
case 0xb7:P0 = led[11];break;
default :break;
}
P1 = 0x7f;//打開第四列
//第四列的鍵碼
switch(P1)
{
case 0x7e:P0 = led[12];break;
case 0x7d:P0 = led[13];break;
case 0x7b:P0 = led[14];break;
case 0x77:P0 = led[15];break;
default :break;
}
}
//主函數(shù)
void main(void)
{
P1 = 0xff;//P1口的初始化
time0();//初始化
while(1)
{
}
}
//定時(shí)器0的子服務(wù)函數(shù)
void inti(void) interrupt 1
{
TH0 = 0xff;//重新賦值
TL0 = 0xf6;
key_P1();//調(diào)用矩陣鍵盤函數(shù)
}
|
|