完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
请问下,TMR0用作计数器的话,我想让按键按两下,数码管(我设置为只有两位显示)加一,然后写到这卡住了,问题是:怎么关联按键和计数器呀!!!!?想了好久,求大神答疑、编程!
#include __CONFIG(0X3F39); #define ucar unsigned char const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,}; char shi,ge; void delay(uint x); void scan(); void init(); void disp(uchar shi,uchar ge); void main() { init(); while(1) { scan(); disp(shi,ge); } } void init() { TRISB=0xff;//键盘为输入 TRISA=0;//数码管位选输出 TRISD=0;//段选 PORTA=0x20;//开位选 PORTD=0x3f;//开段选 delay(1); PORTA=0x10;//0001 0000 PORTD=0x3f; delay(1); TMR0=255;//按4下+1 OPtiON=0x21;//0010 0001 INTCON=0;//0000 0000 TRISA4=1; } void scan() { if(RB0==0) { delay(10); if(RB0==0) { } } } void disp(uchar shi,uchar ge)//数码管动态扫描 { PORTD=table[shi];//显示第一个数码管 PORTA=0x20;//0010 0000 delay(2); PORTD=table[ge];//显示第二个数码管 PORTA=0x10;//0001 0000 delay(2); } void delay(uint x) { uint a,b; for(a=x;a>0;a--) for(b=110;b>0;b--); } |
|
相关推荐
11个回答
|
|
TMR0在这起什么作用?
如果单纯的想按下按钮显示加1,我想就用不着TMR0嘛 // scan函数要返回一个值作按钮是否按下的判断 char scan(void) { if(RB0==0) { delay(10); if(RB0==0) { return 1; } } return 0; } //主循环这么写 while(1) { if(scan()) { ge++; if(ge>9) { ge=0; shi++; if(shi>9) shi=0; } } disp(shi,ge); } |
|
|
|
帮顶.....
|
|
|
|
老师要求我们熟悉TMR0的计数器用法,不然我就不用计数器啦。求大神指点
|
|
|
|
哦,那我猜你的意思是要用计数器去捕获按键脉冲,抓到两个按键脉冲后就去控制数码管加1。
|
|
|
|
对对对,求教
|
|
|
|
楼主是不是这个意思,按键按两下有效,数码管加1?首先要明白这个是两件事情,按键怎么捕获按了两下这个事件,然后就见到了,一旦捕获按键按下两下事件,然后去驱动或者条用数码管加1函数。按键按下两下你要明白两次按键的时间间隔是多少,第一次按键按下后多长时间内再次按下按键才算双击,否则算是两次单击。例子参考:http://www.openedv.com/posts/list/61805.htm这个帖子,怎么区分长按和短按,原理一样。
|
|
|
|
两次单次的。
|
|
|
|
大神呢?
|
|
|
|
靠天靠地还不如靠自己
|
|
|
|
#include
__CONFIG(0X3F39); #define ucar unsigned char const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,}; char shi,ge,num,shu; void delay(uint x); void scan(); void init(); void disp(uchar shi,uchar ge); void main() { init(); while(1) { scan(); if(num==4) { num=0; TMR0=255; shu++; shi=shu/10; ge=shu%10; } disp(shi,ge); } } void init() { TRISB=0xff;//键盘为输入 TRISA=0;//数码管位选输出 TRISD=0;//段选 PORTA=0x30;//开位选0011 0000 PORTD=0x3f;//开段选,显示0 delay(1); TMR0=255;//按4下+1,因为4分频 OPTION=0x21;//0010 0001 INTCON=0x0a;//1010 0000 TRISA4=1; } void scan() { if(RB0==0) { delay(10); if(RB0==0) { while(!RB0); RA4=0; num++; } } } void disp(uchar shi,uchar ge)//数码管动态扫描 { PORTD=table[shi];//显示第一个数码管 PORTA=0x20;//0010 0000 delay(2); PORTD=table[ge];//显示第二个数码管 PORTA=0x10;//0001 0000 delay(2); } void delay(uint x) { uint a,b; for(a=x;a>0;a--) for(b=110;b>0;b--); } 还没烧入,不过差不多就是这样了,按键按四下,两位显示的数码管加一 |
|
|
|
求各位赐教,看看哪里还有不对
|
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2956 浏览 16 评论
3457 浏览 1 评论
8995 浏览 16 评论
4050 浏览 18 评论
1103浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 19:15 , Processed in 1.300661 second(s), Total 100, Slave 81 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号