数码管显示键盘符号
delayms(1);
//有键按下后,其中一列将变为低电平
i = P1^0x0f;
//判断按键发生在哪一列
switch(i)
{
case 1: keyno = 0;break;
case 2: keyno = 1;break;
case 4: keyno = 2;break;
case 8: keyno = 3;break;
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};
//上次按键和当前按键序号,该矩阵中序号范围0-15,16表示无按键
unsigned char pre_keyno = 16,keyno = 16;
//延时函数
void delayms(unsigned int x)
2.在Keil中新建工程,添加C51文件,设置生成Hex文件。
具体的程序如下:
#include <reg51.h>
//数码管段码表,共阳极段码表,实际电路用的共阴极数码管
unsigned char code disp_buff[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
{
unsigned char i;
while(x--)
{
for(i = 0;i < 120;i++);
}
}
//按键扫描函数,首先判断按键发生在那一列,然后根据所发生的行附加不同的值,从而得到键盘按键序号
void key_scan(void)
{
unsigned char i;
//高4位置1,放入4行
P1 = 0x0f;
课程名称
单片机原理及应用
实验名称
数码管显示4*4矩阵键盘按键号
实验内容:
按下任意键时,数码管都会显示其按键的序号,扫描程序首先判断按键发生在那一列,然后根据所发生的行附加不同的值,从而得到按键的序号。
实验步骤:
1.根据以下电路图,在Proteus中找到相应元器件并接线。
元器件:AT89C51、button、cap、res、sounder、respack-8、7SEG-COM-BLUE、CRYSTAL,分别放入开关、红色LED灯、电阻。
case 4: keyno += 8;break;
case 8: keyno += 12;break;
}
}
//主函数
void main(void)
{
P0 = 0x00;
while(1)
{
P1 = 0xf0;
if(P1 != 0xf0) //扫描键盘获得按键序号
{
key_scan();}源自if(pre_keyno != keyno)
{
P0 = ~disp_buff[keyno]; //显示,共阳极段码取反作为共阴极段码
pre_keyno = keyno;
}
delayms(100);
}
}
实验效果:
当按下K1时,数码管显示数字1:
当按下KF时,数码管显示字符F:
default: keyno = 16; //无键按下
}
//低四位置1,放入4列
P1 = 0xf0;
delayms(1);
//
i = P1 >> 4 ^ 0x0f;
//对0-3行分别附件起始值
switch(i)
{
case 1: keyno += 0;break;
case 2: keyno += 4;break;