基于51单片机个LCD1602的万年历程序
小白 第一次跟新博客
基于51单片机和LCD1602的万年历程序
可实现走时和调时功能 有简单的1602菜单制作
欢迎大家交流
LCD1602和51单片机的连接方法
RS = P3^5; //数据/命令选择端(H/L)
RW = P3^4;			//数/写选择端(H/L)
EN = P3^3;			//使能信号
P0                  //LCD1602的数据口D0-D7
#include<reg52.h>
typedef unsigned char uChar8;
typedef unsigned int uInt16;
uChar8 TAB1[]="^_^2016-12-27^_^";
uChar8 TAB2[]="    23:59:45    ";
uChar8 year=2016,month=12,day=27,hour=23,minute=59,second=45,count;
sbit RS = P3^5;				//数据/命令选择端(H/L)
sbit RW = P3^4;			//数/写选择端(H/L)
sbit EN = P3^3;			//使能信号
sbit SEG_SELECT = P1^7;
sbit BIT_SELECT = P1^6;
sbit LED1 = P2^0;
sbit Key2 = P3^6;
sbit Key1 = P3^7;
sbit Key3 = P3^0;
void DelayMS(uInt16 ValMS)
{
	uInt16 uiVal,ujVal;
	for(uiVal = 0; uiVal < ValMS; uiVal++)
		for(ujVal = 0; ujVal < 113; ujVal++);
}
void DectectBusyBit(void)
{   
	P0 = 0xff;			// 读状态值时,先赋高电平
	RS = 0;
	RW = 1;
	EN = 1;
	DelayMS(1);
	while(P0 & 0x80);	// 若LCD忙,停止到这里,否则走起
	EN = 0;				// 之后将EN初始化为低电平 
}
void WrComLCD(uChar8 ComVal)
{
	DectectBusyBit();
	RS = 0;
	RW = 0;
	EN = 1;
	P0 = ComVal;
	DelayMS(1);
	EN = 0;	
}
void WrDatLCD(uChar8 DatVal)
{
	DectectBusyBit();
	RS = 1;
	RW = 0;
	EN = 1;
	P0 = DatVal;
	DelayMS(1);
	EN = 0;	
}
void LCD_Init(void)
{ 
	uChar8 ucVal,i;
WrComLCD(0x38);		// 16*2行显示、5*7点阵、8位数据接口
	WrComLCD(0x38);
	WrComLCD(0x38);    	// 重新设置一遍
	WrComLCD(0x01);    	// 显示清屏 
	WrComLCD(0x06);    	// 光标自增、画面不动  
	DelayMS(1);			// 稍作延时
	WrComLCD(0x0c);    	// 开显示、关光标并不闪烁
for(i=0;i<16;i++)
	{
		WrComLCD(0x80+i);					
		WrDatLCD(TAB1[ucVal+i]);
WrComLCD(0xC0+i);					
		WrDatLCD(TAB2[ucVal+i]);	
	}	
}
void Timer_Init()
{
		TMOD=0x01;
    TH0=0xDC;
		TL0=0x00;
		EA=1;
		ET0=1;
		TR0=1;		
}
void DisplayYear()
{
		WrComLCD(0x80+5);					
		WrDatLCD(0x30+year/10);
		WrComLCD(0x80+6);					
		WrDatLCD(0x30+year%10);	
}
void DisplayMonth()
{
		WrComLCD(0x80+8);					
		WrDatLCD(0x30+month/10);
		WrComLCD(0x80+9);					
		WrDatLCD(0x30+month%10);	
}
void 	DisplayDay()
{
		WrComLCD(0x80+11);					
		WrDatLCD(0x30+day/10);
		WrComLCD(0x80+12);					
		WrDatLCD(0x30+day%10);		
}
void DisplayHour()
{
		WrComLCD(0xc0+4);					
		WrDatLCD(0x30+hour/10);
		WrComLCD(0xc0+5);					
		WrDatLCD(0x30+hour%10);					
}
void DisplayMinute()
{
		WrComLCD(0xc0+7);					
		WrDatLCD(0x30+minute/10);
		WrComLCD(0xc0+8);					
		WrDatLCD(0x30+minute%10);
}
void DisplaySecond()
{
		WrComLCD(0xc0+10);					
		WrDatLCD(0x30+second/10);
		WrComLCD(0xc0+11);					
		WrDatLCD(0x30+second%10);
}
void CloseDigTube()
{
		BIT_SELECT=1;
		P0=0xff;
		BIT_SELECT=0;
		SEG_SELECT=1;
		P0=0x00;
		SEG_SELECT=0;
}
void Keyscan()
{		
		static	uChar8 i=0,j=0;						//static静态变量 每按下一次Key1(停止计时键)i++;  每按下一次Key2(调位键)j++;
		if(Key1==0)												//每按下一次Key1(停止计时键)i++;
		{
				DelayMS(5);										//消抖
				if(Key1==0)
						i++;
		}
		if(i%2==1)												//判断i的奇偶性决定TR的状态
		{
				LED1=0;
				TR0=0;
		}
		if(i%2==0)
		{
			  LED1=1;
				TR0=1;	
				WrComLCD(0xc0+5);      				//确定位置 第二行第五位
				WrComLCD(0xc0+8);      				//确定位置 第二行第八位
				WrComLCD(0xc0+11);      			//确定位置 第二行第十一位
				WrComLCD(0x0c);								//光标不闪烁
		}
	  if(Key2==0)												//每按下一次Key2(调位键)j++;
		{
				DelayMS(5);										//消抖
				if(Key2==0)
						j++;										
		}
		if(j%7==1)
		{
				WrComLCD(0x0f);					//光标闪烁
				WrComLCD(0xc0+11);      //哪一位光标闪烁
				if(Key3==0)
				{
						second++;
						if(second==60)
								second=0;
						DisplaySecond();
				}
		}
		if(j%7==2)
		{
				WrComLCD(0x0f);					//光标闪烁
				WrComLCD(0xc0+8);      //哪一位光标闪烁
				if(Key3==0)
				{
						minute++;
						if(minute==60)
								minute=0;
						DisplayMinute();
				}
		}
		if(j%7==3)
		{
				WrComLCD(0x0f);					//光标闪烁
				WrComLCD(0xc0+5);      //哪一位光标闪烁
				if(Key3==0)
				DelayMS(5);
				if(Key3==0)
				{
						hour++;
						if(hour==24)
								hour=0;
						DisplayHour();
				}
		}
		if(j%7==4)
		{
				WrComLCD(0x0f);					//光标闪烁
				WrComLCD(0x80+12);      //哪一位光标闪烁
				if(Key3==0)
				DelayMS(5);
				if(Key3==0)
				{
						day++;
						if(day==31)
								day=1;
						DisplayDay();
				}
		}
		if(j%7==5)
		{
				WrComLCD(0x0f);					//光标闪烁
				WrComLCD(0x80+9);      //哪一位光标闪烁
				if(Key3==0)
				DelayMS(5);
				if(Key3==0)
				{
					month++;
						if(month==12)
								month=1;
						DisplayMonth();
				}
		}
		if(j%7==6)
		{
				WrComLCD(0x0f);					//光标闪烁
				WrComLCD(0x80+6);      //哪一位光标闪烁
				if(Key3==0)
				DelayMS(5);
				if(Key3==0)
				{
					year++;
						if(year==99)
								year=0;
						DisplayYear();
				}
		}
		if(j%7==0)
		{
				WrComLCD(0x0c);					//光标不闪烁				
		}
}
void main(void)
{
		LCD_Init();
		Timer_Init();
		CloseDigTube();
		DelayMS(5);
		while(1)
		{
				Keyscan();             //按键扫描  菜单制作
		}
}
void Timer0(void) interrupt 1
{
TH0=0xDC;
		TL0=0x00;
		count++;
		if(count==100)
		{			
			count=0;
			second++;
if(second==60)
			{
second=0;
					minute++;
if(minute==60)
					{
minute=0;
							hour++;		
							if(hour==24)
							{		
									hour=0;													
							}		
							DisplayHour();
					}
					DisplayMinute();
			}
			DisplaySecond();
		}
}
基于51单片机个LCD1602的万年历程序的更多相关文章
- 基于51单片机的CAN通讯协议C语言程序
		//-----------------------函数声明,变量定义-------------------------------------------------------- #includ ... 
