/*矩阵键盘,程序的思路是先进行扫描,记录下行值,后列扫描,记录下列值,
然后根据行列的值确定按键
硬件: P2口接八段数码管的段位,P2[0:7] = SEG[A-G,DP]
P0口接键盘,即P0[0:7] = JP4[1-8]; 见原理图
*/
#include<reg51.h>
#define u8 unsigned char
#define u16 unsigned int
u8 code Digit[17] = {0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7D,0x07,0x7f,0x6f}; //只写了10,有点懒,就只说下面按键会有几个按下不显示
void DelayMs(u16 time)
{
u8 i=0;
for(;time>0;time--)
for(i=110;i>0;i--)
;
}
u8 KeyScan()
{
u8 Row=0xf0,Col=0x0f,Key=0;
P0 = 0xf0; //先扫描行
if ( P0 != 0xf0)
{
DelayMs(10);
if (P0 != 0xf0)
{
Row = P0 & 0xf0;
P0 = 0x0f;
Col = P0 & 0x0f; //扫描列
while((P0&0x0f)!=0x0f); //等待按键释放
}
}
if ((Row+Col)!=0xff) //表示有按键按下,也可以不判断
{
switch(Row+Col) //根据行列的值确定按键
{
case 0x77:Key = 1;break;
case 0x7B:Key = 2;break;
case 0x7D:Key = 3;break;
case 0x7E:Key = 4;break;
case 0xB7:Key = 5;break;
case 0xBB:Key = 6;break;
case 0xBD:Key = 7;break;
case 0xBE:Key = 8;break;
case 0xD7:Key = 9;break;
case 0xDB:Key = 10;break;
case 0xDD:Key = 11;break;
case 0xDE:Key = 12;
case 0xE7:Key = 13;break;
case 0xEB:Key = 14;break;
case 0xED:Key = 15;break;
case 0xEE:Key = 16;break;
}
}
return Key;
}
void main()
{
u8 key;
P2 = 0x00;
while(1)
{
key = KeyScan();
if (key)
{
P2 = Digit[key];
}
}
}
51单片机———矩阵键盘
最新推荐文章于 2023-07-14 17:10:27 发布