本文最终的效果如图,lcd上能显示一个电子时钟,并能正确的显示时间。

 如图打开proteus,导入元器件并连线,如果是实物的话,别忘了购买lcd屏上的对比度调节变阻器,不然显示不出来,对比度不是太浅就是太深,根本就看不到,需要注意。我就上了这个坑了,没有哪个文章或是视频提到过这个事,估计都没有拿实物做实验吧。接下来写c程序,我的程序都是经过测试的,跑起来没有问题,可以直接复制粘贴。

#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

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中或是烧录到单片机里就能正常运行了。不会编译的可以看我以前的文章,都有记录。

精彩链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。