stc89c52 上电后数码管显示数值“ 9999”。 每按一次按键K1,显示的数值加1,最大为“99999999”。 每按一次按键K2,显示的数值减1,最小为0。 按住K1不放,则数值连续加1;而按住K2不放,则数值连续减1。 要求显示高位灭0
时间: 2024-02-12 22:04:33 浏览: 75
好的,这个问题需要用到单片机的IO口、定时器和中断。首先,需要初始化IO口和定时器,以及使能外部中断。
在程序中,可以通过判断按键的状态,来实现按键功能的不同。当按键被按下时,会触发外部中断,并执行中断服务程序。在中断服务程序中,可以根据按键的状态来改变数码管的显示值。
以下是一个简单的示例程序,你可以根据自己的需要进行修改:
```
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit KEY1 = P1^0; // 按键K1
sbit KEY2 = P1^1; // 按键K2
sbit DIO = P2^0; // 数码管数据口
sbit CLK = P2^1; // 数码管时钟口
sbit STB = P2^2; // 数码管片选口
uchar code ledChar[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; // 数码管显示字符数组
uint num = 9999; // 初始显示值
void delay(uint ms) {
uint i, j;
for(i = ms; i > 0; i--)
for(j = 110; j > 0; j--);
}
void display(uchar dat) {
uchar i;
for(i = 0; i < 8; i++) {
DIO = dat & 0x01;
dat >>= 1;
CLK = 1;
CLK = 0;
}
}
void writeByte(uchar addr, uchar dat) {
STB = 0;
display(addr);
display(dat);
STB = 1;
}
void writeNum(uint num) {
uchar i, j, k, dat[8];
for(i = 0; i < 8; i++) {
dat[i] = num % 10;
num /= 10;
if(num == 0)
break;
}
for(j = 0, k = i; j < 4 && k >= 0; j++, k--)
writeByte(j+1, ledChar[dat[k]]);
for(; j < 4; j++)
writeByte(j+1, 0xC0); // 高位灭0
}
void initTimer() {
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = 0xFC;
TL0 = 0x67;
ET0 = 1;
TR0 = 1;
EA = 1;
}
void main() {
uchar key1State = 0, key2State = 0;
initTimer();
writeNum(num);
while(1) {
if(!KEY1) { // 按键K1被按下
delay(10);
if(!KEY1) {
key1State = 1;
if(num < 99999999)
num++;
writeNum(num);
}
} else {
key1State = 0;
}
if(!KEY2) { // 按键K2被按下
delay(10);
if(!KEY2) {
key2State = 1;
if(num > 0)
num--;
writeNum(num);
}
} else {
key2State = 0;
}
if(key1State) { // 按键K1被持续按下
delay(10);
if(!KEY1) {
if(num < 99999999)
num++;
writeNum(num);
}
}
if(key2State) { // 按键K2被持续按下
delay(10);
if(!KEY2) {
if(num > 0)
num--;
writeNum(num);
}
}
}
}
void timer0() interrupt 1 {
TH0 = 0xFC;
TL0 = 0x67;
writeNum(num);
}
```
这个程序使用了定时器0,每隔一段时间就会更新数码管的显示值。当按键被按下时,会改变num的值,并更新数码管的显示值。当按键被持续按下时,num的值会不断改变,直到按键被松开。
注意,在程序中,数码管的高位是灭0的,因此需要在显示数值的函数中将高位的数码管设置为0xC0。还需要在程序中添加外部中断服务程序,以便处理按键被按下的事件。
希望这个程序能够帮到你,如果还有什么问题,请随时问我。
阅读全文