完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
`程序仿真没有问题 但在实际时,调时间总是加在最后一位, 光标可以从前调到后 不论光标停留在那个位置 , 加减总是在最后一位上变化 望高手指点 应该怎么修改 #include #include #include #define uchar unsigned char #define uint unsigned int ***it rs=P2^7; ***it rw=P2^6; ***it e=P2^5; ***it buz=P3^4;//闹铃位 ***it dat=P2^3; ***it clk=P2^4; ***it rst=P2^2; ***it set=P1^0;//按键 ***it up=P1^1; ***it down=P1^2; ***it fn=P1^3; uchar station=0;//按键状态 bit flag=0;//50ms标志位 bit flag_c=0;//闹钟启动标志位 bit flag_clock=1;//闹钟开,闹钟关 uchar counter_c=0;//闹钟时长计数器 uchar counter_c1=0; uchar week=0; char str[16]="Gzy 20 - - "; char str1[16]="c- : :"; //以下为1602函数 void delay_us(uchar us);//延时微秒 void delay_ms(uchar ms);//延时毫秒 void write_com(uchar c);//写指令 void write_data(uchar c);//写数据 void show_char(uchar pos,uchar c);//显示单个字符 void show_str(uchar line,char *str);//显示字符串 void ini_lcd();//初始化LCD //以下为DS1302函数 void write_byte(uchar temp);//写 void write_1302(uchar add,uchar dat);//写1302 uchar read_1302(uchar add);//读1302数据 void update_time();//更新时间 void clock();//闹钟启动标志置1 void alarm();//闹铃 void key_scan();//按键扫描 void InitTimer1(void); void main() { P1=0x0f; ini_lcd(); InitTimer1(); buz=0; show_str(0,str); show_str(1,str1); while(1){ if(flag==1){ flag=0; clock(); alarm(); } key_scan(); } } void Timer1Interrupt(void) interrupt 3 { TH1 = 0x3C; TL1 = 0x0B0; flag=1; if((flag_c==1)&&(flag_clock==1)){ counter_c++; if(counter_c==19) buz=~buz; } } //以下为函数实体 void InitTimer1(void) { TMOD = 0x10; TH1 = 0x3C; TL1 = 0x0B0; EA = 1; ET1 = 1; TR1 = 1; } void delay_us(uchar us) { uchar c_us; c_us=us>>1; while(--c_us); } void delay_ms(uchar ms) { while(--ms){ delay_us(250); delay_us(250); delay_us(250); delay_us(250); } } void write_com(uchar c) { e=0; rs=0; // rw=0; // _nop_(); // e=1; delay_ms(10); P0=c; delay_ms(10); e=1; delay_ms(10); e=0; delay_ms(10); } void write_data(uchar c) { //delay_ms(5); e=0; rs=1; // rw=0; // _nop_(); // e=1; delay_ms(10); P0=c; delay_ms(10); e=1; delay_ms(10); e=0; delay_ms(10); } void show_char(uchar pos,uchar c) { uchar p; if(pos>=0x10) p=pos+0xb0; else p=pos+0x80; write_com(p); write_data(c); } void show_str(uchar line,char *str) { uchar l,i; l=line<<4; for(i=0;i<16;i++) show_char(l++,*(str+i)); } void ini_lcd() { //delay_ms(15); rw=0; write_com(0x38); delay_ms(10); write_com(0x06);//显示光标移动位置 delay_ms(10); write_com(0x0c); delay_ms(10); write_com(0x01);//显示清屏 } void write_byte(uchar temp) { uchar i; for(i=0;i<8;i++){ clk=0; dat=temp&0x01; temp>>=1; clk=1; } } void write_1302(uchar add,uchar dat) { rst=0; _nop_(); clk=0; _nop_(); rst=1; _nop_(); write_byte(add); write_byte(dat); rst=0; //_nop_(); } uchar read_1302(uchar add) { uchar i,temp=0x00; rst=0; //_nop_(); clk=0; //_nop_(); rst=1; //_nop_(); write_byte(add); for(i=0;i<8;i++){ if(dat) temp|=0x80; //每次传输低字节 //clk=0; temp>>=1; clk=1; clk=0; } clk=1; rst=0; /*_nop_(); //以下为DS1302复位的稳定时间 rst=0; clk=0; _nop_(); clk=1; _nop_(); dat=0; _nop_(); dat=1; _nop_();*/ return (temp); } void update_time() { uchar temp; temp=read_1302(0x81);//秒 if(str1[15]!=temp%16+0x30){ str1[15]=temp%16+0x30; str1[14]=temp/16+0x30; show_char(0x1f,str1[15]); show_char(0x1e,str1[14]); } temp=read_1302(0x83);//分 if(str1[12]!=temp%16+0x30){ str1[12]=temp%16+0x30; str1[11]=temp/16+0x30; show_char(0x1c,str1[12]); show_char(0x1b,str1[11]); } temp=read_1302(0x85);//时 if(str1[9]!=temp%16+0x30){ str1[9]=temp%16+0x30; str1[8]=temp/16+0x30; show_char(0x19,str1[9]); show_char(0x18,str1[8]); } temp=read_1302(0x8b);//星期 if(week!=temp){ week=temp; switch (temp){ case 2:week=2;str[14]='M';str[15]='o';break; case 3:week=3;str[14]='T';str[15]='u';break; case 4:week=4;str[14]='W';str[15]='e';break; case 5:week=5;str[14]='T';str[15]='h';break; case 6:week=6;str[14]='F';str[15]='r';break; case 7:week=7;str[14]='S';str[15]='a';break; case 1:week=7;str[14]='S';str[15]='u';break; } show_char(0x0f,str[15]); show_char(0x0e,str[14]); } temp=read_1302(0x8d);//年 if(str[7]!=temp%16+0x30){ str[6]=temp/16+0x30; str[7]=temp%16+0x30; show_char(0x06,str[6]); show_char(0x07,str[7]); } temp=read_1302(0x89);//月 if(str[10]!=temp%16+0x30){ str[9]=temp/16+0x30; str[10]=temp%16+0x30; show_char(0x09,str[9]); show_char(0x0a,str[10]); } temp=read_1302(0x87);//日 if(str[13]!=temp%16+0x30){ str[12]=temp/16+0x30; str[13]=temp%16+0x30; show_char(0x0c,str[12]); show_char(0x0d,str[13]); } if(flag_clock==0){ if(str1[2]!='o'){ str1[2]='o'; str1[3]='f'; str1[4]='f'; str1[5]=' '; str1[6]=' '; show_char(0x12,str1[2]); show_char(0x13,str1[3]); show_char(0x14,str1[4]); show_char(0x15,str1[5]); show_char(0x16,str1[6]); } } else{ temp=read_1302(0xc1);//闹钟时 if(str1[3]!=temp%16+0x30){ str1[2]=temp/16+0x30; str1[3]=temp%16+0x30; show_char(0x12,str1[2]); show_char(0x13,str1[3]); str1[4]=':'; show_char(0x14,str1[4]); } temp=read_1302(0xc3);//闹钟分 if(str1[6]!=temp%16+0x30){ str1[5]=temp/16+0x30; str1[6]=temp%16+0x30; show_char(0x15,str1[5]); show_char(0x16,str1[6]); } } //显示2行 //show_str(1,str1); //show_str(0,str); } void clock() { uchar h,m,temp1,temp2; h=read_1302(0x85);//时 m=read_1302(0x83);//分 temp1=read_1302(0xc1);//读RAM数据0,存闹钟时数据 temp2=read_1302(0xc3);//读RAM数据2,存闹钟分数据 if((temp1==h)&&(temp2==m)) flag_c=1; } void alarm() { if(flag_c==1){ if(counter_c>=20)//闹钟响20*50ms=1s { counter_c=0; counter_c1++; if(counter_c1>=60){//60*1s=60s counter_c1=0; flag_c=0; counter_c=0; buz=0; } } } } void key_scan() { uchar temp; if(set==0) { delay_ms(10); if(set==0) { while(set==0); station++; if(station>11) station=0; } } if(fn==0) { delay_ms(10); if(fn==0) { while(fn==0); station--; if(station>11) station=1; if(station==0) station=1; } } switch (station){ case 0: /* //temp=read_1302(0x81); //if(temp>>7) //if((temp&0x80)==0x80) //write_1302(0x80,temp&0x7f); //write_com(0x38); //write_com(0x06);//显示光标移动位置 //write_com(0x0c);*/ if(str[0]!='G'){ str[0]='G'; str[1]='z'; str[2]='y'; show_char(0x00,str[0]); show_char(0x01,str[1]); show_char(0x02,str[2]); } update_time(); break; case 1: //调年 if(str[0]!='S'){ str[0]='S'; str[1]='e'; str[2]='t'; show_char(0x00,str[0]); show_char(0x01,str[1]); show_char(0x02,str[2]); } temp=read_1302(0x81); write_1302(0x80,temp|0x80); write_com(0x0e); //光标显示 write_com(0x80+7);//光标位置 if(up==0){ delay_ms(10); if(up==0){ while(up==0); temp=read_1302(0x8d); temp++; if(temp%16>9) temp=(temp&0xf0)+16;//个位数清零,十位数进一 if(temp>0x79) temp=0x79; write_1302(0x8c,temp); update_time(); } } if(down==0){ delay_ms(10); if(down==0){ while(down==0); temp=read_1302(0x8d); temp--; if(temp%16>9) temp=temp&0xf0+9; if(temp>79) temp=0; write_1302(0x8c,temp); update_time(); } } break; case 2: //调月 write_com(0x80+10); if(up==0){ delay_ms(10); if(up==0){ while(up==0); temp=read_1302(0x89); temp++; if(temp%16>9) temp=(temp&0xf0)+16; if(temp>0x12) temp=0x12; write_1302(0x88,temp); update_time(); } } if(down==0){ delay_ms(10); if(down==0){ while(down==0); temp=read_1302(0x89); temp--; if(temp%16>9) temp=temp&0xf0+9; if(temp>0x12) temp=0x01; if(temp==0) temp=0x01; write_1302(0x88,temp); update_time(); } } break; case 3: //调日 write_com(0x80+13); if(up==0){ delay_ms(10); if(up==0){ while(up==0); temp=read_1302(0x87); temp++; if(temp%16>9) temp=(temp&0xf0)+16; switch (read_1302(0x89)){ case 0x01: case 0x03: case 0x05: case 0x07: case 0x08: case 0x10: case 0x12: if(temp>0x31) temp=0x31; break; case 2: switch (read_1302(0x8d)%4){ case 0: if(temp>0x29) temp=0x29; break; default : if(temp>0x28) temp=0x28; break; } case 0x04: case 0x06: case 0x11: if(temp>0x30) temp=0x30; break; } write_1302(0x86,temp); update_time(); } } if(down==0){ delay_ms(10); if(down==0){ while(down==0); temp=read_1302(0x87); temp--; if(temp%16>9) temp=temp&0xf0+9; if(temp>0x31) temp=0x01; if(temp==0) temp=0x01; write_1302(0x86,temp); update_time(); } } break; case 4: //调星期 write_com(0x80+15); if(up==0){ delay_ms(10); if(up==0){ while(up==0); temp=read_1302(0x8b); temp++; if(temp>0x07) temp=0x07; write_1302(0x8a,temp); update_time(); } } if(down==0){ delay_ms(10); if(down==0){ while(down==0); temp=read_1302(0x8b); temp--; if(temp==0) temp=0x01; write_1302(0x8a,temp); update_time(); } } break; case 5: //闹钟开关 write_com(0x80+0x40); if(up==0){ delay_ms(10); if(up==0){ while(up==0); flag_clock=~flag_clock; update_time(); } } if(down==0){ delay_ms(10); if(down==0){ while(down==0); flag_clock=~flag_clock; update_time(); } } break; case 6: //调闹钟时 if(flag_clock==1){ write_com(0x80+0x40+3); if(up==0){ delay_ms(10); if(up==0){ while(up==0); temp=read_1302(0xc1); temp++; if(temp%16>9) temp=(temp&0xf0)+16; if(temp>0x23) temp=0x23; write_1302(0xc0,temp); update_time(); } } if(down==0){ delay_ms(10); if(down==0){ while(down==0); temp=read_1302(0xc1); temp--; if(temp%16>9) temp=temp&0xf0+9; if(temp>0x23) temp=0; if(temp==0x00) temp=0x00; write_1302(0xc0,temp); update_time(); } } } else station=8; break; case 7: //调闹钟分 if(flag_clock==1){ write_com(0x80+0x40+6); if(up==0){ delay_ms(10); if(up==0){ while(up==0); temp=read_1302(0xc3); temp++; if(temp%16>9) temp=(temp&0xf0)+16; if(temp>0x59) temp=0x59; write_1302(0xc2,temp); update_time(); } } if(down==0){ delay_ms(10); if(down==0){ while(down==0); temp=read_1302(0xc3); temp--; if(temp%16>9) temp=temp&0xf0+9; if(temp==0x00) temp=0; if(temp>0x59) temp=0x00; write_1302(0xc2,temp); update_time(); } } } else station=8; break; case 8: //调时 write_com(0x80+0x40+9); if(up==0){ delay_ms(10); if(up==0){ while(up==0); temp=read_1302(0x85); temp++; if(temp%16>9) temp=(temp&0xf0)+16; if(temp>0x23) temp=0x23; write_1302(0x84,temp); update_time(); } } if(down==0){ delay_ms(10); if(down==0){ while(down==0); temp=read_1302(0x85); temp--; if(temp%16>9) temp=temp&0xf0+9; if(temp>0x23) temp=0; if(temp==0x00) temp=0; write_1302(0x84,temp); update_time(); } } break; case 9: //调分 write_com(0x80+0x40+12); if(up==0){ delay_ms(10); if(up==0){ while(up==0); temp=read_1302(0x83); temp++; if(temp%16>9) temp=(temp&0xf0)+16; if(temp>0x59) temp=0x59; write_1302(0x82,temp); update_time(); } } if(down==0){ delay_ms(10); if(down==0){ while(down==0); temp=read_1302(0x83); temp--; if(temp%16>9) temp=temp&0xf0+9; if(temp>0x59) temp=0; if(temp==0x00) temp=0; write_1302(0x82,temp); update_time(); } } break; case 10: //调秒 write_com(0x80+0x40+15); if(up==0){ delay_ms(10); if(up==0){ while(up==0); temp=read_1302(0x81); temp++; if(temp%16>9) temp=(temp&0xf0)+16; if(temp>0x59) temp=0x59; write_1302(0x80,temp|0x80);//注意把最高位置1,以免在调秒过程中时钟启动 update_time(); } } if(down==0){ delay_ms(10); if(down==0){ while(down==0); temp=read_1302(0x81); temp--; if(temp%16>9) temp=temp&0xf0+9; if(temp==0) temp=0; if(temp>0x59) temp=0; write_1302(0x80,temp|0x80);//注意把最高位置1,以免在调秒过程中时钟启动 update_time(); } } break; case 11: //write_com(0x80+2); if(str[0]!='O'){ str[0]='O'; str[1]='K'; str[2]='?'; show_char(0x00,str[0]); show_char(0x01,str[1]); show_char(0x02,str[2]); } write_com(0x80+2); if(set==0){ delay_ms(10); if(set==0){ while(set==0); temp=read_1302(0x81); write_1302(0x80,temp&0x7f);//时间启动 write_com(0x06);//显示光标移动位置 write_com(0x0c); update_time(); station=0; } } break; } } ` ![]() |
|
相关推荐
1个回答
|
|
可能是前一位上写的有数据,你得把它清空,好久没用过1602了,基本忘完了
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
飞凌嵌入式-ELFBOARD 解决PCB布线时无法捕捉到焊盘中心的问题
176 浏览 0 评论
Openharmony软件评估指南-米尔瑞芯微RK3568开发板
700 浏览 0 评论
STM32CUBEMX(7)--移植雅特力AT32F403AVGT(兼容STM32F103VGT6),DAC输出电压
1097 浏览 0 评论
【RA-Eco-RA0E1-32PIN-V1.0开发板试用】开发板简介与上电测试
1004 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-shell脚本编写之传参
555 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11051 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-11 09:56 , Processed in 0.776230 second(s), Total 71, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191