完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
此代码是数码管显示时钟,利用四个按键实现暂停、切换、加、减。调用key();的时候,发现在单片机实训板上,四个按键均无反应。在此搞不懂什么原因造成,请大神们帮忙解答,谢谢,拜托拜托~
代码奉上: #include ***it P2_0 = P2^0; ***it P2_1 = P2^1; ***it P2_2 = P2^2; ***it P2_3 = P2^3; ***it P2_4 = P2^4; ***it P2_5 = P2^5; ***it P2_6 = P2^6; ***it P2_7 = P2^7; #define CONT1 80 //加减常量 #define CONT2 20 //连续加减速度变量 /***********************************************************************************************/ unsigned char code led_code[12]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XD8,0X80,0X90,0xBF, ~0X40}; //定义0~9以其带小数点和“-”的显示码 unsigned char led_reg[8]={0,0,11,0,0,11,0,0}; //定义显示数码缓存器 unsigned char hour; //定义时钟变量 unsigned char min; //定义分钟变量 unsigned char sec; //定义秒钟变量 //unsigned char T; unsigned char inputkey; //定义键盘输入存储变量 unsigned char shift_r; //定义键盘移位变量 unsigned char key_delay,flash_adj; unsigned int T=0; //定义秒钟调整变量 unsigned char jian,jia,zt,qh; unsigned int numqh,numzt; bit task_f; //定义任务标志位 bit key_mark; //定义按键记录标志位 /************************************************************************************************ **function:delay(unsigned char i) **功 能:延时程序 ************************************************************************************************/ void delay(unsigned char i) { unsigned char j,k; for(k=0;k { for(j=0;j<255;j++); } } /************************************************************************************************ **function:led_show() **功 能:显示函数 ************************************************************************************************/ //void led_show( ) //{ static unsigned char led_shift=0x00; //定义静态变量 // P2=0xFF; //关闭数码管控制端口 // P0=led_code[led_reg[led_shift]]; //把字符代码送到P0端口 // switch(led_shift) //选择数码管控制位 // { case 0: P2_0=0;break; //控制左1数码管 // case 1: P2_1=0;break; //控制左2数码管 // case 2: P2_2=0;break; //控制左3数码管 // case 3: P2_3=0;break; //控制左4数码管 // case 4: P2_4=0;break; //控制左5数码管 // case 5: P2_5=0;break; //控制左6数码管 // case 6: P2_6=0;break; //控制左7数码管 // case 7: P2_7=0;break; //控制左8数码管 // default:break; // } // led_shift++; //数码管控制变量自加 // if(led_shift==0x08) //判断是否扫描一轮 // led_shift=0x00; //归零进行下一轮扫描 //} void led_con(unsigned char i) //数码管位选控制程序 { switch(i) //选择数码管控制位 { case 0: P2=0xFE;break; //控制左1数码管 case 1: P2=0xFD;break; //控制左2数码管 case 2: P2=0xFB;break; //控制左3数码管 case 3: P2=0xF7;break; //控制左4数码管 case 4: P2=0xEF;break; //控制左5数码管 case 5: P2=0xDF;break; //控制左6数码管 case 6: P2=0xBF;break; //控制左7数码管 case 7: P2=0x7F;break; //控制左8数码管 default:break; } } //************************************************************************************************ void led_show( ) { static unsigned char led_shift=0x00; //定义静态变量 P2=0xFF; //关闭数码管控制端口 P0=led_code[led_reg[led_shift]]; //把字符代码送到P0端口 if(shift_r==(led_shift+1)) //判断哪位数码管需要闪烁 { flash_adj++; if(flash_adj<0x05) led_con(led_shift); //0~5时,调用数码管位选控制程序,数码管亮 else if(flash_adj<0x0A) P2=0XFF; //5~A时,数码管灭 else flash_adj=0x00; //清闪烁速度调整变量 } else //所有数码管不需要闪烁 led_con(led_shift); //调用数码管位选控制程序 led_shift++; //数码管控制变量自加 if(led_shift==0x08) //判断是否扫描一轮 led_shift=0x00; //归零进行下一轮扫描 } /************************************************************************************************ **function:clock() **功 能:时钟函数 ************************************************************************************************/ void clock() { if(T==20) //判断1秒钟是否到 { T=0; //到了1秒钟,秒调整变量清零 sec++; //秒钟变量加1 if(sec>59) //判断1分钟是否到 { sec=0; //到了1分钟,秒钟变量清零 min++; //分钟变量加1 if(min>59) //判断1小时是否到 { min=0; //到了1小时,分钟变量清零 hour++; //时钟变量加1 if(hour>23) //判断24小时是否到 { hour=0; //24小时到了,时钟变量清零 } } } led_reg[0]=hour/10; //提取时钟的十位 led_reg[1]=hour%10; //提取时钟的个位 led_reg[3]=min/10; //提取分钟的十位 led_reg[4]=min%10; //提取分钟的个位 led_reg[6]=sec/10; //提取秒钟的十位 led_reg[7]=sec%10; //提取秒钟的个位 } } /*********************************************************************************************** 中断与定时器 ************************************************************************************************/ void T1_ini() { //AUXR &= 0xBF; //定时器时钟12T模式 TMOD &= 0x0F; //设置定时器模式 TMOD |= 0x10; //设置定时器模式 TL1 = 0x00; //设置定时初值 TH1 = 0x4C; //设置定时初值 TF1 = 0; //清除TF1标志 TR1 = 1; //定时器1开始计时 ET1 = 1; EA = 1; } void timer1()interrupt 3 { TL1 = 0x00; //设置定时初值 TH1 = 0x4C; //设置定时初值 // TF1 = 0; T++; task_f = 1; //使能任务标志位 } /************************************************************************************************ 按键程序 ************************************************************************************************/ void key() { if(zt==0) { delay(8); if(zt==0) { numzt++; if(numzt>1)numzt=0; if(numzt==0) TR0=0; if(numzt==1) TR0=1; } } if(qh==0) { delay(10); if(qh==0) { numqh++; P1=0xff; TR0=0; if(numqh>4)numqh=1; } while(!qh); } if(jia==0) { P1=0xff; delay(10); if(jia==0&&numqh==1) { sec++; if(sec>59)sec=0; } if(jia==0&&numqh==2) { min++; if(min>59)min=0; } if(jia==0&&numqh==3) { hour++; if(hour>23)hour=0; } while(!jia); } if(jian==0) { P1 =0xff; delay(10); if(jian==0&&numqh==1) { sec--; if(sec<0)sec=59; } if(jian==0&&numqh==2) { min--; if(min<0)min=59; } if(jian==0&&numqh==3) { hour--; if(hour<0)hour=23; } while(!jian); } if(numqh==4) { TR0=1; numqh=0; } } /************************************************************************************************ mian() ************************************************************************************************/ void main() { P0=0X00; //P0端口输出低电平 P2=0XFF; //P2端口输出高电平 T1_ini(); while(1) { clock(); //调用时钟函数 // if (task_f) //判断任务标志位是否有效 // { // task_f=0; //标志位清零 led_show(); //调用显示函数 // key(); //调用按键函数 } } //} |
|
相关推荐
9个回答
|
|
我设了P1^0~1^3,结果暂停功能可以,切换扫描就是扫得有点快。
|
|
|
|
……可惜我不是大神,所以我帮不上忙…………
|
|
|
|
帮顶!!!!
|
|
|
|
你确定按键是好的,当然4个按键同时坏的概率很小。你首先测试按键,4个按键,每个按键按下LED取反,先确定按键扫描是可以用的先。
|
|
|
|
个人感觉while(!key);这种扫描方式最垃圾的了!!!!假如按键坏了或者按住不放,那就是死循环了!!! 我从来都不会用这种方式!!
|
|
|
|
你的按键扫描方法可以换种方式来做,不过测试如此扫描也行,你确定4个按键扫描都可以得到键值,就是其他问题了,不要老纠结在这块,除非你单独测试按键扫描。
|
|
|
|
有没有其他的参考?
|
|
|
|
我再试试吧~
|
|
|
|
根据你的程序,按键的效果要在按键释放后才体现,所以,检查按键是否故障,按键正常的话,测试时要释放按键后才看效果。
数码管的显示程序最好放在定时器中断里,可以再开一个T0定时器用来做数码管显示,这样在按键按下判断有效后就可以看到按键程序的效果了 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2956 浏览 16 评论
3458 浏览 1 评论
9002 浏览 16 评论
4051 浏览 18 评论
1110浏览 3评论
572浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
569浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2302浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1859浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 00:21 , Processed in 1.225934 second(s), Total 96, Slave 77 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号