完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
#include
#define uchar unsigned char #define uint unsigned int uchar temp1,temp2,temp3,aa,miaoshi,miaoge,fenshi,fenge,shishi,shige; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00}; void display(uchar shishi,uchar shige,uchar fenshi,uchar fenge,uchar miaoshi,uchar miaoge); ***it S1=P1^0; ***it S2=P1^1; ***it S3=P1^2; void delay(uint z); void init(); void main() { init(); while(1) { if(S1==0) { temp3++; while(S1==0); } if(S2==0) { temp2++; while(S2==0); } if(S3==0) { temp1++; while(S3==0); } if(aa==20) { aa=0; temp1++; if(temp1==60) { temp1=0; temp2++; } if(temp2==60) { temp2=0; temp3++; } if(temp3==24) { temp3=0; } miaoshi=temp1/10; miaoge=temp1%10; fenshi=temp2/10; fenge=temp2%10; shishi=temp3/10; shige=temp3%10; } display(shishi,shige,fenshi,fenge,miaoshi,miaoge); } } void delay(uint z) { uchar x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void display(uchar shishi,uchar shige,uchar fenshi,uchar fenge,uchar miaoshi,uchar miaoge) { P2=0xbf; P0=table[miaoshi]; delay(5); P2=0x7f; P0=table[miaoge]; delay(5); P2=0xf7; P0=table[fenshi]; delay(5); P2=0xef; P0=table[fenge]; delay(5); P2=0xfe; P0=table[shishi]; delay(5); P2=0xfd; P0=table[shige]; delay(5); P2=0xdf; P0=0x40; delay(5); P2=0xfb; P0=0x40; delay(5); } void init() { temp1=0; temp2=0; temp3=0; TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; } void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; aa++; } 程序如上,还有仿真图,现在按键按下去,所有数码管的都会闪一下再加一,S3仿真图里我去掉了,用不上。
|
|
相关推荐
2 个讨论
|
|
|
你的按键扫描程序有毛病,给你一个类似的时钟程序,关键是看怎么处理按键不影响显示的。
//K1键调整小时,K2键调整分钟 #include #include #define uint unsigned int //宏定义 #define uchar unsigned char //宏定义 ***it K1 = P3^4; //小时+, ***it K2 = P3^5; //分钟+, ***it dula=P2^6; //段 ***it wela=P2^7; //位 uchar code table[]={ //数组 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchar data dis_buf[8]; uchar data dis_index; uchar hour,min,sec; //定义时、分、秒变量 uchar sec100; //定义10ms计时变量 uchar data dis_digit; //位选通值 uchar KeySec=0; //键值变量 void proc_key(); //触发 void inc_sec(); //秒 void inc_min(); //分 void inc_hour(); //时 void delay(uchar ms); //延时 void display1( uchar a1,uchar a2,uchar a3,uchar a4,uchar a5,uchar a6);//按位显示 void Timer0Init(); //初始化定时器0 void key_scan(); //按键扫描 void key_service(); //按键服务程序 void main(void) { P0 = 0xff; //初始化P0 P2 = 0xff; //初始化P2 Timer0Init(); //初始化定时器0 hour = 12; //初始化时 min = 00; //初始化分 sec = 00; //初始化秒 sec100 = 0; //初始化10ms计时变量 /****初始时钟显示 12 00 00 ****/ dis_buf[0] = hour / 10; // 时十位 dis_buf[1] = hour % 10; // 时个位 // dis_buf[2] = 0xbf; // 显示"-" dis_buf[3] = min / 10; // 分十位 dis_buf[4] = min % 10; // 分个位 dis_buf[6] = sec / 10; // 秒十位 // dis_buf[5] = 0xbf; // 显示"-" dis_buf[7] = sec % 10; // 秒个位 dis_digit = 0xfe; dis_index = 0; while(1) { key_service(); //按键服务程序 display1(dis_buf[0],dis_buf[1],dis_buf[3],dis_buf[4],dis_buf[6],dis_buf[7]);//按位显示 } } void timer0() interrupt 1 //定时器0中断服务程序 { TL0 = 0x00; //重载定时初值 TH0 = 0xDC; //重载定时初值 key_scan(); //按键扫描程序 sec100++; //10ms变量自+1 if(sec100 >= 100) { sec100 = 0; inc_sec(); } } void inc_sec() //秒计算 { sec++; if(sec > 59) { sec = 0; //秒自+1 inc_min(); //分计算 } dis_buf[6] = sec / 10; // 秒十位 dis_buf[7] = sec % 10; // 秒个位 } void inc_min() //分计算 { min++; if(min > 59) { min = 0; inc_hour(); //时计算 } dis_buf[3] = min / 10; // 分十位 dis_buf[4] = min % 10; // 分个位 } void inc_hour() //时计算 { hour++; if(hour > 23) // { hour = 0; } if(hour > 9) dis_buf[0] = hour / 10; // 时十位 else dis_buf[0] = 0x00; // 当小时的十位为0时不显示 dis_buf[1] = hour % 10; // 时个位 } void delay(uchar ms) // 延时子程序 { uchar i; while(ms--) { for(i = 0; i < 120; i++); } } void display1(uchar a1, uchar a2, uchar a3, uchar a4, uchar a5, uchar a6)//显示程序 { dula=0; P0=table[a1]; //显示时十位 dula=1; dula=0; wela=0; P0=0x7e; wela=1; wela=0; delay(1); dula=0; P0=table[a2]; //显示时个位 dula=1; dula=0; wela=0; P0=0x7d; wela=1; wela=0; delay(1); P0=table[a3]; //显示分十位 dula=1; dula=0; P0=0x7b; wela=1; wela=0; delay(1); P0=table[a4]; //显示分个位 dula=1; dula=0; P0=0x77; wela=1; wela=0; delay(1); P0=table[a5]; //显示秒十位 dula=1; dula=0; P0=0xef; wela=1; wela=0; delay(1); P0=table[a6]; //显示秒个位 dula=1; dula=0; P0=0xdf; wela=1; wela=0; delay(1); } /************************************************** 初始化定时器程序 12T 10毫秒@11.0592MHz **************************************************/ void Timer0Init() //10毫秒@11.0592MHz { // AUXR &= 0x7F; //定时器时钟12T模式 TMOD &= 0xF0; //设置定时器模式 TMOD |= 0x01; //设置定时器模式 TL0 = 0x00; //设置定时初值 TH0 = 0xDC; //设置定时初值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 EA=1; //开总中断 ET0=1; //开定时器0中断 } /************************************************** 按键扫描程序 **************************************************/ void key_scan() //键扫描程序,放在中断里 { static bit key1_sign,key2_sign; //静态-变量按键自锁标志变量 static uchar count1,count2; //静态-计数变量 if(K1==1) //检测按键1没有按下 { key1_sign=0; //按键1自锁标志清0 count1=0; //消抖计数1清0 } else //按键1按下 { count1++; //消抖计数1自+1 if(count1>=2) //100次检测按键如果为0 { if(key1_sign==0) //按键1自锁标志为0 { key1_sign=1; //按键1自锁标志置1 KeySec=1; //输出键值1 } } } if(K2==1) //检测按键2没有按下 { key2_sign=0; //按键2自锁标志清0 count2=0; //消抖计数2清0 } else //按键2按下 { count2++; //消抖计数2自+1 if(count2>=2) //100次检测按键如果为0 { if(key2_sign==0) //按键2自锁标志为0 { key2_sign=1; //按键2自锁标志置1 KeySec=2; //输出键值2 } } } } /************************************************** 按键服务程序 **************************************************/ void key_service() { switch(KeySec) //按键服务状态切换 { case 1: //事例1号键触发 inc_hour(); //时计算 KeySec=0; //键值清零,避免一直触发 break; //跳出当前程序 case 2: //事例2号键触发 min++; if(min > 59) //分计算 { min = 0; } dis_buf[3] = min / 10; // 分十位 dis_buf[4] = min % 10; // 分个位 KeySec=0; //键值清零,避免一直触发 break; //跳出当前程序 } } |
|
|
|
|
|
|
|
265 浏览 0 评论
【原创】【RA4M2-SENSOR开发板评测】低功耗+USB综合测试
789 浏览 0 评论
1306 浏览 2 评论
787 浏览 0 评论
【RA4M2-SENSOR开发板评测】Analogue+Timers综合测试
1587 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
16902 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 10:44 , Processed in 0.865101 second(s), Total 41, Slave 31 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
14608