用lcd1602制作简单的时钟显示

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

物联沃分享整理
物联沃-IOTWORD物联网 » 用lcd1602制作简单的时钟显示

发表评论