- ET 与RETI 基于51单片机中断跳出指令“RETI”浅议
		最近在基于51单片机编程的过程中出现了个很奇怪的问题“程序执行中在寄存器EA=1,ET0=1,TR0=1条件下,单TF0=1时并没有执行中断”.在有过单片机中断编程经历者都知道当EA=1,ET0=1的 ... 
- 基于51单片机IIC通信的PCF8591学习笔记
		引言 PCF8591 是单电源,低功耗8 位CMOS 数据采集器件,具有4 个模拟输入.一个输出和一个串行I2C 总线接口.3 个地址引脚A0.A1 和A2 用于编程硬件地址,允许将最多8 个器件连接 ... 
- ESP8266 AT指令开发(基于STC89C52单片机): 测试下诱人的程序(51单片机,8266,MQTT远程通信控制)
		前言 实现的功能,APP通过SmartConfig给Wi-Fi模块配网并绑定设备,然后通过MQTT远程控制开发板的继电器, 简而言之: 51单片机+ESP8266用AT指令实现实现MQTT,(连接的本 ... 
- 基于51单片机+DAC0832的信号发生器
		最近帮别人设计一个毕业设计,做一个多种信号发生器(四种波形:方波.三角波.锯齿波.梯形波),现在贴上来给大家参考,如果有错误的地方,望指出~ 下面先贴上仿真的电路图(仿真的软件是Protuse,上传一 ... 
- 基于51单片机IIC通信的AT24C02学习笔记
		引言 最近在学习几种串行通信协议,感觉收获很多,这篇文章是学习IIC总线协议的第一篇文章,以后还会再写一篇关于PCF8591 IIC通信的ADDA转换芯片的文章. 关于IIC总线 IIC 即Inter ... 
- 如何编写51单片机超声波测距SR04_lcd1602显示程序
		超声波测距在我们日常生活中很常见,比如说车在倒退的时候,为了防止车撞到障碍物,会在车尾加上一个超声波测距模块.在智能车比赛中,也有超声波测距模块等等.可见超声波非常的重要,接下来,我们上代码研究一下如 ... 
- 3.7 基于51单片机+MC20的路径显示【使用STC15W内核】
		需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ... 
- [51单片机] SPI nRF24L01 无线简单程序 1
		main.c #include <reg51.h> #include <api.h> #define uchar unsigned char /**************** ... 
随机推荐
- vs未能正确加载XX包的解决方法
			管理员 -- cmd ---(进入到vs的安装目录下.如我的是:C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE)---d ... 
- 高级java工程师面试题-随笔
			最近打算要换工作,也面试了几家,因为不是自己喜欢的所以拒了一些(当然也有人家不要我的.....).在面试的过程中发现对java高级程序员的考察基本上围绕知识面,知识深度两个方面来考察.下面是在面试过程 ... 
- Mertens
			题意: 求解$\sum_{i=a}^b{\mu(i)}$. 解法: 由$(\mu * I)(n) = e(n)$ 得 $\sum_{d|n}{\mu(d)} = [n=1]$ 得 $\mu(n) = ... 
- mysql慢日志记录
			DBA工作:通过日志找到执行慢的sql语句 慢日志: - 执行时间 > 10 - 未命中索引 配置: - 基于内存 show variables like '%query%'; set glob ... 
- lua面向对象实现(实例化对象、继承、多态、多继承、单例模式)
			lua面向对象实现: 一个类就像是一个创建对象的模具.有些面向对象语言提供了类的概念,在这些语言中每个对象都是某个特定类的实例.lua则没有类的概念,每个对象只能自定义行为和形态.不过,要在lua中模 ... 
- eclipse + tomcat 开发环境配置
			一. 下载tomcat和Eclipse 下载tomcat 下载地址:http://tomcat.apache.org/download-70.cgi 下载后解压如下图 下载eclipse 下载地址:h ... 
- 1079 Total Sales of Supply Chain (25 分)
			A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ... 
- Codeforces712B【= =】
			题意: 题意: 最少需要几步改变能够使得按照原序列的走法从起源走到起源: 思路: 长度奇数肯定不行 偶数的情况下.. 其实题意转变就是有4个数a,b,c,d,在最小的改变下,使a==b,c==d; 那 ... 
- 3DMAX 7 角色建模1 人头建模
			说明: mesh与poly 可编辑多边形是一个多边形网格:即与可编辑网格不同,其使用超过三面的多边形.可编辑多边形非常有用,因为它们可以避免看不到边缘.例如,如果您对可编辑多边形执行切割和切片操作,程 ... 
- [Xcode 实际操作]九、实用进阶-(27)字符串文件(Localizable.strings)的本地化
			目录:[Swift]Xcode实际操作 本文将演示字符串文件(Localizable.strings)的本地化. 在项目[DemoApp]文件夹下点击鼠标右键,弹出右键菜单 ->[New Fil ... 
