51单片机 通过按键中断方式控制任意两个相邻数码管显示数值,实现K3按键加数,k4减数显示效果,数码管显示数据范围0-20范围,单片机上电初始化值为10。请写出代码
时间: 2024-03-06 11:50:36 浏览: 67
按键控制数码管实现显示数值加减
好的,以下是您需要的51单片机代码:
```c
#include <reg51.h>
#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;
TH0 = 0xfc;
TL0 = 0x67;
TR0 = 1;
ET0 = 1;
EA = 1;
while (1)
{
display(cnt, cnt + 1);
k = key_scan();
if (k == 0x7b)
cnt++;
else if (k == 0x7d)
cnt--;
if (cnt < 0)
cnt = 0;
else if (cnt > 20)
cnt = 20;
delay_ms(100);
}
}
void timer0() interrupt 1
{
TH0 = 0xfc;
TL0 = 0x67;
}
```
代码中使用了两个数码管分别显示相邻的两个数字,初始化值为10。按下K3加一,K4减一,数值范围为0-20。同时使用了定时器中断来控制数码管的刷新频率。
希望能对您有所帮助!
阅读全文