51单片机矩阵键盘输入2761后数码管循环显示2761然后276.1然后27.61然后2.761然后7612-761.2-76.123-7.612-7127-612.7-61.27-6.127-1276-127.6-12.76-1.276-2761-.
时间: 2023-07-06 14:41:50 浏览: 122
以下是基于51单片机的矩阵键盘输入2761后数码管循环显示2761然后276.1然后27.61然后2.761然后7612-761.2-76.123-7.612-7127-612.7-61.27-6.127-1276-127.6-12.76-1.276-2761-. 的代码:
```
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xbf}; //数码管显示0-9和.的编码
sbit L1 = P2^0; //矩阵键盘第一行
sbit L2 = P2^1; //矩阵键盘第二行
sbit L3 = P2^2; //矩阵键盘第三行
sbit L4 = P2^3; //矩阵键盘第四行
sbit C1 = P2^4; //矩阵键盘第一列
sbit C2 = P2^5; //矩阵键盘第二列
sbit C3 = P2^6; //矩阵键盘第三列
uchar keyscan() //矩阵键盘扫描函数
{
uchar val = 0xff; //初始化键值
L1 = 0; //第一行置低电平
if (C1 == 0) {val = 1;} //第一列检测按键
if (C2 == 0) {val = 2;} //第二列检测按键
if (C3 == 0) {val = 3;} //第三列检测按键
L1 = 1; //第一行恢复高电平
L2 = 0; //第二行置低电平
if (C1 == 0) {val = 4;} //第一列检测按键
if (C2 == 0) {val = 5;} //第二列检测按键
if (C3 == 0) {val = 6;} //第三列检测按键
L2 = 1; //第二行恢复高电平
L3 = 0; //第三行置低电平
if (C1 == 0) {val = 7;} //第一列检测按键
if (C2 == 0) {val = 8;} //第二列检测按键
if (C3 == 0) {val = 9;} //第三列检测按键
L3 = 1; //第三行恢复高电平
L4 = 0; //第四行置低电平
if (C1 == 0) {val = 0;} //第一列检测按键
if (C2 == 0) {val = 10;} //第二列检测按键
if (C3 == 0) {val = 0xff;} //第三列检测按键(不启用)
L4 = 1; //第四行恢复高电平
return val; //返回键值
}
void display(uchar num) //数码管显示函数
{
static uchar pos = 0; //静态变量,记录数码管显示的位置
static uchar data[] = {0, 0, 0, 0}; //静态数组,保存数码管显示的数据
uchar i = 0; //循环计数器
if (num == 10) //按下小数点键
{
pos = 1; //从第二位开始显示
data[0] = 0; //第一位清零
}
else //按下数字键
{
if (pos == 0) //整数部分
{
data[3] = data[2];
data[2] = data[1];
data[1] = data[0];
data[0] = num;
}
else //小数部分
{
data[pos-1] = num;
}
pos++; //位置向后移动一位
if (pos > 4) {pos = 1;} //位置超出范围,回到第一位
}
//数码管循环显示数据
for (i=0; i<4; i++)
{
P0 = table[data[i]]; //数码管显示对应的数字或小数点
delay(5); //延时一段时间,避免闪烁
P0 = 0xff; //关闭数码管
delay(5); //延时一段时间,避免闪烁
}
}
void main()
{
while (1) //循环执行
{
uchar val = keyscan(); //扫描矩阵键盘
if (val != 0xff) //判断是否有按键按下
{
display(val); //数码管显示对应的数字或小数点
}
}
}
```
注意:以上代码仅供参考,具体实现可能需要根据具体情况进行调整。
阅读全文