本文最终的效果如图,lcd上能显示一个电子时钟,并能正确的显示时间。
如图打开proteus,导入元器件并连线,如果是实物的话,别忘了购买lcd屏上的对比度调节变阻器,不然显示不出来,对比度不是太浅就是太深,根本就看不到,需要注意。我就上了这个坑了,没有哪个文章或是视频提到过这个事,估计都没有拿实物做实验吧。接下来写c程序,我的程序都是经过测试的,跑起来没有问题,可以直接复制粘贴。文章来源:https://www.toymoban.com/news/detail-510508.html
#include"reg52.h"
sbit RS=P3^5; // lcd的RS接口接到单片机的P3的第5口
sbit RW=P3^6; // lcd的RW接口接到单片机的P3的第6口
sbit E=P3^7; // lcd的E接口接到单片机的P3的第7口
unsigned int shi=23, fen=59, miao=50; // 定义小时,分钟, 秒钟的初始值,可以直接更改,lcd直接就从这个时间开始
unsigned int count=0; // 计时器中断中用到的变量
unsigned char str[]={"0123456789:"}; // 在lcd显示时用到的字符串,最后一个是时间间隔符:,也可以换成-号
// 延时函数
void delay(unsigned int t){
unsigned int i=0, j=0;
for(i=0; i<t; i++){
for(j=0; j<120; j++);
}
}
// lcd写数据函数 写dat首字母
void xdat(unsigned char dat){
RS = 1;
RW = 0;
E = 0;
P2 = dat;
delay(5);
E = 1;
E = 0;
}
// lcd写命令函数 写命令首字母xml
void xml(unsigned char ml){
RS = 0;
RW = 0;
E = 0;
P2 = ml;
delay(5);
E = 1;
E = 0;
}
// lcd初始化函数
void init(){
xml(0x38);
xml(0x0c);
xml(0x06);
xml(0x01);
}
// lcd更新显示函数
void gengxin(){
unsigned int shi0=0,shi1=0,fen0=0,fen1=0,miao0=0,miao1=0; // 定义变量 shi0=小时的十位, shi1=小时的个位, fen0=分钟的十位, fen1=分钟的个位, miao0=秒钟的十位, miao1=秒钟的个位
shi0 = shi/10; // 小时除以10,只取整数部分就正好是小时的十位数
shi1 = shi%10; // 小时除10取余,正好就是小时的个位数
fen0 = fen/10; // 分钟除以10,只取整数部分就正好是分钟的十位数
fen1 = fen%10; // 分钟除10取余,正好就是分钟的个位数
miao0 = miao/10; // 秒钟除以10,只取整数部分就正好是秒钟的十位数
miao1 = miao%10; // 秒钟除10取余,正好就是秒钟的个位数
xml(0x80); // 从lcd的第一行左侧开始写入
delay(5);
xdat(str[shi0]); //lcd写入前面定义的字符串str的(shi0)位
delay(5);
xdat(str[shi1]); //lcd写入前面定义的字符串str的(shi1)位
delay(5);
xdat(str[10]);
delay(5);
xdat(str[fen0]); // 写入分钟的十位
delay(5);
xdat(str[fen1]); // 写入分钟的个位
delay(5);
xdat(str[10]);
delay(5);
xdat(str[miao0]); // 写入秒钟的十位
delay(5);
xdat(str[miao1]); //写入秒钟的个位
delay(5);
}
// 初始化定时器
void inittimer(){
TMOD =0x01;
TH0 = 0x3C; // 初值高8位就是65536-计时值50000(50毫秒) = 15536转换成16进制为 3cb0
TL0 = 0xB0; // 高8位为3c, 低8位为b0
ET0 =1; // 开启定时器0
EA = 1; // 开启总中断
TR0 = 1; // 开启定时器
}
// 主函数
void main(){
init();
inittimer();
while(1){
gengxin();
}
}
// 时间中断函数
void zhongduan() interrupt 1{
unsigned int i=0;
TH0 = 0x3C; // 初值高8位就是65536-计时值50000(50毫秒) = 15536转换成16进制为 3cb0
TL0 = 0xB0; // 高8位为3c, 低8位为b0
count++; // 这个中断函数每隔50毫秒运行一次,每次count加1
if(count==20){ // 如果count等于了20,就是运行了20次X50=1000毫秒=1秒
miao+=1; // 秒钟加1
count = 0; // count置0从新计算
}
if(miao==60){ // 如果秒钟等于60了
fen+=1; //分钟加1
miao=0; // 秒钟置0从新计算
}
if(fen==60){ // 如果分钟等于60了
shi+=1; // 小时加1
fen=0; // 分钟置0从新计算
}
if(shi==24){ // 如果小时等于24了或是12了
shi=0; // 小时置0从新计算 (后面还可以加天,月, 年)
}
}
最后编译成hex文件导入到proteus中或是烧录到单片机里就能正常运行了。不会编译的可以看我以前的文章,都有记录。文章来源地址https://www.toymoban.com/news/detail-510508.html
到了这里,关于用lcd1602制作简单的时钟显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!