1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 3htech 于 2012-12-11 21:10 编辑
实现电子时钟的功能,并可以通过按键调时间#include unsigned char i=20,led0=0,led1=0,led2=0,led3=0,led4=0,led5=0,sec=0,min=0,min1=0,min2=0,hour1=0,hour2,hour=0;unsigned char display[10]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f}; void delay(unsigned char x) //延时函数程序 { unsigned char k; while(x--) for(k=0;k<125;k++) {} } void button() { switch(P0) //BUTTON { case 0xfe:P2=0xfc; P1=led2; delay(1); //led2 min1 min1++; if(min1==10) { min1=0; } led2=display[min1]; break; case 0xfd: P2=0xfb; P1=led3; delay(1); //led3 min2 min2++; if(min2==10) { min2=0; } led3=display[min2]; break; case 0xfb: P2=0xf9; P1=led4; delay(1); //led4 hour1 hour1++; if(hour1==2) { hour1=0; } led4=display[hour1]; break; case 0xf7: P2=0xf8; P1=led5; delay(1); //led5 hour2 hour2++; if(hour2==10) { hour2=0; } led5=display[hour2]; break; } } void main( ) //主函数 { TMOD=0x01; TH0=0x3c; TL0=0xb0; EA=1; ET0=1; TR0=1; while(1) //74LS138选址 { button(); P2=0xff; P1=led0; delay(1); P2=0xfe; P1=led1; delay(1); P2=0xfc; P1=led2; delay(1); P2=0xfb; P1=led3; delay(1); P2=0xf9; P1=led4; delay(1); P2=0xf8; P1=led5; delay(1); } } void T0_int(void) interrupt 1 //中断程序{ TH0=0x3c; TL0=0xb0; i--; if(i<=0) { sec++; if(sec==60) { sec=0; min++; } led0=display[sec%10]; led1=display[sec/10]; if(min==60) { min=0; hour++; } led2=display[min%10]; led3=display[min/10]; if(hour==24) { hour=0; } led4=display[hour%10]; led5=display[hour/10]; i=20; }} 可以正常的运行,但就是按键不了,求解答
|
|
相关推荐
13 个讨论
|
|
#include unsigned char i=20,led0=0,led1=0,led2=0,led3=0,led4=0,led5=0,sec=0,min=0,min1=0,min2=0,hour1=0,hour2,hour=0; unsigned char display[10]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f}; ***it s1=P0^0; //定义按键 分钟的个位按键 --每按一次++ ***it s2=P0^1; //定义按键 分钟的十位按键 每按一次++ ***it s3=P0^2; //定义按键 小时的按键 每按一次++ void delay(unsigned char x) //延时函数程序 { unsigned char k; while(x--) for(k=0;k<125;k++){} } void button() { unsigned char key; key=P0; P0=0xff; if(P0!=0xff) //判断是否有按键 { delay(20); if(P0!=0xff) { if(P0==0xfe)//检测右数第一个按键,分钟的个位 { delay(10); if(P0==0xfe) { TR0=0; min1++; if(min1==10) { min1=0; } led2=display[min1]; } } if(P0==0xfd) //检测右数第二个按键,分钟的十位 { if(P0==0xfd) { delay(10); if(P0==0xfd) { TR0=0; min2++; if(min2==10) { min2=0; } led3=display[min2]; } }} if(P0==0xfb) //检测右数第三个按键,调整小时的 { delay(10); if(P0==0xfb) { TR0=0; hour++; if(hour==24) { hour=0; } led4=display[hour%10]; led5=display[hour/10]; } } } } } /*switch(key) //BUTTON { case 0xfe: delay(5); //led2 min1 min1++; if(min1==10) { min1=0; } led2=display[min1]; break; case 0xfd: delay(5); //led3 min2 min2++; if(min2==10) { min2=0; } led3=display[min2]; break; case 0xfb: delay(5); //led4 hour1 hour1++; if(hour1==2) { hour1=0; } led4=display[hour1]; break; case 0xf7: delay(5); //led5 hour2 hour2++; if(hour2==10) { hour2=0; } led5=display[hour2]; break; } } }} */ void main( ) //主函数 { TMOD=0x01; TH0=0x3c; TL0=0xb0; EA=1; ET0=1; TR0=1; while(1) //74LS138选址 { button(); P2=0xff; P1=led0; delay(1); P2=0xfe; P1=led1; delay(1); P2=0xfc; P1=led2; delay(1); P2=0xfb; P1=led3; delay(1); P2=0xf9; P1=led4; delay(1); P2=0xf8; P1=led5; delay(1); } } void T0_int(void) interrupt 1 //中断程序 { TH0=0x3c; TL0=0xb0; i--; /*P2=0xff; P1=led0; delay(1); P2=0xfe; P1=led1; delay(1); P2=0xfc; P1=led2; delay(1); P2=0xfb; P1=led3; delay(1); P2=0xf9; P1=led4; delay(1); P2=0xf8; P1=led5; delay(1);*/ if(i<=0) { sec++; if(sec==60) { sec=0; min++; } led0=display[sec%10]; led1=display[sec/10]; if(min==60) { min=0; hour++; } led2=display[min%10]; led3=display[min/10]; if(hour==24) { hour=0; } led4=display[hour%10]; led5=display[hour/10]; i=20; } } 现在修成这样,时钟能正常的走,就是按键不灵 |
|
|
|
|
|
#include
unsigned char i=20,led0=0,led1=0,led2=0,led3=0,led4=0,led5=0,sec=0,min=0,hour=0; unsigned char display[10]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f}; ***it s1=P0^0; //定义按键 秒的按键 --每按一次++ ***it s2=P0^1; //定义按键 分钟的按键 每按一次++ ***it s3=P0^2; //定义按键 小时的按键 每按一次++ void delay(unsigned char x) //延时函数程序 { unsigned char k; while(x--) for(k=0;k<125;k++){} } void button() { P0=0xff; if(P0!=0xff) //判断是否有按键 { delay(20); if(P0!=0xff) { if(s1==0)//检测右数第一个按键,秒 { delay(20); if(s1==0) { sec++; if(60<=sec) { sec=0; } led0=display[sec%10]; led1=display[sec/10]; TR0=1; } } if(s2==0) //检测右数第二个按键,分 { if(s2==0) { delay(20); if(P0==0xfd) { min++; if(60<=min) { min=0; } led2=display[min%10]; led3=display[min/10]; TR0=1; } }} if(s3==0) //检测右数第三个按键,时 { delay(20); if(s3==0) { hour++; if(24<=hour) { hour=0; } led4=display[hour%10]; led5=display[hour/10]; TR0=1; } } } } } void main( ) //主函数 { TMOD=0x01; TH0=0x3c; TL0=0xb0; EA=1; ET0=1; TR0=1; while(1) //74LS138选址 { button(); P2=0xff; P1=led0; delay(1); P2=0xfe; P1=led1; delay(1); P2=0xfc; P1=led2; delay(1); P2=0xfb; P1=led3; delay(1); P2=0xf9; P1=led4; delay(1); P2=0xf8; P1=led5; delay(1); } } void T0_int(void) interrupt 1 //中断程序 { TH0=0x3c; TL0=0xb0; i--; if(i<=0) { sec++; if(60<=sec) { sec=0; min++; } led0=display[sec%10]; led1=display[sec/10]; if(min==60) { min=0; hour++; } led2=display[min%10]; led3=display[min/10]; if(hour==24) { hour=0; } led4=display[hour%10]; led5=display[hour/10]; i=20; } } 已经可以用按键了,但每按一下就加很多次4到5下,长按的话就一直加,怎么解决这问题呢?每按一下只加一下
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-31 02:27 , Processed in 0.707397 second(s), Total 66, Slave 56 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号