51单片机中如何用矩阵键盘控制数码管
时间: 2023-05-25 17:04:36 浏览: 383
使用51单片机控制矩阵键盘控制数码管的步骤如下:
1. 定义矩阵键盘和数码管的引脚。
2. 初始化硬件和软件。
3. 在主函数中循环扫描矩阵键盘输入。
4. 如果检测到按键按下,读取按键的键值。
5. 根据读取到的按键键值进行数码管的控制操作。
6. 循环结束后关闭硬件。
示例代码:
```c
#include <reg51.h>
sbit ROW1=P0^0;
sbit ROW2=P0^1;
sbit ROW3=P0^2;
sbit ROW4=P0^3;
sbit COL1=P0^4;
sbit COL2=P0^5;
sbit COL3=P0^6;
sbit COL4=P0^7;
sbit dula = P2^6;
sbit wela = P2^7;
sbit beep = P2^3;
unsigned char code duan_ma[]= { //数码管0~F的值
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
void delay(unsigned int i) //延时函数
{
while(i--);
}
void DigDisplay(unsigned char first, unsigned char second) //数码管显示函数
{
unsigned char i;
for(i=0;i<2;i++)
{
if(i==0)
{
dula=1; //打开第一个数码管
P0=duan_ma[first];
delay(100); //延时一段时间
dula=0;
}
if(i==1)
{
wela=1; //打开第二个数码管
P0=duan_ma[second];
delay(100); //延时一段时间
wela=0;
}
}
}
unsigned char KeyScan() //键盘扫描函数
{
unsigned char keyvalue=0xff;
ROW1=0; ROW2=1; ROW3=1; ROW4=1; //扫描第一行
if(COL1==0){keyvalue=0x01;}
if(COL2==0){keyvalue=0x02;}
if(COL3==0){keyvalue=0x03;}
if(COL4==0){keyvalue=0x0c;}
ROW1=1; ROW2=0; ROW3=1; ROW4=1; //扫描第二行
if(COL1==0){keyvalue=0x04;}
if(COL2==0){keyvalue=0x05;}
if(COL3==0){keyvalue=0x06;}
if(COL4==0){keyvalue=0x0d;}
ROW1=1; ROW2=1; ROW3=0; ROW4=1; //扫描第三行
if(COL1==0){keyvalue=0x07;}
if(COL2==0){keyvalue=0x08;}
if(COL3==0){keyvalue=0x09;}
if(COL4==0){keyvalue=0x0e;}
ROW1=1; ROW2=1; ROW3=1; ROW4=0; //扫描第四行
if(COL1==0){keyvalue=0x0a;}
if(COL2==0){keyvalue=0x00;}
if(COL3==0){keyvalue=0x0b;}
if(COL4==0){keyvalue=0x0f;}
return keyvalue;
}
void main()
{
unsigned char first=0,second=0;
while(1)
{
unsigned char keyvalue = KeyScan(); //扫描键盘输入
if(keyvalue != 0xff) //如果检测到按键按下
{
if(keyvalue>=0x00 && keyvalue<=0x0f)
{
if(first == 0 && second == 0)
{
first = keyvalue;
}
else if (first!=0 && second==0)
{
second = keyvalue;
}
DigDisplay(first,second); //更新数码管的显示
}
}
delay(500); //延时一段时间后循环继续
}
}
```
该示例代码将矩阵键盘输入映射到数码管的显示。当按键按下时,首先将键值存储在first或者second变量中,当first和second变量中都有值时,将两个变量的值传递给数码管的显示函数进行更新。
阅读全文