⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 液晶.c

📁 AT89C2051 with 1602c and make a clock
💻 C
字号:
#include<reg51.h>            //头文件
#define uchar unsigned char   //定义uchar为无符号字符型
#define uint unsigned int      //定义uchar为无符号字符型
sbit rs=P3^4;           //定义液晶数据/指令选择端rs为P3口位4
sbit r_w=P3^5;            //定义液晶读/写选择端r_w为P3口位5 
sbit lcden=P3^3;           //定义液晶使能控制端lcden为P3口位3
sbit s1=P3^0;               //定义功能按键为P3口位0
sbit s2=P3^1;                //定义加数按钮为P3口位1
sbit s3=P3^2;                 //定义减数按钮为P3口位2   
sbit s4=2^7;                
uchar   count,s1num;           //定义无符号字符变量,slnum为功能键按下次数,1设置秒,2设置分,3设置时,4跳出设置
char   shi,fen,miao;           //定义字符型变量
uchar code table[]="  2008-7-24 MON";  //显示的数组table
uchar code table1[]="    00:00:00";     //显示的数组table1

void delay(uint z)//延时1ms
{
   uint  x,y;
   for(x=z;x>0;x--)
       for(y=110;y>0;y--);
}

void write_com(uchar com)//写液晶指令(参考时序图)
{
	rs=0;   // 数据/指令选择端rs低电平,写指令
	lcden=0;//为允许写做准备,拉低电平
	P1=com;//显示所写指令的功能
	r_w=0; //选择写功能
	delay(5);//延迟5ms,有充足时间给使能端
	lcden=1;// 使能端lcden高电平,允许写进
	delay(5);//延迟5ms,有充足时间
	lcden=0;//写指令完成
}

void write_date(uchar date)//写液晶数据(参考时序图)
{
	rs=1; // 数据/指令选择端rs低电平,写数据
	lcden=0;//为允许写做准备,拉低电平
	P1=date;//显示所写数据
	r_w=0;//选择写功能
	delay(5);//延迟5ms,有充足时间给使能端
	lcden=1;// 使能端lcden高电平,允许写进
	delay(5);//延迟5ms,有充足时间给使能端
	lcden=0;//写指令完成
}

void init()//初始化液晶(液晶说明书)
{
		uchar num;//循环时需要的变量
		lcden=0;//使能端lcden高电平,不允许写进
		write_com(0x38);//显示模式设置,设置16*2,5*7点阵,8位数据接口
		write_com(0x0c);//显示开/关及光标设置,设置为,D=1开显示,C=0不显示光标,B=0光标不显示
		write_com(0x06);//显示光标移动设置,写一个字符后地址指针加一,且光标加一
		write_com(0x01);//显示清屏

		write_com(0x80);//数据指针设置80H(地址码0-27H,40H-67H),默认的
		for(num=0;num<15;num++)//把table的16个字符逐位写进第一行
			 {
				 write_date(table[num]);//写数据
				 delay(5);
			 }
		write_com(0x80+0x40);//把table1的12个字符逐位写进第二行
		for(num=0;num<12;num++)
			 {
				write_date(table1[num]);//写数据
				delay(5);
			 }
		 TMOD=0x01;//定时器为方式一
		 TH0=(65536-50000)/256;//50ms的高8位初值
		 TL0=(65536-50000)%256;//50ms的低8位初值
		EA=1;//允许开总中断
		ET0=1;//允许定时器0开中断
		TR0=1;//定时器0开始计时
}

void write_sfm(uchar add,uchar date)//显示数据程序
{
	uchar shi,ge; //定义个位,十位变量
	shi=date/10;//取数据十位
	ge=date%10;//取数据个位
	write_com(0x80+0x40+add);//写指令,将要写数据的地址
	write_date(0x30+shi);//写数据十位,参考说明书
	write_date(0x30+ge);//写数据个位,参考说明书
}

void keyscan()//按键扫描
{
			  if(s1==0)//功能键s1按下
						  {  s4=0;//s4键没用
						    		 delay(5);//按键抖动
						        			 if(s1==0)//再次确定s1按下
						         	 {          s1num++;//Slnum为功能键按下次数,1设置秒,2设置分,3设置时,4跳出设置
													   while(!s1);//按键松手
																    	if(s1num==1)//1设置秒
																				{
														                 		TR0=0;//停止计时
																					write_com(0x80+0x40+10);//写秒地址指令,第二行10
																					write_com(0x0f);//显示开/关及光标设置,设置为,D=1开显示,C=1显示光标,B=1光标显示
																				}
																		if(s1num==2)//2设置分,不用设置显示开/关及光标设置,上面已经设置
																				{
																					write_com(0x80+0x40+7);//写分地址指令,第二行7
																				}
																		if(s1num==3)//3设置时
																				{
																					write_com(0x80+0x40+4);//写时地址指令,第二行4
																				}
																		if(s1num==4)//4跳出设置
																				{
																					s1num=0;//清零
																					write_com(0x0c);//显示开/关及光标设置,设置为,D=1开显示,C=0不显示光标,B=0光标不显示
																					TR0=1;//开始计时
																				}
                              
									             
			                  	}						
	        
						  }
						  if(s1num!=0)//确定s1按下,判断其它按键是否按下
												   	 {
														   	   if(s2==0)//判断s2加数按键是否按下
															       	{
															         delay(5);//去抖动
												                     if(s2==0);//确定s2按下
																		while(!s2);	//按键松手								
																		        	         	if(s1num==1)//slnum==1设置秒
																										    	{
																											    	miao++;//miao变量按一次加1
																													if(miao==60)//如果秒为60,miao为零
																												    	miao=0;
																														write_sfm(10,miao);//显示数据程序,10为0x80+0x40+10地址,miao为显示的数据
																												   	write_com(0x80+0x40+10);//写完后指针会指到11,所以要写会10,保持光标不变
																						                   
																										   	}
																	                          if(s1num==2)//slnum==2设置分
																											   {
																													fen++;//fen变量按一次加1
																													if(fen==60)//如果分为60,fen为零
																												    	fen=0;
																														write_sfm(7,fen);//显示数据程序,7为0x80+0x40+7地址

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -