📄 4x4key.c
字号:
//-----------------------------------------------------------------
// 名称: 数码管显示4×4 键盘矩阵按键序号
//-----------------------------------------------------------------
// 说明: 本例运行时,数码管会显示所按下的任意按键在键盘矩阵上的位置.
// 扫描程序首先判断按键发生在哪一列,然后判断按键发生在哪一行,
// 由列号和行号即可得到键盘按键序号.
//
//-----------------------------------------------------------------
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
//=============================
void delay_ms(uint k) //毫秒级的延时子函数
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<1140;j++)
;
}
}
#define BEEP() PORTD ^= BIT(PD7) //蜂鸣器
//0-9,A-F的数码管段码
const uchar SEG_CODE[] =
{
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71
};
//当前按键序号,该矩阵中序号范围为0-15,16表示无按键
uchar KeyNo = 16 ;
//-----------------------------------------------------------------
// 判断键盘矩阵是否有键按下
//-----------------------------------------------------------------
uchar KeyMatrix_Down()
{
//高4位输出,低4位输入,高4位先置0,放入4行
DDRB=0xF0;
PORTB=0x0F;
delay_ms(2);
return PINB !=0x0F? 1:0; //如PINB为0x0F,则return 1 ,否则return 0
}
//-----------------------------------------------------------------
// 键盘矩阵扫描子程序
//-----------------------------------------------------------------
void Keys_Scan()
{
//按键后00001111将变成0000XXXX,X中有1个为0,3个仍为1
//下面判断按键发生于0~3列中的哪一列
switch(PINB)
{
case 0B00001110: KeyNo=0;break;
case 0B00001101: KeyNo=1;break;
case 0B00001011: KeyNo=2;break;
case 0B00000111: KeyNo=3;break;
default:KeyNo=0xFF;
}
//反转键盘,高4位输入,低4位输出,低4位先置0,放入4列
DDRB=0x0F;
PORTB=0xF0;
delay_ms(2);
//下面对0~3行分别附加起始值0、4、8、12
switch(PINB)
{
case 0B11100000: KeyNo +=0;break;
case 0B11010000: KeyNo +=4;break;
case 0B10110000: KeyNo +=8;break;
case 0B01110000: KeyNo +=12;break;
default:KeyNo=0xFF;
}
}
//-----------------------------------------------------------------
// 蜂鸣器子程序
//-----------------------------------------------------------------
void Beep()
{
uchar i;
for(i=0;i<100;i++)
{
delay_ms(2);
BEEP();
}
}
//-----------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
int main()
{
//配置数码管显示端口
DDRC=0xFF;
PORTC=0x00;
while(1)
{
//如果键盘矩阵有键按下则扫描键值
if(KeyMatrix_Down()) Keys_Scan();
else continue;
if(KeyNo<16) //得到有效值
{
PORTC=SEG_CODE[KeyNo]; //显示键值
Beep(); //响铃
}
while(KeyMatrix_Down());
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -