您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > 1602液晶显示DS1302实时时间程序
////////////////////////////////////main.c///////////////////////////////#includereg52.h#includeintrins.h#includestdio.h#includeds1302.h#includelcd.h#defineKey_PortP1^0//定义按键端口#defineDuan_PortP0//定义数码管数据端口#defineWei_PortP2//定义数码管位选端口bitRead_TimeFlag;//定义读时间标志bitSetFlag;//更新时间标志位unsignedchartime_buf2[16];voidDelay_2Us(uchart);//微秒级延时函数voidDelay_Ms(uchart);//毫秒级延时函数voidInit_Timer0();//定时器初始化voidUART_Init(void);//串口初始化/*------------------------------------------------主函数------------------------------------------------*/voidmain(){uchari;LCD_Init();Delay_Ms(20);LCD_Clear();Init_Timer0();Ds1302_Init();UART_Init();Ds1302_Read_Time();if((Time_Data[2]+Time_Data[7])==0)Ds1302_Write_Time();while(1)//主循环{if(SetFlag)//如果接收到串口信息则更新时钟{for(i=0;i8;i++){Time_Data[i]=time_buf2[2*i]*10+time_buf2[2*i+1];}//数据整合,如2个数1和5整合成15Ds1302_Write_Time();SetFlag=0;//时钟信息更新后标志位清零}if(Read_TimeFlag==1){Read_TimeFlag=0;Ds1302_Read_Time();LCD_Write_Com(0x80+0x40);//在第二行显示LCD_Write_Data(0x8d);LCD_Write_Data(0x8d);LCD_Write_Data(0x8d);LCD_Write_Data('0'+Time_Data[4]/10);//时LCD_Write_Data('0'+Time_Data[4]%10);LCD_Write_Data(':');LCD_Write_Data('0'+Time_Data[5]/10);//分LCD_Write_Data('0'+Time_Data[5]%10);LCD_Write_Data(':');LCD_Write_Data('0'+Time_Data[6]/10);//秒LCD_Write_Data('0'+Time_Data[6]%10);LCD_Write_Com(0x80);//在第一行显示LCD_Write_Data(0x8d);LCD_Write_Data(0x8d);//添加空格LCD_Write_Data('0'+Time_Data[0]/10);LCD_Write_Data('0'+Time_Data[0]%10);//显示年的前两位。。即20LCD_Write_Data('0'+Time_Data[1]/10);LCD_Write_Data('0'+Time_Data[1]%10);//以上四行显示完整年份LCD_Write_Data('-');LCD_Write_Data('0'+Time_Data[2]/10);//月LCD_Write_Data('0'+Time_Data[2]%10);LCD_Write_Data('-');LCD_Write_Data('0'+Time_Data[3]/10);//日LCD_Write_Data('0'+Time_Data[3]%10);LCD_Write_Data(0x8d);LCD_Write_Data(0x8d);LCD_Write_Data('0'+Time_Data[7]%10);//星期}}}/*------------------------------------------------延时函数------------------------------------------------*/voidDelay_2Us(uchart){while(t--);}voidDelay_Ms(uchart){while(t--){Delay_2Us(245);Delay_2Us(245);}}/*------------------------------------------------初始化定时器函数------------------------------------------------*/voidInit_Timer0(){TMOD|=0x01;//使用模式1,16位定时器,使用|符号可以在使用多个定时器时不受影响//TH0=(65536-2000)/256;//给定初值//TL0=(65536-2000)%256;EA=1;//总中断打开ET0=1;//定时器中断打开TR0=1;//定时器开关打开}/*------------------------------------------------定时器中断函数------------------------------------------------*/voidTimer0_int()interrupt1{staticuintnum;//静态变量TH0=(65536-2000)/256;//给定初值TL0=(65536-2000)%256;num++;if(num==10)//延时100MS{num=0;Read_TimeFlag=1;//读标志位1}}/*------------------------------------------------串口通讯初始化------------------------------------------------*/voidUART_Init(void){SCON=0x50;//SCON:模式1,8-bitUART,使能接收TMOD|=0x20;//TMOD:timer1,mode2,8-bit重装TH1=0xFD;//TH1:重装值9600波特率晶振11.0592MHzTR1=1;//TR1:timer1打开EA=1;//打开总中断ES=1;//打开串口中断}/*------------------------------------------------串口中断程序------------------------------------------------*/voidUART_SER(void)interrupt4//串行中断服务程序{unsignedcharTemp;//定义临时变量unsignedchari;if(RI)//判断是接收中断产生{RI=0;//标志位清零Temp=SBUF;//读入缓冲区的值time_buf2[i]=Temp&0x0F;i++;if(i==16)//连续接收16个字符信息{i=0;SetFlag=1;//接收完成标志位置1}SBUF=Temp;//把接收到的值再发回电脑端}if(TI)//如果是发送标志位,清零TI=0;}/////////////////////////////////////////////lcd.c////////////////////////////////////////#includereg52.h#includeintrins.h#includelcd.h#includeds1302.h//#defineuintunsignedint//#defineucharunsignedchar////sbitRW=P2^5;//sbitRS=P2^6;//sbitEN=P2^7;////#defineRS_LRS=0//#defineRS_HRS=1////#defineRW_LRW=0//#defineRW_HRW=1////#defineEN_LEN=0//#defineEN_HEN=1////#defineGPIO_PortP0voidDelay2Us(uchart)//微妙延时大致延时长度如下T=tx2+5uS{while(--t);}voidDelayMs(uintt)//毫秒延时延时t毫秒{while(t--){Delay2Us(245);Delay2Us(245);//大致延时1毫秒}}/*------------------------------------------写入命令函数//写命令:RS=0,RW=0,EN=1-------------------------------------------*/voidLCD_Write_Com(ucharcom){DelayMs(5);RS_L;RW_L;EN_H;GPIO_Port=com;_nop_();EN_L;}/*------------------------------------------写入数据函数//写数据:RS=1,RW=0,EN=1-------------------------------------------*/voidLCD_Write_Data(uchardat){DelayMs(5);RS_H;RW_L;EN_H;GPIO_Port=dat;_nop_();EN_L;}/*------------------------------------------------清屏函数------------------------------------------------*/voidLCD_Clear(void){LCD_Write_Com(0x01);//固定格式DelayMs(5);}/*------------------------------------------------写入字符函数------------------------------------------------voidLCD_Write_Char(ucharx,uchary,uchardat){if(y==0){LCD_Write_Com(0x80+x);//从第一行显示}else{LCD_Write_Com(0xc0+x);//否则从第二行显示}LCD_Write_Data(dat);}*//*------------------------------------------------写入字符串函数------------------------------------------------voidLCD_Write_String(ucharx,uchary,uchar*s){if(y==0){LCD_Write_Com(0x80+x);}else{LCD_Write_Com(0xc0+x);}while(*s){LCD_Write_Data(*s);s++;}}*//*------------------------------------------------初始化函数--------------------------------------------------*/voidLCD_Init(){LCD_Write_Com(0x38);//显示模式设置DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);LCD_Write_Com(0
本文标题:1602液晶显示DS1302实时时间程序
链接地址:https://www.777doc.com/doc-5285286 .html