完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include
unsigned char led[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00}; //用一维数组定义0-9、横杠、全灭 unsigned char num[10]={2,0,0,8,0,1,1,6,6,8} ; unsigned char a[6]; unsigned char second=0,minute=0,hour=12; unsigned char minute1=0,hour1=0,zdbs=0; unsigned char b[6]={0x7f,0xbf,0xdf,0xf7,0xfb,0xfd}; //扫描 unsigned char k=0; unsigned int temp; // 记录1000毫秒为1秒的变量 unsigned char M,S_flag; //M是模式,更新时间的4种模式加上正常模式 S_flag闪烁标志 ***it K1=P3^0; //设置键 ***it K2=P3^1; //增加键 ***it K3=P3^2; //减少键 ***it BEEP=P1^3; //蜂鸣器报警 void delay(unsigned n) //0.2毫秒 { int x,y; for(x=0;x } void init() //定时器初始化 { M=0; S_flag=0; //闪烁标志位 TMOD=0x10; //定时器1以方式1定时 TH1=0xfc; TL1=0x18; EA=1; //打开总中断 ET1=1; //允许定时器1中断 TR1=1; //开启定时器1 (开始定时计数) } void time1() interrupt 3 //定时器1中断函数 { TH1=0xfc; //定时1ms TL1=0x18; temp++; if(temp==1000) //配合定时器定时1s { temp=0; second++; } if(second==60) { second=0; if(minute<59) minute++; else { minute=0; hour++; hour%=24; } } if((hour1==hour&&minute1==minute&&second<10)||(zdbs==minute&&second<1)) //闹钟时间到 { BEEP=0; } else {BEEP=1;} if(temp%250==0) //每250ms S_flag=!S_flag; //闪烁标志位取反 if(k==6) k=0; P0=a[k]; P2=b[k++]; delay(3); P2=0xff; //BEEP=1; } void display() //显示函数 { switch(M) { case 0: { a[0]=led[hour/10]; //秒 a[1]=led[hour%10]|0x80; a[2]=led[minute/10]; //分 a[3]=led[minute%10]|0x80; a[4]=led[second/10]; //时 a[5]=led[second%10]; }break; case 1: { if(S_flag==1) { a[0]=led[hour/10]; a[1]=led[hour%10]|0x80; } else { a[0]=led[11]; a[1]=led[11]; } a[2]=led[minute/10]; a[3]=led[minute%10]|0x80; a[4]=led[second/10]; a[5]=led[second%10]; }break; case 2: { a[0]=led[hour/10]; a[1]=led[hour%10]|0x80; if(S_flag==1) { a[2]=led[minute/10]; a[3]=led[minute%10]|0x80; } else { a[2]=led[11]; a[3]=led[11]; } a[4]=led[second/10]; a[5]=led[second%10]; }break; case 3: { if(S_flag==1) { a[0]=led[hour1/10]; a[1]=led[hour1%10]|0x80; } else { a[0]=led[11]; a[1]=led[11]; } a[2]=led[minute1/10]; a[3]=led[minute1%10]|0x80; a[4]=led[11]; a[5]=led[11]; }break; case 4: { a[0]=led[hour1/10]; a[1]=led[hour1%10]|0x80; if(S_flag==1) { a[2]=led[minute1/10]; a[3]=led[minute1%10]|0x80; } else { a[2]=led[11]; a[3]=led[11]; } a[4]=led[11]; a[5]=led[11]; } } } void key_prc() //按键 { if(K1==0) { delay(10); //延时去抖 if(K1==0) //按K1进行模式切换 { M++; if(M==5) M=0; } while(!K1);//等待按键释放 } if(M!=0) { switch(M) { case 1: //模式1——调时 { if(K2==0) { delay(10); //延时去抖 if(K2==0) //加键按下 { if(hour<23) hour++; else hour=0; } while(!K2); //等待按键释放 } if(K3==0) { delay(10); if(K3==0) { if(hour> 0) hour--; else hour=23; } while(!K3); } } break; case 2: //模式2——调分 { if(K2==0) { delay(10); if(K2==0) { if(minute<59) minute++; else minute=0; } while(!K2); } if(K3==0) { delay(10); if(K3==0) { if(minute>0) minute--; else minute=59; } while(!K3); } } break; case 3: //模式3——闹钟调时 { if(K2==0) { delay(10); if(K2==0) { if(hour1<23) hour1++; else hour1=0; } while(!K2); } if(K3==0) { delay(10); if(K3==0) { if(hour1>0) hour1--; else hour1=23; } while(!K3); } } break; case 4: //模式4——闹钟调分 { if(K2==0) { delay(10); if(K2==0) { if(minute1<59) minute1++; else minute1=0; } while(!K2); } if(K3==0) { delay(10); //延时去抖 if(K3==0) //减键按下 { if(minute1>0) minute1--; else minute1=59; } while(!K3); } } break; } } } void main() { BEEP=1; init(); while(1) { key_prc(); display(); } }
|
|
相关推荐
3个回答
|
|
谢谢各位大神了 我真的很急啊
|
|
|
|
你的显示函数有问题,本来程序显示乱码!改如下才正常显示,void display() //显示函数
{ switch(M) { case 0: { P0=a[0]=led[hour/10]; //秒 P2=b[1]; delay(10); P0=a[1]=led[hour%10]|0x80; P2=b[2]; delay(10); P0=a[2]=led[minute/10]; //分 P2=b[3]; delay(10); P0=a[3]=led[minute%10]|0x80; P2=b[4]; delay(10); P0=a[4]=led[second/10]; //时 P2=b[5]; delay(10); P0=a[5]=led[second%10]; P2=b[6]; delay(10); }break; case 1: { if(S_flag==1) { P0=a[0]=led[hour/10]; P2=b[1]; delay(10); P0=a[1]=led[hour%10]|0x80; P2=b[2]; delay(10); } else { P0=a[0]=led[11]; P2=b[1]; delay(10); P0=a[1]=led[11]; P2=b[2]; delay(10); } P0=a[2]=led[minute/10]; P2=b[3]; delay(10); P0=a[3]=led[minute%10]|0x80; P2=b[4]; delay(10); P0=a[4]=led[second/10]; P2=b[5]; delay(10); P0=a[5]=led[second%10]; P2=b[6]; delay(10); }break; case 2: { P0=a[0]=led[hour/10]; P2=b[1]; delay(10); P0=a[1]=led[hour%10]|0x80; P2=b[2]; delay(10); if(S_flag==1) { P0=a[2]=led[minute/10]; P2=b[3]; delay(10); P0=a[3]=led[minute%10]|0x80; P2=b[4]; delay(10); } else { P0=a[2]=led[11]; P2=b[3]; delay(10); P0=a[3]=led[11]; P2=b[4]; delay(10); } P0=a[4]=led[second/10]; P2=b[5]; delay(10); P0=a[5]=led[second%10]; P2=b[6]; delay(10); }break; case 3: { if(S_flag==1) { P0=a[0]=led[hour1/10]; P2=b[1]; delay(10); P0=a[1]=led[hour1%10]|0x80; P2=b[2]; delay(10); } else { P0=a[0]=led[11]; P2=b[1]; delay(10); P0=a[1]=led[11]; P2=b[2]; delay(10); } P0=a[2]=led[minute1/10]; P2=b[3]; delay(10); P0=a[3]=led[minute1%10]|0x80; P2=b[4]; delay(10); P0=a[4]=led[11]; P2=b[5]; delay(10); P0=a[5]=led[11]; P2=b[6]; delay(10); }break; case 4: { P0=a[0]=led[hour1/10]; P2=b[1]; delay(10); P0=a[1]=led[hour1%10]|0x80; P2=b[2]; delay(10); if(S_flag==1) { P0=a[2]=led[minute1/10]; P2=b[3]; delay(10); P0=a[3]=led[minute1%10]|0x80; P2=b[4]; delay(10); } else { P0=a[2]=led[11]; P2=b[3]; delay(10); a[3]=led[11]; P2=b[4]; delay(10); } P0=a[4]=led[11]; P2=b[5]; delay(10); P0=a[5]=led[11]; P2=b[6]; delay(10); } } } |
|
|
|
从电路看,单片机还有空余的引脚,如何加时钟芯片,在于你选的时钟芯片,根据芯片连接引脚,再编写对应的程序就可以了
|
|
|
|
只有小组成员才能发言,加入小组>>
求解外围电路实现的是4脚给持续低电平复位并正常工作,高电平不工作的原因
2096 浏览 1 评论
3648 浏览 3 评论
PIC1946程序有一个变量在运行过程中恢复初始值其他变量保持不变
2345 浏览 2 评论
2774 浏览 0 评论
PIC16F1825的RC5引脚,在主程序中操作无效,在中断中可以改变是为什么?
4058 浏览 5 评论
1000浏览 0评论
用XC8编译PIC18F25K80时提示下面Error,求怎么解决这个问题
6386浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 18:16 , Processed in 0.925239 second(s), Total 82, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号