1602液晶万年历源程序-带温度、背光、灰度 数字 作者: 时间:2016-11-30 来源:网络 加入技术交流群 扫码加入和技术大咖面对面交流海量资料库查询 收藏 /********************************************************************************************/// 以上是LCM2402驱动程序 ///*********************************************************************************************//*********************************************************************************************/bit IsLeapYear(void){ //计算本年是否是润年 unsigned int a;a = 2000+TIME_YY;//加2000表示成完整的年if((a%4==0 && a%100!=0)||(a%400==0)){ //润年的计算公式return 1;//是润年返回1 }else{ return 0;//不是润年返回0 }} /**********************************************************************************************/ void month_day(void){ unsigned char mon_day[]={31,28,31,30,31,30,31,31,30,31,30,31};TIME_DD++;//天加1TIME_WW++;//星期值加1if(TIME_WW > 7){TIME_WW = 1;//时期值限定}if(TIME_DD > mon_day[TIME_MO-1]){//检查天是否大于当月的最大值if(IsLeapYear()&&TIME_MO==2){ //计算本月是否是润年的2月份 TIME_DD = 29;//如果是润年又是2月,则天为29}else{TIME_DD = 1; //否则就等于1TIME_MO++;//月加1if(TIME_MO > 12){TIME_MO = 1; //如果月大于12则月等于1TIME_YY++;//年加1 (公历年无限积加)}}}} /**********************************************************************************************/ void init (void){ //上电初始化TMOD = 0x11; // 定时/计数器0,1工作于方式1 TH0 = 0x3c; // 预置产生50ms时基信号 TL0 = 0xb0; EA = 1; // 开总中断 ET0 = 1; // 定时/计数器0允许中断 TR0 = 1; // 开闭定时/计数器0 ////TIME_DD = 17; //时间在首次使用的值,之后会在EEPROM自动记录上一天的值TIME_MO = 11; //初始时间:2011年11月17日周一,23时08分00秒TIME_YY = 11;TIME_WW = 4;TIME_HH = 1;TIME_MM = 0;TIME_SS = 0;}/********************************************************************************************//显示项目 时间部分 在第一行全行显示时间*********************************************************************************************/ void RealTime_Display(void){print(0x80,"20");print2(0x82,TIME_YY/10+0x30);print2(0x83,TIME_YY%10+0x30);print(0x84,"/"); // 显示年//print2(0x85,TIME_MO/10+0x30);print2(0x86,TIME_MO%10+0x30);print(0x87,"/"); // 显示月//print2(0x88,TIME_DD/10+0x30); print2(0x89,TIME_DD%10+0x30); // 显示日print(0x8b,"["); // 显示[print2(0x8c,TIME_WW%10); //星期print(0x8d,"]"); // 显示]print2(0x40,TIME_HH/10+0x30);//小时print2(0x41,TIME_HH%10+0x30);print(0x42,":"); // 显示cgram第一个字模":"//print2(0x43,TIME_MM/10+0x30);//分钟print2(0x44,TIME_MM%10+0x30);print(0x45,"."); // 显示cgram第一个字模"."//print2(0x46,TIME_SS/10+0x30);//秒print2(0x47,TIME_SS%10+0x30);//}/**********************************************************************************************/ void delay_ms(unsigned int a){//-延时函数 1MS/次 unsigned char i;while( --a != 0){ for(i = 0; i < 125; i++); //一个 ; 表示空语句,CPU空转。} //i 从0加到125,CPU大概就耗时1毫秒}/*********************************************************************************************/*********************************************************************************************函数名:PWM初始化函数调 用:PWM_init();参 数:无返回值:无结 果:将PCA初始化为PWM模式,初始占空比为0备 注:需要更多路PWM输出直接插入CCAPnH和CCAPnL即可/**********************************************************************************************/void PWM_init (void){CMOD=0x02; //设置PCA定时器CL=0x00; CH=0x00;CCAPM0=0x42; //PWM0设置PCA工作方式为PWM方式(0100 0010)CCAP0L=0x00; //设置PWM0初始值与CCAP0H相同CCAP0H=0x00; // PWM0初始时为0CCAPM1=0x42; //PWM1设置PCA工作方式为PWM方式(使用时删除//)CCAP1L=0x00; //设置PWM1初始值与CCAP0H相同CCAP1H=0x00; // PWM1初始时为0//CCAPM2=0x42; //PWM2设置PCA工作方式为PWM方式//CCAP2L=0x00; //设置PWM2初始值与CCAP0H相同//CCAP2H=0x00; // PWM2初始时为0//CCAPM3=0x42; //PWM3设置PCA工作方式为PWM方式//CCAP3L=0x00; //设置PWM3初始值与CCAP0H相同//CCAP3H=0x00; // PWM3初始时为0CR=1; //启动PCA定时器}/**********************************************************************************************//*********************************************************************************************函数名:PWM0占空比设置函数调 用:PWM0_set();参 数:0x00~0xFF(亦可用0~255)返回值:无结 果:设置PWM模式占空比,为0时全部高电平,为1时全部低电平备 注:如果需要PWM1的设置函数,只要把CCAP0L和CCAP0H中的0改为1即可/**********************************************************************************************/void PWM0_set (unsigned char a){CCAP0L= a; //设置值直接写入CCAP0LCCAP0H= a; //设置值直接写入CCAP0H}/*********************************************************************************************函数名:PWM1占空比设置函数调 用:PWM1_set();参 数:0x00~0xFF(亦可用0~255)返回值:无结 果:设置PWM模式占空比,为0时全部高电平,为1时全部低电平备 注:如果需要PWM1的设置函数,只要把CCAP0L和CCAP0H中的0改为1即可/**********************************************************************************************/void PWM1_set (unsigned char a){CCAP1L= a; //设置值直接写入CCAP1LCCAP1H= a; //设置值直接写入CCAP1H}/**********************温度显示函数***********************************************************/void WD_XS(void){delay_ms(1000); //温度转换时间需要750ms以上temp=readtemperature(); if(s==1){print(0x48," -");}print(0x48," "); print2(0x4b,temp/100+0x30);//百位 实际 温度十位数print2(0x4c,temp%100/10+0x30);//十位 实际 温度个位数print(0x4d,"."); //小数点print2(0x4e,temp%10+0x30);//个位 实际 温度小数位print2(0x4f,0); // ℃ }/*************************************主函数***************************************************/void main (void){ delay_ms(1000);//延时1SPWM_init(); //PWM初始化PWM=120;PWM0_set(PWM); //设置PWM0占空比 [0-255] 背光 默认值PWM1_set(PWM); //设置PWM1占空比 [0-255] 灰度 默认值init();//初始化 年月日时分秒 LCM2402_Init();//LCM2402初始化 MENU = 0 ;temp=readtemperature(); //读取温度值while(1){ //主线程//RealTime_Display(); if(DAY_BIT == 1){ //检查天数是否更新,是则计算公历month_day();//计算公历日期 DAY_BIT = 0;//计算完成后将日期变更标志位置0}/*调整时间日期**************************************************************************************/if(MENU == 0){if(TIME_SS%10==1){ WD_XS(); } //每10秒 【当秒数个位=1时】运行1次温度显示函数if(key1 == 0 && key2 == 1){ delay_ms(200);//去抖if(key1 == 0 && key2 == 1){MENU = 1;while(key1 == 0 || key2 == 0){ print(0x48," ");print(0x4a,"menuY"); } // 进入菜单1}}if(key2 == 0 && key1 == 1){ delay_ms(200);//去抖if(key2 == 0 && key1 == 1){PWM=PWM-10; //背光切换if(PWM<0){PWM=255;} // PWM0_set(PWM); //设置PWM占空比 [0-255] NPN 13001 8050 255全灭,0全亮。 print2(0x49,PWM/100+0x30); //print2(0x4a,(PWM-PWM/100*100)/10+0x30);//print2(0x4b,(PWM-PWM/100*100)%10+0x30);print(0x4c,"*");}}while(key1 == 0 || key2 == 0){ }} if(MENU == 1){if(key1 == 0 && key2 == 1){ delay_ms(200);//去抖if(key1 == 0 && key2 == 1){MENU = 2;while(key1 == 0 || key2 == 0){ print(0x48," ");print(0x4a,"menuM"); } // 进入菜单2}}if(key2 == 0 && key1 == 1){ delay_ms(200);//去抖if(key2 == 0 && key1 == 1){TIME_YY ++ ;if(TIME_YY > 99){TIME_YY = 0;}}}while(key1 == 0 || key2 == 0){ }} if(MENU == 2){print(0x4a,"menuM");if(key1 == 0 && key2 == 1){ delay_ms(200);//去抖if(key1 == 0 && key2 == 1){MENU = 3;while(key1 == 0 || key2 == 0){ print(0x48," ");print(0x4a,"menuD"); } // 进入菜单3}}if(key2 == 0 && key1 == 1){ delay_ms(200);//去抖if(key2 == 0 && key1 == 1){TIME_MO ++ ;if(TIME_MO > 12){TIME_MO = 1;}}}while(key1 == 0 || key2 == 0){ }} if(MENU == 3){if(key1 == 0 && key2 == 1){ delay_ms(200);//去抖if(key1 == 0 && key2 == 1){MENU = 4;while(key1 == 0 || key2 == 0){ print(0x48," "); print(0x4a,"menuW"); } // 进入菜单4}}if(key2 == 0 && key1 == 1){ delay_ms(200);//去抖if(key2 == 0 && key1 == 1){TIME_DD ++ ;if(TIME_DD > 31){TIME_DD = 1;}}}while(key1 == 0 || key2 == 0){ }} if(MENU == 4){if(key1 == 0 && key2 == 1){ delay_ms(200);//去抖if(key1 == 0 && key2 == 1){MENU = 5;while(key1 == 0 || key2 == 0){ print(0x48," ");print(0x4a,"menuH"); } // 进入菜单5}}if(key2 == 0 && key1 == 1){ delay_ms(200);//去抖if(key2 == 0 && key1 == 1){TIME_WW ++ ;if(TIME_WW > 7){TIME_WW = 1;}}}while(key1 == 0 || key2 == 0){ }} if(MENU == 5){if(key1 == 0 && key2 == 1){ delay_ms(200);//去抖if(key1 == 0 && key2 == 1){MENU = 6;while(key1 == 0 || key2 == 0){ print(0x48," "); print(0x4a,"menum"); } // 进入菜单6}}if(key2 == 0 && key1 == 1){ delay_ms(200);//去抖if(key2 == 0 && key1 == 1){TIME_HH ++ ;if(TIME_HH > 23){TIME_HH = 0;}}}while(key1 == 0 || key2 == 0){ }} if(MENU == 6){if(key1 == 0 && key2 == 1){ delay_ms(200);//去抖if(key1 == 0 && key2 == 1){MENU = 7;while(key1 == 0 || key2 == 0){ print(0x48," ");print(0x4a,"HuiDu");}// 进入菜单7}}if(key2 == 0 && key1 == 1){ delay_ms(200);//去抖if(key2 == 0 && key1 == 1){TIME_MM ++ ; TIME_SS=0;if(TIME_MM > 59){TIME_MM = 0;}}}while(key1 == 0 || key2 == 0){ }}if(MENU == 7) //调节灰度 对比度{if(key1 == 0 && key2 == 1){ delay_ms(200);//去抖if(key1 == 0 && key2 == 1){MENU = 8;while(key1 == 0 || key2 == 0){ print(0x48," "); print(0x4a,"--H--"); } // 进入菜单8闹铃时}}if(key2 == 0 && key1 == 1){ delay_ms(200);//去抖if(key2 == 0 && key1 == 1){PWM=PWM-10; //灰度切换if(PWM<0){PWM=255;} // PWM1_set(PWM); //设置PWM占空比 [0-255] NPN 13001 8050 255全灭,0全亮。 print2(0x49,PWM/100+0x30); //print2(0x4a,(PWM-PWM/100*100)/10+0x30);//print2(0x4b,(PWM-PWM/100*100)%10+0x30);print(0x4c,"*");}}while(key1 == 0 || key2 == 0){ }}if(MENU == 8){if(key1 == 0 && key2 == 1){ delay_ms(200);//去抖if(key1 == 0 && key2 == 1){MENU = 9;while(key1 == 0 || key2 == 0){ print(0x48," ");print(0x4a,"--m--"); } // 进入菜单9闹铃分}}if(key2 == 0 && key1 == 1){ delay_ms(200);//去抖if(key2 == 0 && key1 == 1){Clock_HH ++ ;print2(0x49,Clock_HH/10+0x30);//小时print2(0x4a,Clock_HH%10+0x30);print(0x4b,":"); // 显示cgram第一个字模":"//print2(0x4c,Clock_MM/10+0x30);//分钟print2(0x4d,Clock_MM%10+0x30);print(0x4e," ");if(Clock_HH > 23){Clock_HH = 0;}}}while(key1 == 0 || key2 == 0){ }}if(MENU == 9){if(key1 == 0 && key2 == 1){ delay_ms(200);//去抖if(key1 == 0 && key2 == 1){MENU = 0;while(key1 == 0 || key2 == 0){ print(0x48," "); } // 进入菜单0正常显示}}if(key2 == 0 && key1 == 1){ delay_ms(200);//去抖if(key2 == 0 && key1 == 1){Clock_MM ++ ;print2(0x49,Clock_HH/10+0x30);//小时print2(0x4a,Clock_HH%10+0x30);print(0x4b,":"); // 显示cgram第一个字模":"//print2(0x4c,Clock_MM/10+0x30);//分钟print2(0x4d,Clock_MM%10+0x30);print(0x4e," ");if(Clock_MM > 59){Clock_MM = 0;}}}while(key1 == 0 || key2 == 0){ }}/*调整时间日期结束***************************************************************************/if(Clock_MM==TIME_MM && Clock_HH==TIME_HH && Clock_MM > TIME_MM-1){ print(0x49,"clock!!"); //闹铃1分钟 }/*闹铃判断到定时显示clock!!*******************************************************************/ } //while(1)循环结束} //主循环结束/********************************************************************************************/ void tiem0(void) interrupt 1{ // T/C0中断服务程序(产生50ms时基信号) cou++; // 软计数器加1 if(cou > 19){ // 计数值到100(1s) cou = 0; // 软计数器清零 TIME_SS++; // 秒计数器加1(进位10ms*100=1s) if(TIME_SS > 59){ // 秒计数值到60 TIME_SS = 0; // 秒计数器清零 TIME_MM++; // 分计数器加1(进位60s=1m) if(TIME_MM > 59){ // 分计数到60 TIME_MM = 0; // 分计数器清零 TIME_HH++; // 时计数器加1(进位60m=1h) if(TIME_HH > 23){ // 时计数到23 TIME_HH = 0; // 时计数器清零DAY_BIT = 1; //天增加标志位 } } } } TH0 = 0x3c; // 重置定时常数 TL0 = 0xb0; }/*********************************************************************************************/ 上一页 1 2 下一页
评论