如何在51 单片机上用lcd1602显示时钟
时间: 2023-07-29 12:07:33 浏览: 98
要在51单片机上使用LCD1602显示时钟,可以按照以下步骤进行:
1. 配置时钟:使用定时器来产生1秒钟的中断,然后在中断服务函数中更新时钟数据。
2. 初始化LCD1602:设置LCD1602的工作模式、显示模式、光标模式等参数,并初始化显示内容。
3. 实现时钟显示:在主循环中不断更新LCD1602上的显示内容,包括时、分、秒等。
以下是代码示例:
```c
#include <reg51.h>
#define LCD1602_DB P1
sbit LCD1602_RS = P2^6;
sbit LCD1602_RW = P2^5;
sbit LCD1602_E = P2^7;
unsigned char hour, minute, second;
void initLCD1602();
void writeCommand(unsigned char command);
void writeData(unsigned char data);
void delay(unsigned int msec);
void updateTime();
void main()
{
TMOD = 0x01; // 使用定时器0模式1
TH0 = 0xFC; // 定时1秒钟
TL0 = 0x66;
TR0 = 1; // 开始计时
ET0 = 1; // 允许定时器0中断
EA = 1; // 允许总中断
initLCD1602();
while(1)
{
updateTime(); // 更新时钟数据
writeCommand(0x80); // 设置光标位置为第一行第一列
writeData(hour/10 + '0'); // 显示时
writeData(hour%10 + '0');
writeData(':');
writeData(minute/10 + '0'); // 显示分
writeData(minute%10 + '0');
writeData(':');
writeData(second/10 + '0'); // 显示秒
writeData(second%10 + '0');
}
}
void initLCD1602()
{
delay(15); // 上电后等待15ms
writeCommand(0x38); // 设置工作模式为8位数据接口,双行显示,5x7点阵字符
writeCommand(0x0C); // 设置显示模式为开,关光标,不闪烁
writeCommand(0x06); // 设置光标移动方向为右,字符不移动
writeCommand(0x01); // 清屏
}
void writeCommand(unsigned char command)
{
LCD1602_RS = 0; // 选择命令寄存器
LCD1602_RW = 0; // 写数据
LCD1602_DB = command; // 写入命令
LCD1602_E = 1; // 使能时序
delay(1); // 延时1us
LCD1602_E = 0; // 禁能时序
}
void writeData(unsigned char data)
{
LCD1602_RS = 1; // 选择数据寄存器
LCD1602_RW = 0; // 写数据
LCD1602_DB = data; // 写入数据
LCD1602_E = 1; // 使能时序
delay(1); // 延时1us
LCD1602_E = 0; // 禁能时序
}
void delay(unsigned int msec)
{
unsigned int i, j;
for(i=0; i<msec; i++)
{
for(j=0; j<125; j++);
}
}
void updateTime()
{
static unsigned int count = 0;
if(count++ >= 1000) // 1秒钟到了
{
count = 0;
second++;
if(second >= 60)
{
second = 0;
minute++;
if(minute >= 60)
{
minute = 0;
hour++;
if(hour >= 24)
{
hour = 0;
}
}
}
}
}
```
这段代码实现了在LCD1602上显示时钟,使用定时器0产生1秒钟的中断,然后在中断服务函数中更新时钟数据。在主循环中不断更新LCD1602上的显示内容,使用writeCommand和writeData函数向LCD1602写入命令和数据。同时,还需要实现延时函数delay和更新时钟数据的函数updateTime。
阅读全文