完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include "reg52.h"
#include "lcd1602.h" #include"ds1302.h" typedef unsigned char uchar; typedef unsigned int uint; ***it K1=P3^1; //选择调节的是时还是分还是秒 ***it K2=P3^0; //加数键 ***it K3=P3^2; // //连接外部中断0 ,停止时间的按键 ***it K4=P3^3; ***it feng = P1^6; uchar SetState,SetPlace,time_flag,clock_flag,alARM,temp; uchar ala_flag; uchar ala_hour/*闹钟的时*/,ala_min/*闹钟的分*/; uchar alarmClock[2]; //code alarmClock[2]; code修饰的变量是被写入ROM的不可以被修改,所以要去掉code uchar code nao[] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; void interConfiguration(); void LcdDisplay(); void Delay10ms(void); void setNianYueRiShiFenMiao(); //设置年月日时分秒 void set_clock_pattern(); //设置闹钟的模式 void alarm_clock(); //闹钟 void alarmDisplay(uchar ala1,uchar ala2); void main() { interConfiguration(); Ds1302Init(); init1602(); for(;;) { if(SetState != 1) //不在调节时间模式下时读出时间 { Ds1302ReadTime(); } if(clock_flag != 1) //闹钟模式下不显示在DS1302跑的时间 { LcdDisplay(); } else { alarmDisplay(ala_hour,ala_min); } if(alarmClock[0] == TIME[2] && alarmClock[1] == TIME[1]) ala_flag = 1; if(ala_flag) alarm_clock(); set_clock_pattern(); setNianYueRiShiFenMiao(); } } /******************************************************************************* * 函数名 : LcdDisplay() * 函数功能 : 显示函数 * 输入 : 无 * 输出 : 无 *******************************************************************************/ void LcdDisplay() { writeCmd1602(0x80+0X40); writeData1602('0'+TIME[2]/16); //时 writeData1602('0'+(TIME[2]&0x0f)); writeData1602(':'); writeData1602('0'+TIME[1]/16); //分 writeData1602('0'+(TIME[1]&0x0f)); writeData1602(':'); writeData1602('0'+TIME[0]/16); //秒 writeData1602('0'+(TIME[0]&0x0f)); writeCmd1602(0x80); writeData1602('2'); writeData1602('0'); writeData1602('0'+TIME[6]/16); //年 writeData1602('0'+(TIME[6]&0x0f)); writeData1602('-'); writeData1602('0'+TIME[4]/16); //月 writeData1602('0'+(TIME[4]&0x0f)); writeData1602('-'); writeData1602('0'+TIME[3]/16); //日 writeData1602('0'+(TIME[3]&0x0f)); writeCmd1602(0x8D); switch(TIME[5]&0x07) { case 0x01: writeData1602('M');writeData1602('o');writeData1602('n');break; case 0x02: writeData1602('T');writeData1602('u');writeData1602('e');break; case 0x03: writeData1602('W');writeData1602('e');writeData1602('d');break; case 0x04: writeData1602('T');writeData1602('h');writeData1602('u');break; case 0x05: writeData1602('F');writeData1602('r');writeData1602('i');break; case 0x06: writeData1602('S');writeData1602('a');writeData1602('t');break; case 0x07: writeData1602('S');writeData1602('u');writeData1602('n');break; } //writeData1602('0'+(TIME[5]&0x07)); //星期 } /******************************************************************************* * 函数名 : Int0Configuration() * 函数功能 : 配置外部中断0,外部中断1,和定时器中断0 * 输入 : 无 * 输出 : 无 *******************************************************************************/ void interConfiguration() { IT0=1;//跳变沿出发方式(下降沿) EX0=1;//打开INT0的中断允许。 EA=1;//打开总中断 } /******************************************************************************* * 函数名 : Int0() * 函数功能 : 外部中断0 中断函数 * 输入 : 无 * 输出 : 无 *******************************************************************************/ void Int0() interrupt 0 //按键3用来切换模式了 { Delay10ms(); if(K3==0) { while(!K3); SetState++; } } void setNianYueRiShiFenMiao() //设置年月日时分秒 { if(K1==0) //检测按键K1是否按下 { delay(5); //消除抖动 if(K1==0) { while(!K1); //检测按键是否松开 if(time_flag == 1) { SetPlace++; if(SetPlace>=7) SetPlace=0; } if(clock_flag == 1) { alarm++; if(alarm > 20) alarm = 0; } } } if(K2==0) //检测按键K2是否按下 { Delay10ms(); //消除抖动 if(K2==0) { while(!K2); //检测按键是否松kai if(time_flag == 1) { TIME[SetPlace]++; //数组是第一个元素标号是从零开始的,第六次调节的就是年 if((TIME[SetPlace]&0x0f)>9) //换成BCD码。 { TIME[SetPlace]=TIME[SetPlace]+6; } if((TIME[SetPlace]>=0x60)&&(SetPlace<2)) //分秒只能到59 { TIME[SetPlace]=0; } if((TIME[SetPlace]>=0x24)&&(SetPlace==2)) //小时只能到23 { TIME[SetPlace]=0; } if((TIME[SetPlace]>=0x32)&&(SetPlace==3)) //日只能到31 { TIME[SetPlace]=0; } if((TIME[SetPlace]>=0x13)&&(SetPlace==4)) //月只能到12 { TIME[SetPlace]=0; } if((TIME[SetPlace]>0x07)&&(SetPlace==5)) //周只能到7 { TIME[SetPlace]=1; } // if(SetPlace==5) //月只能到12 // { // TIME[SetPlace]=; // } } if(clock_flag == 1) { if((alarm % 2) == 0) { ala_hour++; alarmClock[0] = ala_hour; //将调好的闹钟时间的时存储起来,以便判断让校对时间是否到了 if(ala_hour > 24) ala_hour = 0; }else if((alarm%2) == 1) { ala_min++; alarmClock[1] = ala_min; //将调好的闹钟的分存储起来 if(ala_min>59) ala_min = 0; } } } } } void set_clock_pattern() //时钟模式选择,如调节年月日时分秒 { if(SetState > 0) { switch(SetState) { //读出DS1302正在运行的数据 case 1: //Ds1302Write(0x80,0x80)/*写数据、停止计数*/; time_flag = 1;//调节时间日期标志位置1 break; case 2: time_flag = 0; //时间日期调节标志位清零 Ds1302Init();/*把调节好的时间日期写入DS1302*/; case 3: ; case 4: clock_flag = 1;/*闹钟调节标志位置1*/; break; case 5: SetState = 0;//模式标志位清零 clock_flag = 0;//调节好闹钟 break; } } } void alarmDisplay(uchar ala1,uchar ala2) { writeCmd1602(0x80+0x40); writeData1602('A');//显示该符号表示处在闹钟模式下 writeData1602('R');//显示该符号表示处在闹钟模式下 writeData1602(' '); writeCmd1602(0x80+0x40+3); writeData1602(nao[ala1/10]); writeData1602(nao[ala1 %10]); writeData1602(':'); writeData1602(nao[ala2/10]); writeData1602(nao[ala2%10]); } void alarm_clock() //闹钟 { uchar i = 1000; while(i--) { feng = 0; delay(20); feng = 1; delay(20); if(K3 == 0 || K1 == 0 || K2==0 || K4 ==0) { SetState = 0; ala_flag = 0; break; } } ala_flag = 0; } /******************************************************************************* * 函数名 : Delay10ms * 函数功能 : 延时函数,延时10ms * 输入 : 无 * 输出 : 无 *******************************************************************************/ void Delay10ms(void) //误差 0us { unsigned char a,b,c; for(c=1;c>0;c--) for(b=38;b>0;b--) for(a=130;a>0;a--); } 程序如上1602写和1302读写没问题,1602显示的秒会之跳变显示(比如上一次显示1,下一次就显示4),还有那按键失灵,调了两三天了还是不行,头痛啊,求大神帮忙,跪求大神帮忙。 |
|
相关推荐
3个回答
|
|
|
|
你在按键中断标志位上的处理不太准确,具体的参考我在其他论坛的分享吧 http://www.prechin.net/forum.php ... tid=1117&extra=
|
|
|
|
为什么你的程序移植过去,显示出现乱码的
|
|
|
|
只有小组成员才能发言,加入小组>>
3320 浏览 9 评论
3000 浏览 16 评论
3497 浏览 1 评论
9069 浏览 16 评论
4090 浏览 18 评论
1190浏览 3评论
612浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
603浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2339浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1899浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 22:12 , Processed in 1.165685 second(s), Total 82, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号