一个使用单片机设计的简单电子钟显示,使用C写的,可用于课程设计

源代码在线查看: 液晶显示电子时钟1.c

软件大小: 59 K
上传用户: hqbbsw
关键词: 用单片机 电子钟
下载地址: 免注册下载 普通下载 VIP

相关代码

				/*******************************************************************/
				//Name of this design:     LCD show Electric Clock
				//Author:                  xuqian  zhangmengcheng
				//Date:                    2008-10-02
				/*******************************************************************/
				
				#include 
				#include 
				#include 
				#define uchar  unsigned char
				#define uint   unsigned int
				
				#define BUSY  0x80                               //lcd忙检测标志
				#define DATAPORT P0                             //定义P0口为LCD通讯端口
				
				//sbit light=P1^3;
				sbit LCM_RS=P2^0;								 //数据/命令端
				sbit LCM_RW=P2^1;								 //读/写选择端
				sbit LCM_EN=P2^2;
				sbit sounder=P2^5;
				
				sbit p1_0=P1^0;
				sbit p1_1=P1^1;
				sbit p1_2=P1^2;
				sbit p1_3=P1^3;
				sbit p1_4=P1^4;
				sbit p1_5=P1^5;
				sbit p1_6=P1^6;
				sbit p1_7=P1^7;
										
				uchar second;                		    		 //定义并初始化时钟变量
				uchar minite;
				uchar hour;
				uchar sminite;
				uchar shour;
				uchar mstcnt=0;
				uchar t,set=0;
				uchar code str0[]={"DATE :2008-10-11"};
				uchar code str1[]={"TIME :   :  :   "};
				uchar code str2[]={"clock:   :  :   "};
				
				void delay_LCM(uint);             											//LCD延时子程序
				void initLCM( void);               											//LCD初始化子程序
				void lcd_wait(void);              											//LCD检测忙子程序
				void WriteCommandLCM(uchar WCLCM,uchar BusyC);                              //写指令到ICM子函数
				void WriteDataLCM(uchar WDLCM);                                             //写数据到LCM子函数
				void DisplayOneChar(uchar X,uchar Y,uchar DData);                           //显示指定坐标的一个字符子函数
				void DisplayListChar(uchar X,uchar Y,uchar code *DData);                    //显示指定坐标的一串字符子函数
				void init_timer0(void);               										//定时器初始化
				void displayfun1(void);
				void displayfun2(void);
				void displayfun3(void);
				void displayfun4(void);
				void displayfun5(void);
				void displayfun6(void);
				void keyscan(void );                									    //键盘扫描子程序
				void set_adj(void);
				void inc_key(void);
				void dec_key(void);
				void inc_clock(void);
				void dec_clock(void);
				void set_sure(void);                        //确认键函数,set=0
				
				
				
				
				/*********延时K*1ms,12.000mhz**********/
				
				void delay_LCM(uint k)
				{
				    uint i,j;
				    for(i=0;i				    {
				        for(j=0;j				        	{;}
				    }
				}
				/**********写指令到LCM子函数************/
				
				void WriteCommandLCM(uchar WCLCM,uchar BusyC)
				{
				    if(BusyC)lcd_wait();
					DATAPORT=WCLCM;
				    LCM_RS=0;                   // 选中指令寄存器
				    LCM_RW=0;               	// 写模式	
				    LCM_EN=1;
					_nop_();
					_nop_();
					_nop_();
				    LCM_EN=0;
				}
				
				/**********写数据到LCM子函数************/
				
				void WriteDataLCM(uchar WDLCM)
				{
				    lcd_wait( );                //检测忙信号
					DATAPORT=WDLCM;
				    LCM_RS=1;                   // 选中数据寄存器
				    LCM_RW=0;           	    // 写模式
				    LCM_EN=1;
				    _nop_();
					_nop_();
					_nop_();
				    LCM_EN=0;
				}
				
				/***********lcm内部等待函数*************/
				
				
				void lcd_wait(void)
				{
				    DATAPORT=0xff;	
					LCM_EN=1;
				    LCM_RS=0;   			
				    LCM_RW=1;   			
				    _nop_();
				    while(DATAPORT&BUSY)
					{  LCM_EN=0;
					   _nop_();
					   _nop_();
					   LCM_EN=1;
					   _nop_();
					   _nop_();
					   }
				   	LCM_EN=0;
					
				}
				
				
				/**********LCM初始化子函数***********/
				
				void initLCM( )
				{
					DATAPORT=0;	
					delay_LCM(15);
					WriteCommandLCM(0x38,0);    //三次显示模式设置,不检测忙信号
				    delay_LCM(5);
				    WriteCommandLCM(0x38,0);
				    delay_LCM(5);
				    WriteCommandLCM(0x38,0);
				    delay_LCM(5);
				
				    WriteCommandLCM(0x38,1);    //8bit数据传送,2行显示,5*7字型,检测忙信号
				    WriteCommandLCM(0x08,1);    //关闭显示,检测忙信号
				    WriteCommandLCM(0x01,1);    //清屏,检测忙信号
				    WriteCommandLCM(0x06,1);    //显示光标右移设置,检测忙信号
				    WriteCommandLCM(0x0c,1);    //显示屏打开,光标不显示,不闪烁,检测忙信号
				}
				
				/****************显示指定坐标的一个字符子函数*************/
				
				void DisplayOneChar(uchar X,uchar Y,uchar DData)
				{
				    Y&=1;
				    X&=15;
				    if(Y)X|=0x40;               //若y为1(显示第二行),地址码+0X40
				    X|=0x80;                    //指令码为地址码+0X80
				    WriteCommandLCM(X,0);
				    WriteDataLCM(DData);
				}
				
				/***********显示指定坐标的一串字符子函数***********/
				
				void DisplayListChar(uchar X,uchar Y,uchar code *DData)
				{
				    uchar ListLength=0;
				    Y&=0x01;
				    X&=0x0f;
				    while(X				    {
				        DisplayOneChar(X,Y,DData[ListLength]);
				        ListLength++;
				        X++;
				    }
				}
				
				
				
				/***************液晶显示子函数1正常显示*****************/
				
				void displayfun1(void)
				{	
					WriteCommandLCM(0x0c,1);   					    //显示屏打开,光标不显示,不闪烁,检测忙信号	
					DisplayListChar(0,0,str0);	
					DisplayListChar(0,1,str1);		
															    	
					DisplayOneChar(7,1,hour/10+0x30);		        //液晶上显示小时
					DisplayOneChar(8,1,hour%10+0x30);
				
					DisplayOneChar(10,1,minite/10+0x30);			//液晶上显示分
					DisplayOneChar(11,1,minite%10+0x30);
					
					DisplayOneChar(13,1,second/10+0x30);	        //液晶上显示秒
					DisplayOneChar(14,1,second%10+0x30);
				}
				
				
				/************液晶显示子函数2***************/
				
				void displayfun2(void)
				{
				    WriteCommandLCM(0x0c,1);    			  	  //显示屏打开,光标不显示,不闪烁,检测忙信号	
					DisplayListChar(0,0,str0);	
					DisplayListChar(0,1,str1);	
					
					DisplayOneChar(7,1,hour/10+0x30);
					DisplayOneChar(8,1,hour%10+0x30);
				
					DisplayOneChar(13,1,second/10+0x30);
					DisplayOneChar(14,1,second%10+0x30);
				
				
					WriteCommandLCM(0x0f,1);   					  //显示屏打开,光标显示,闪烁,检测忙信号
					DisplayOneChar(10,1,minite/10+0x30);
					DisplayOneChar(11,1,minite%10+0x30);
				
					
				
				}
				/*************液晶显示子函数3****************/
				
				void displayfun3(void)
				{
				    WriteCommandLCM(0x0c,1);                     //显示屏打开,光标不显示,不闪烁,检测忙信号	
					DisplayListChar(0,0,str0);	
					DisplayListChar(0,1,str1);	
						
					DisplayOneChar(10,1,minite/10+0x30);
					DisplayOneChar(11,1,minite%10+0x30);
					
					DisplayOneChar(13,1,second/10+0x30);
					DisplayOneChar(14,1,second%10+0x30);
				
				   	WriteCommandLCM(0x0f,1);   					 //显示屏打开,光标显示,闪烁,检测忙信号	
				    DisplayOneChar(7,1,hour/10+0x30);
					DisplayOneChar(8,1,hour%10+0x30);
				}
				/**************液晶显示子函数闹钟1*****************/
				void displayfun4(void)
				{	
					WriteCommandLCM(0x0c,1);   					    //显示屏打开,光标不显示,不闪烁,检测忙信号	
					DisplayListChar(0,0,str0);	
					DisplayListChar(0,1,str2);		
															    	
					DisplayOneChar(7,1,shour/10+0x30);		        //液晶上显示闹钟小时
					DisplayOneChar(8,1,shour%10+0x30);
				
					DisplayOneChar(10,1,sminite/10+0x30);			//液晶上显示闹钟分
					DisplayOneChar(11,1,sminite%10+0x30);
					
					DisplayOneChar(13,1,second/10+0x30);	        //液晶上显示秒
					DisplayOneChar(14,1,second%10+0x30);
				}
				
				/**************液晶显示子函数闹钟2*****************/
				void displayfun5(void)
				{
				    WriteCommandLCM(0x0c,1);    			  	  //显示屏打开,光标不显示,不闪烁,检测忙信号	
					DisplayListChar(0,0,str0);	
					DisplayListChar(0,1,str2);	
					
					DisplayOneChar(7,1,shour/10+0x30);
					DisplayOneChar(8,1,shour%10+0x30);
				
					DisplayOneChar(13,1,second/10+0x30);
					DisplayOneChar(14,1,second%10+0x30);
				
				
					WriteCommandLCM(0x0f,1);   					  //显示屏打开,光标显示,闪烁,检测忙信号
					DisplayOneChar(10,1,sminite/10+0x30);
					DisplayOneChar(11,1,sminite%10+0x30);
				
				}
				/**************液晶显示子函数闹钟3*****************/
				void displayfun6(void)
				{
				    WriteCommandLCM(0x0c,1);                     //显示屏打开,光标不显示,不闪烁,检测忙信号	
					DisplayListChar(0,0,str0);	
					DisplayListChar(0,1,str2);	
						
					DisplayOneChar(10,1,sminite/10+0x30);
					DisplayOneChar(11,1,sminite%10+0x30);
					
					DisplayOneChar(13,1,second/10+0x30);
					DisplayOneChar(14,1,second%10+0x30);
				
				   	WriteCommandLCM(0x0f,1);   					 //显示屏打开,光标显示,闪烁,检测忙信号	
				    DisplayOneChar(7,1,shour/10+0x30);
					DisplayOneChar(8,1,shour%10+0x30);
				}
				
				
				
				/**************键盘扫描子函数******************/
				
				void keyscan(void)
				{
					uchar temp;                                           //局部变量
					P1=0xff;
				    p1_6=0;
				    //unsigned char temp;
				    temp=P1;
				    temp&=0x0F;
				    if(temp!=0x0F)
				    {
				      delay_LCM(150);
				      temp=P1;
				      temp&=0x0F;
				      if(temp!=0x0F)
				      {
				       temp=P1;
				       temp&=0x0F;
				       switch(temp)    		          // 根据按键状态,调用不同的子函数
					   {
						 case 0x0E:inc_clock();
				         break;
						 case 0x0D:dec_clock();
				         break;
						 case 0x07:set_sure();
				         break;
						 default:
				         break;
					   }
					  }	
				      }
					P1=0xff;
				    p1_7=0;
				    //unsigned char temp;
				    temp=P1;
				    temp&=0x0F;
				    if(temp!=0x0F)
				    {
				      delay_LCM(150);
				      temp=P1;
				      temp&=0x0F;
				      if(temp!=0x0F)
				      {
				       temp=P1;
				       temp&=0x0F;
				       switch(temp)    		          // 根据按键状态,调用不同的子函数
					   {
						 case 0x0E:set_adj();
				         break;
						 case 0x0D:inc_key();
				         break;
						 case 0x0B:dec_key();
				         break;
						 case 0x07:sounder=0;
						 default:
				         break;
					   }
					   }	
				      }
				
				}
				
				
				/**************设定工作模式子函数****************/
				
				void set_adj(void)
				{
					delay_LCM(100);
					  set++;
				    if(set>5)
				      set=0;	
				}
				
				/*************确认键函数************************/
				void set_sure(void)
				{
				    delay_LCM(100);
				    set=0;
				}
				
				/****************按键加法子函数******************/
				
				void inc_key(void)
				{
					delay_LCM(150);
					  if(set==1)
				        {
				           hour++;
				           if(hour>23)
				           hour=0;
				        }
					  else
					    if(set==2)
					    {
						  minite++;
				          if(minite>59)
				          minite=0;
						 
				        }
						else
				          displayfun1();
				}
				
				/****************按键减法子函数*****************/
				
				void dec_key(void)
				{
					delay_LCM(150);
				        if(set==1)
						  {
						    hour--;
				            if(hour				            hour=23;
				          }
						else
						  if(set==2)
						  {
				            minite--;
				            if(minite				            minite=59;
				          }
						 else
						   displayfun1();	
				}
				/****************闹钟按键加法子函数******************/
				
				void inc_clock(void)
				{
					delay_LCM(150);
					  if(set==5)
				        {
				           shour++;
				           if(shour>23)
				           shour=0;
				        }
					  else
					    if(set==4)
					    {
						  sminite++;
				          if(sminite>59)
				          sminite=0;
						 
				        }
						else
				          displayfun1();
				}
				
				/****************闹钟按键减法子函数*****************/
				
				void dec_clock(void)
				{
					delay_LCM(150);
				        if(set==5)
						  {
						    
				            if(shour				            shour=23;
				            else shour--;
				          }
						else
						  if(set==4)
						  {
				     
				            if(sminite				             sminite=59;
				            else sminite--;
				          }
						 else
						   displayfun1();	
				}
				
				/***************定时器t0初始化*******************/
				
				void init_timer0(void)
				{
					 TMOD=0x01;                                  //time0为定时器,方式1
				     TH0=0x3c;                                   //预置计数初值
				     TL0=0xb0;
				     EA=1;   								
				     ET0=1;          											
				     TR0=1;          		
				}
				
				/***********定时器t0中断子函数**************/
				
				void timer0(void) interrupt 1 using 0            //定时器0方式1,50ms中断一次
				{
				     TH0=0x3c;
				     TL0=0xb0;
				     mstcnt++;
				     if(mstcnt>=20 )
				       {
				         second++;
				         mstcnt=0;
				       }
					   if(second>=60)
				         {
				           minite++;
				           second=0;
				         }
					     if(minite>=60)
				           {
				             hour++;
				             minite=0;
				            // light=0;
				             delay_LCM(200);
				             //light=1;
				           }
					       if(hour>=24)
				             {
				               hour=0;
				             }
					 keyscan( );                                 //按键扫描
				}
				
				/***********the main funtion*************/
				
				void main(void)
				{
				    //shour=12;
					//sminite=0;
				    P1=0xff; 
					sounder=0;	  //初始化p1口,全设为1
					delay_LCM(500);	                                          //延时500ms启动
					initLCM( );                               			  	  //LCD初始化
					init_timer0( );	                           				  //时钟定时器0初始化	
					DisplayListChar(0,0,str0);	
					DisplayListChar(0,1,str1);
				                     	
				    while (1)
				    {
				       	keyscan();                                            //按键扫描		
					    if(hour==shour&&minite==sminite&&second==0)
				        sounder=1;
						switch(set)                                           //LCD根据工作模式显示
						{
							case 0:displayfun1();delay_LCM(1000);             //正常工作显示
							  break;
							case 1:displayfun3();delay_LCM(1000);             //调整分显示
							  break;
							case 2:displayfun2();delay_LCM(1000);             //调整时显示
							  break;
				            case 3:displayfun4();delay_LCM(1000);             //正常显示闹钟时间
							  break;
				            case 4:displayfun5();delay_LCM(1000);             //调整闹钟时显示
							  break;
				            case 5:displayfun6();delay_LCM(1000);             //调整闹钟分显示
							  break;
							default:
				              break;
						} 	
					
				    }
					
				}
							

相关资源