|
#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8; // 重命名類型u8簡(jiǎn)化代碼編寫(xiě)
typedef unsigned int u16;
#define KEY_PORT P1 // 矩陣按鍵接在P1端口
#define DIG_PORT P0 // 共陰極數(shù)碼管接P0端口
sbit gA = P2^2;
sbit gB = P2^3;
sbit gC = P2^4;
sbit S15 = P3^2;
sbit gBuz = P1^5; // 蜂鳴器接P1^5接口
unsigned char code gDuanMa[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay10ms(void);
u8 KeyScan(void);
void KeyValueDisplay(u8 val);
void BuzzerOnOff(u8 beep);
void delay1ms(void);
void main(void)
{
u8 key = 0; // 實(shí)時(shí)獲取的掃描鍵值
u8 key1 = 0; // 有按鍵情況下更新后的鍵值
u8 beep = 0;
while (1)
{
key = KeyScan();
if (key != 0) // 有按鍵按下
{
key1 = key; // 有按鍵則更新鍵值數(shù)值
beep = 1;
}
KeyValueDisplay(key1);
BuzzerOnOff(beep);
}
}
u8 KeyScan(void)
{
u8 val = 0;
KEY_PORT = 0x0f; // P1.0-1.3輸出高電平,P1.4-P1.7輸出低電平
if (KEY_PORT != 0x0f) // 讀取KEY_PORT看是否有按鍵按下
{
delay10ms(); // 延時(shí)消抖
if (KEY_PORT != 0x0f) // 確認(rèn)確實(shí)有按鍵按下
{
// 先確定按鍵發(fā)生在第幾列
switch (KEY_PORT)
{
case 0x07 : val = 1; break;
case 0x0b : val = 2; break;
case 0x0d : val = 3; break;
case 0x0e : val = 4; break;
default : break;
}
// 再確定按鍵發(fā)生在第幾行
KEY_PORT = 0xf0;
switch (KEY_PORT)
{
case 0x70: val = val + 0; break;
case 0xb0: val = val + 4; break;
case 0xd0: val = val + 8; break;
case 0xe0: val = val + 12; break;
}
return val;
}
}
return 0;
}
void BuzzerOnOff(beep)
{
if(beep == 1)
{
gBuz = 1;
delay1ms();
gBuz = 0;
delay1ms();
}
else gBuz=0;
}
void delay10ms(void) //誤差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void delay1ms(void) //誤差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void KeyValueDisplay(u8 val)
{
gA = 1; gB = 1; gC = 1; // 位選數(shù)碼管0
DIG_PORT = gDuanMa[val / 10];
delay10ms(); // 間隔一段顯示時(shí)間
DIG_PORT = 0x00; // 消隱
gA = 0; gB = 1; gC = 1;
DIG_PORT = gDuanMa[val % 10];
delay10ms(); // 間隔一段顯示時(shí)間
DIG_PORT = 0x00; // 消隱
}
|
|