51单片机 通过按键中断方式控制任意两个相邻数码管显示数值,实现K3按键加数,k4减数显示效果,数码管显示数据范围0-20范围,单片机上电初始化值为10。请写出c语言代码并注释
时间: 2024-03-06 08:50:42 浏览: 122
51单片机使用8个数码管中的一个数码管,循环显示数字0~9,到9回0,数字变化的时间间隔为1s。
5星 · 资源好评率100%
好的,以下是51单片机的C语言代码,已加上注释:
```c
#include <reg51.h> // 引入51单片机头文件
#define KEY P3 // 定义按键所在的端口
#define DIG P1 // 定义数码管所在的端口
// 定义数字对应的显示码
unsigned char num[21] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
// 按键扫描函数
unsigned char key_scan(void)
{
unsigned char val = 0xff;
if (KEY != 0xff) // 检测按键是否按下
{
delay_ms(5); // 延时去抖动
if (KEY != 0xff)
{
val = KEY; // 记录按键值
while (KEY != 0xff); // 等待按键松开
}
}
return val; // 返回按键值
}
// 数码管显示函数
void display(unsigned char n1, unsigned char n2)
{
unsigned char i;
DIG = 0x00; // 数码管清零
for (i = 0; i < 8; i++)
{
DIG = 1 << i; // 选中当前位
if (i < 4)
P0 = num[n1 % 100 / 10]; // 显示第一个数
else
P0 = num[n2 % 100 / 10]; // 显示第二个数
delay_ms(1);
DIG = 0x00;
DIG = 1 << i;
if (i < 4)
P0 = num[n1 % 10]; // 显示第一个数
else
P0 = num[n2 % 10]; // 显示第二个数
delay_ms(1);
DIG = 0x00;
}
}
void main()
{
unsigned char k = 0, cnt = 10; // 定义按键值和计数器初始值
TMOD = 0x01; // 设置定时器0为工作方式1
TH0 = 0xfc; // 设置定时器0初值
TL0 = 0x67;
TR0 = 1; // 启动定时器0
ET0 = 1; // 允许定时器0中断
EA = 1; // 允许总中断
while (1)
{
display(cnt, cnt + 1); // 显示数值
k = key_scan(); // 扫描按键值
if (k == 0x7b) // 如果按下K3
cnt++; // 计数器加一
else if (k == 0x7d) // 如果按下K4
cnt--; // 计数器减一
if (cnt < 0) // 如果计数器小于0
cnt = 0; // 计数器等于0
else if (cnt > 20) // 如果计数器大于20
cnt = 20; // 计数器等于20
delay_ms(100); // 延时100ms
}
}
// 定时器0中断函数
void timer0() interrupt 1
{
TH0 = 0xfc; // 重新设置定时器0初值
TL0 = 0x67;
}
```
希望能对您有所帮助!
阅读全文