使用vision4c语言完成,数码管显示全0,按键A按1次加1,当按下按键B时,从该数倒计时,倒计时结束时,蜂鸣器响
时间: 2024-06-13 22:08:29 浏览: 81
以下是使用Vision4编写的代码,实现数码管显示全0,按键A按1次加1,按键B倒计时并在倒计时结束时蜂鸣器响:
```c
#include <STC89C5xRC.H>
#define uchar unsigned char
#define uint unsigned int
uchar code table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; // 数码管显示0~9的编码
uchar num = 0; // 数码管显示的数字
uchar flag = 0; // 按键B是否按下的标志
uint time = 0; // 倒计时时间
void delay(uint t) // 延时函数
{
uint i, j;
for (i = t; i > 0; i--)
for (j = 110; j > 0; j--);
}
void display() // 数码管显示函数
{
P0 = table[num];
}
void keyscan() // 按键扫描函数
{
if (P3_2 == 0) // 按键A按下
{
delay(10); // 延时去抖动
if (P3_2 == 0) // 确认按键A按下
{
num++; // 数码管数字加1
if (num > 9)
num = 0;
display(); // 数码管显示数字
}
while (!P3_2); // 等待按键A松开
}
if (P3_3 == 0) // 按键B按下
{
delay(10); // 延时去抖动
if (P3_3 == 0) // 确认按键B按下
{
flag = 1; // 标志按键B按下
time = 5000; // 倒计时5秒
}
while (!P3_3); // 等待按键B松开
}
}
void main()
{
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0xfc; // 定时器0初值
TL0 = 0x67;
TR0 = 1; // 启动定时器0
ET0 = 1; // 允许定时器0中断
EA = 1; // 开启总中断
while (1)
{
keyscan(); // 按键扫描
if (flag == 1) // 按键B按下
{
display(); // 数码管显示数字
while (time > 0) // 倒计时
{
keyscan(); // 按键扫描
if (flag == 0) // 按键B松开
break;
}
if (time == 0) // 倒计时结束
{
P2_3 = 1; // 蜂鸣器响
delay(100); // 延时
P2_3 = 0; // 蜂鸣器停止响
}
flag = 0; // 标志清零
num = 0; // 数码管数字清零
display(); // 数码管显示数字
}
}
}
void timer0() interrupt 1 // 定时器0中断函数
{
TH0 = 0xfc; // 定时器0初值
TL0 = 0x67;
time--; // 倒计时时间减1
}
```
阅读全文