|
//-----------------------------------------------------------------
// 名称: 数码管显示4×4 键盘矩阵按键序号
//-----------------------------------------------------------------
// 说明: 按下任意一按键时,数码管会显示它在键盘矩阵上的序号0 - F,
// 扫描程序首先判断按键发生在哪一列,然后根据所发生的行附加
// 不同的值,从而得到键盘按键序号.
//
//-----------------------------------------------------------------
#include <reg51.h>
#define INT8U unsigned char
#define INT16U unsigned int
//0~F的共阳数码管段码,最后一个是黑屏
const INT8U SEG_CODE[] =
{ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF
};
sbit BEEP = P3^0;
//上次按键和当前按键序号,该矩阵中序号范围为0-15,0xFF表示无按键
INT8U pre_KeyNo=0xff,Key_No=0xff;
//-----------------------------------------------------------------
// 延时函数
//-----------------------------------------------------------------
void delay_ms(INT16U x)
{
INT8U t; while(x--) for(t = 0; t < 120; t++);
}
//-----------------------------------------------------------------
// 键盘矩阵扫描子程序
//-----------------------------------------------------------------
void Keys_Scan()
{ // 高4位置0,放入4行,扫描4列
P1=0x0f; delay_ms(1);
if(P1 == 0x0f) {Key_No=0xff;return;} //无按键时提前返回
//判断发生在第几列
switch(P1)
{
case 0x0e: Key_No =0; break; //0列
case 0x0d: Key_No =1; break; //1列
case 0x0b: Key_No =2; break; //2列
case 0x07: Key_No =3; break; //3列
default: Key_No=0xff; return; //无键按下,提前返回;
}
// 低4位置0,放入4列,扫描4行
P1=0xf0; delay_ms(1);
if(P1 == 0x0f) {Key_No=0xff;return;}
//判断发生在第几行
//对0~3行分别赋初值0,4,8,12
switch(P1)
{
case 0xe0: Key_No +=0; break; //0行
case 0xd0: Key_No +=4; break; //1行
case 0xb0: Key_No +=8; break; //2行
case 0x70: Key_No +=12; break; //3行
default: Key_No=0xff; //无键按下
}
}
//-----------------------------------------------------------------
// 蜂鸣器子程序
//-----------------------------------------------------------------
void Beep()
{
INT8U i;
for(i=0;i<100;i++){delay_ms(1); BEEP = ~BEEP;}
BEEP=1;
}
//-----------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
void main()
{
P0=0xff; //初始关数码管
while(1)
{
Keys_Scan(); //扫描键值
if(Key_No == 0xff){delay_ms(10); continue;}
//显示键值,蜂鸣器提示
P0=SEG_CODE[Key_No];Beep();
//未释放等待
while(Keys_Scan(), Key_No != 0xff);//这句话怎么理解??while()语句里还可以放函数??
}
}
//最后一句语句怎么理解??while()语句里还可以放函数?? 逗号??
//最后一句语句怎么理解??while()语句里还可以放函数?? 逗号??
//最后一句语句怎么理解??while()语句里还可以放函数?? 逗号??
|
|