矩阵键盘用计算器来显示,来控制8位数码管显示的单片机程序
时间: 2024-02-13 10:03:54 浏览: 66
好的,这里给出一个简单的单片机程序,实现矩阵键盘控制8位数码管的显示:
```C
#include <reg52.h> // 引入51单片机头文件
// 定义数码管显示码表
unsigned char code numTable[]={
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f // 9
};
sbit LSA=P2^2; // 指定数码管位选端口
sbit LSB=P2^3;
sbit LSC=P2^4;
// 函数声明
void delay(unsigned int i);
void keyScan(void);
void display(unsigned char dat);
// 主函数
void main()
{
unsigned char code table[]={0,0,0,0,0,0,0,0}; // 存储键值的数组
unsigned char i=0;
while(1)
{
keyScan(); // 扫描键盘
if(i<8) // 当键值不足8位时
{
if(table[i]!=0xff) // 如果键值不是无效值
{
display(numTable[table[i]]); // 显示键值对应的数码
delay(500); // 延时一段时间
display(0); // 关闭数码管
i++; // 移动到下一位
}
}
else // 当键值已经输入完毕时
{
break; // 跳出循环
}
}
// 显示完整的键值
for(i=0; i<8; i++)
{
display(numTable[table[i]]);
delay(500);
}
}
// 扫描键盘函数
void keyScan(void)
{
unsigned char i,j;
unsigned char key_code=0xff; // 初始化键值为无效值
// 矩阵键盘扫描
for(i=0; i<4; i++)
{
P1=0x0f;
switch(i)
{
case 0: P1 &=0xfe; break;
case 1: P1 &=0xfd; break;
case 2: P1 &=0xfb; break;
case 3: P1 &=0xf7; break;
}
if(P1!=0x0f) // 如果有按键按下
{
delay(10); // 延时
if(P1!=0x0f) // 确认按键不是抖动
{
switch(P1)
{
case 0x07: key_code=i*4+1; break;
case 0x0b: key_code=i*4+2; break;
case 0x0d: key_code=i*4+3; break;
case 0x0e: key_code=i*4+4; break;
}
}
while(P1!=0x0f); // 等待按键释放
}
}
// 如果有有效键值
if(key_code!=0xff)
{
// 如果还没有输入满8位
if(i<8)
{
// 将键值存入数组
for(j=0; j<8; j++)
{
if(table[j]==0xff)
{
table[j]=key_code;
break;
}
}
}
}
}
// 数码管显示函数
void display(unsigned char dat)
{
LSA=LSB=LSC=1; // 全灭数码管
P0=dat; // 将要显示的数据写入P0口
}
// 延时函数
void delay(unsigned int i)
{
unsigned int j,k;
for(j=0; j<i; j++)
{
for(k=0; k<125; k++);
}
}
```
这个程序实现了矩阵键盘扫描和数码管动态显示,可以通过输入矩阵键盘上的数字按键,将键值存储到一个数组中,并逐个显示在数码管上。当输入的键值达到8位时,程序将停止接收并显示完整的键值。
阅读全文