项目分析
《电子数字钟》这篇是定时器,所以首先就有了定时器的应用(除完整代码外,其余代码都是拼接在一起的,单独使用要注意)
代码列示
main.c文件。定时器的使用,main.c文件所包含的,以及LCD显示的方法,可以自己定义显示的内容
#include "regx52.h"
#include "LCD1602.h"
#include "stdio.h"
int hour = 12 ;
int minute = 12;
int second = 50;
void main()
{
TMOD = 0x01; //设置定时T0的工作方式为1
TH0 = 0xB7; //给高8位赋值
TL0 = 0xFF; //给低8位赋值
ET0 = 1; //使能定时器T0中断
EA = 1; //开启总中断
TR0 = 1;
lcd1602_init();
while (1)
{
char buf[9] = {0};
lcd1602_show_string(1,0," 2023-11-23");
sprintf(buf,"%02d:%02d:%02d",hour,minute,second);
lcd1602_show_string(1,1,buf);
}
}
void time0() interrupt 1 //定时器0中断函数
{
static unsigned int i; //定义静态变量,用来统计中断次数,中断50次就是1s
//每次中断后,要重新赋初值
TH0 = 0xB7; //给高8位赋值
TL0 = 0xFF; //给低8位赋值
i++;
if(i == 50) //中断50次
{
i = 0; //清空中断次数
second++; //当前秒数加1
if(second == 60)
{
second = 0;
minute++;
}
if(minute == 60)
{
minute =0;
hour++;
}
if(hour == 24)
{
hour =0;
}
}
}
LCD1602.C文件。这段代码是一组用于控制 16x2 字符 LCD 模块的函数,使用 8051 微控制器。下面是每个函数的简要解释:
lcd1602_write_cmd(unsigned char cmd): 该函数用于向 LCD 模块发送命令。它会适当设置控制线(RS、RW 和 EN),然后将命令写入 LCD1602_DATAPORT。该函数通常用于初始化 LCD 模块并配置其设置。
lcd1602_write_data(unsigned char dat): 该函数用于向 LCD 模块写入数据(字符或自定义符号)。类似于 lcd1602_write_cmd,它设置控制线,将数据写入 LCD1602_DATAPORT,然后切换 EN 线以将数据发送到 LCD。
lcd1602_init(): 该函数通过发送一系列命令来初始化 LCD 模块,以配置其显示设置。它将数据长度设置为 8 位,配置显示为 2 行 5x7 点阵字符,打开显示但不显示光标或闪烁,并设置输入模式以在写入数据后自动增加光标位置。
lcd1602_show_string(unsigned char x, unsigned char y, unsigned char *str): 该函数用于在 LCD 模块上显示一串字符。它接受字符串的位置 (x, y) 和字符串本身作为参数。根据位置计算出 LCD 光标的适当地址,然后使用 lcd1602_write_data 将字符串的每个字符写入 LCD。
#include "LCD1602.h"
#include "regx52.h"
#include "delay.h"
void lcd1602_write_cmd(unsigned char cmd)
{
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_EN = 0;
LCD1602_DATAPORT = cmd;
LCD1602_EN = 1;
Delay1_ms(1);
LCD1602_EN = 0;
Delay1_ms(1);
}
void lcd1602_write_data(unsigned char dat)
{
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_EN = 0;
LCD1602_DATAPORT = dat;
LCD1602_EN = 1;
Delay1_ms(1);
LCD1602_EN = 0;
Delay1_ms(1);
}
void lcd1602_init()
{
lcd1602_write_cmd (0x38);//数据长度为8、2行显示、5x7点阵
//显示功能打开、无光标、光标不闪烁
lcd1602_write_cmd (0x0c);
//写入新数据后光标右移、文字保持不动
lcd1602_write_cmd (0x06);
lcd1602_write_cmd (0x01);
}
void lcd1602_show_string(unsigned char x,unsigned char y,unsigned char *str)
{
if (y == 0)
lcd1602_write_cmd(0x80 + 0x00 + x);
if (y == 1)
lcd1602_write_cmd(0x80 + 0x40 + x);
while (*str != '\0')
{
lcd1602_write_data(*str);
str++;
}
}
LCD1602.h文件 这个文件可以简化运用此模块,从而达到显示功能
#ifndef __LCD1602_H
#define __LCD1602_H
#include "regx52.h"
sbit LCD1602_RS =P2^6;
sbit LCD1602_RW =P2^5;
sbit LCD1602_EN =P2^7;
#define LCD1602_DATAPORT P0
void lcd1602_init();
void lcd1602_show_string(unsigned char x,unsigned char y,unsigned char *str) ;
#endif
延时delay函数 可以将时间流速控制较为精准
#include "delay.h"
#include "intrins.h"
//延时函数
void Delay1_ms(unsigned int a) //@11.0592MHz
{
unsigned char i, j;
for(a;a>0;a--)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
延时函数可以使时间精准一些,减少误差
延时函数.h文件
#ifndef _DELAY_H
#define _DELAY_H
void Delay1_ms(unsigned int a);
#endif
成果图如下
代码解释
使用了定时器的功能使我们这个代码有可以显示时间流转的功能
使用LCD灯模块来显示时间,日期等功能
延时模块进行延时,从而控制时间的流转速度
总结
我们用了定时器,LCD1602显示此功能,完成后可进行简单的时间,日期显示的功能。可以学习到定时器的使用以及LCD1602的使用,对使用这个内容进行一个加固,同时也可以进行一些修改使这个函数可以变成大伙想要的内容数据。
希望对大家有帮助。