#include<reg51.h> //頭文件
#define uchar unsigned char //宏定義 uchar代替unsigned char
#define uint unsigned int //宏定義 uint 代替unsigned int
#define SCANPORT P1 //宏定義SCANPORT代替P1口
sbit spk=P3^0; //P3.0蜂鳴器輸出
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,
0x71}; //數組顯示0~F
uchar uca_LineScan[4]={0xEF,0xDF,0xBF,0x7F}; //數組定義4顯示
uchar ucKeyScan()
{
uchar Temp=0;
uchar ucRow=0,ucLine=0;
for(ucLine=0;ucLine<4;ucLine++) //循環4次
{
SCANPORT=uca_LineScan[ucLine]; //每次循環時P1依次顯示數組uca_LineScan的4個數字
Temp=SCANPORT & 0x0F; //P1高4位清零,低四位不變。并把此值賦給Temp
if(Temp!=0x0F) //如果有按鍵按下,低四位會變化,進入IF語句
{
switch(Temp) //4個按鍵按下ucRow顯示不同的值
{
case 0x0E: ucRow=10;break;
case 0x0D: ucRow=20;break;
case 0x0B: ucRow=30;break;
case 0x07: ucRow=40;break;
default: ucRow=50;break;
}
break;
}
}
SCANPORT=0x0F; //P01高4位清零,使他不影響下次的按鍵顯示
return ucRow+ucLine+1; //3個數相加,按鍵按下 (沒有電路圖),可能是這個數字,僅寫出第一次循環的數字,共4次循環,
0001 0000+0000 0000+0000 0001=0x11
0010 0000+0000 0000+0000 0001=0x21
0011 0000+0000 0000+0000 0001=0x31
0100 0000+0000 0000+0000 0001=0x41
(。。。0x12,0x22,0x32,0x42
......
.... )
}
void vKeyProcess(unsigned char ucKeyCode)
{
switch(ucKeyCode) 顯示一個數字,蜂鳴器響
{
case 11:P0=table[0];spk=1;break; //'7'
case 12:P0=table[1];spk=1;break; //'8'
case 13:P0=table[2];spk=1;break;
case 14:P0=table[3];spk=1;break;
case 21:P0=table[4];spk=1;break; //'4'
case 22:P0=table[5];spk=1;break; //'5'
case 23:P0=table[6];spk=1;break;
case 24:P0=table[7];spk=1;break;
case 31:P0=table[8];spk=1;break; //'1'
case 32:P0=table[9];spk=1;break; //'2'
case 33:P0=table[10];spk=1;break;
case 34:P0=table[11];spk=1;break;
case 41:P0=table[12];spk=1;break; //'3'
case 42:P0=table[13];spk=1;break;
case 43:P0=table[14];spk=1;break; //'0'
case 44:P0=table[15];spk=1;break; //'+'
default:break;
}
}
void main()
{
spk=0;
P0=0;
while(1)
{
vKeyProcess(ucKeyScan()); //進入顯示子程序
spk=0; //關閉蜂鳴器
}
}
|