以at89c51芯片控制LM016L液晶显示屏显示29秒倒计时,单片机芯片AD0-AD7分别连接led屏D0-D1,用C语言写出代码,
时间: 2024-09-27 20:14:16 浏览: 60
在Atmel AT89C51单片机上通过AD0-AD7控制LED数码管显示29秒倒计时,可以按照以下步骤编写C语言代码:
首先,确保已经设置好AT89C51的定时器T0用于倒计时,并配置为工作于模式2,即13位定时器。
```c
#include <reg52.h> // 使用汇编宏
sbit LCD_RS = P3^4; // RS引脚连接到LCD的RS线
sbit LCD_EN = P3^5; // EN引脚连接到LCD的EN线
sbit LCD_D0 = P3^0; // D0-D7引脚连接到LCD的数据线
void delay(unsigned int time); // 定义延时函数
void main(void) {
TR0 = 1; // 启动定时器T0
TH0 = 0xFD; // 设置初始值,使T0从内部晶振频率计数,大约等于29*10ms
TF0 = 0; // 清除溢出标志
EA = 1; // 开启全局中断
ET0 = 1; // 启动外部中断
IE = 1 << TF0IE; // 开启定时器溢出中断
while (1) {
if (!TF0) { // 如果定时器未溢出
LCD_RS = 0; // 高电平选通命令模式
LCD_D0 = 0x3F; // 显示数字0,最高位先显示
LCD_EN = 1;
LCD_RS = 1; // 低电平数据模式
LCD_D0 = (29 / 10); // 显示十位数,这里是29
LCD_EN = 1;
LCD_D0 = (29 % 10); // 显示个位数
LCD_EN = 1;
// 更新剩余时间并减小TH0
if (29 > 0) {
TH0 -= 1;
} else {
TF0 = 1; // 溢出标志置1
LCD_RS = 0; // 显示停止符号
LCD_D0 = 0x70; // 显示全亮
LCD_EN = 1;
__delay_ms(1000); // 等待一秒钟
LCD_RS = 1; // 退出显示停止状态
LCD_D0 = 0x00; // 清零显示
}
}
if (TF0IF) { // 中断处理
TF0IF = 0; // 清除中断标志
LCD_RS = 1; // 数据模式下,结束显示
LCD_EN = 0; // 关闭EN信号
LCD_RS = 0; // 命令模式,开始新的倒计时
}
}
}
// 定义延时函数,这里可以用查表法实现,实际项目可能需要更精确的延时函数
void delay(unsigned int time) {
static const unsigned char tbl[] = {0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F};
unsigned char i;
for (i = 0; i < time; i++) {
_nop_();
}
}
```
阅读全文