OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5877|回复: 10

怎么实现按键不松时,数码管一直加或一直减。而且不影响数码管显示。

[复制链接]

12

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2014-9-25
在线时间
3 小时
发表于 2015-11-9 17:51:02 | 显示全部楼层 |阅读模式
5金钱

[mw_shl_code=c,true] int main(void) { u8 data[8], i,key; KEY_Init(); Init_74HC595(); delay_init(); while(1) { key=KEY_Scan(1); KEY_Handle(key); Display(USART_RX_BUF); } } u8 KEY_Scan(u8 mode) { static u8 key_up=1; if(mode)key_up=1; if(key_up&&(KEY1_FUNC==0||KEY2_UP==0||KEY3_DOWN==0)) { delay_ms(2); key_up=0; if(KEY1_FUNC==0)return FUNC_PRES; else if(KEY2_UP==0)return UP_PRES; else if(KEY3_DOWN==0)return DOWN_PRES; } else if(KEY1_FUNC==1&&KEY2_UP==1&&KEY3_DOWN==1)key_up=1; return 0; } u8 KEY_Count=0; void KEY_Handle(u8 key) { int bai=0,shi=0,ge=0; if(USART_RX_BUF[0]==0 || USART_RX_BUF[1]==0 || USART_RX_BUF[2]==0 || USART_RX_BUF[4]==0) { USART_RX_BUF[0]=0xFF; USART_RX_BUF[1]=0x01; USART_RX_BUF[2]=0x01; USART_RX_BUF[4]=0xFE; } if(key == FUNC_PRES) //按下功能键 { USART_RX_BUF[2]++; if(USART_RX_BUF[2] > 4) { USART_RX_BUF[2]=1; } // USART_RX_BUF[3]=0; } if(key == UP_PRES) { bai=USART_RX_BUF[3]/100; shi=USART_RX_BUF[3]%100/10; ge=USART_RX_BUF[3]%10+1; if(ge>9) { ge=0; shi=shi+1; if(shi>9) { shi=0; bai=bai+1; } } if(bai==2&&shi==5&&ge==5) { ge=5; shi=5; bai=2; } USART_RX_BUF[3]=bai*100+shi*10+ge; } if(key == DOWN_PRES) { bai=USART_RX_BUF[3]/100; shi=USART_RX_BUF[3]%100/10; ge=USART_RX_BUF[3]%10-1; if(ge<0) { ge=9; shi=shi-1; if(shi<0) { shi=9; bai=bai-1; if(bai<0) { ge=0; shi=0; bai=0; } } } USART_RX_BUF[3]=bai*100+shi*10+ge; } } void HC595_write_byte(u8 byte) { u8 i, temp; temp = byte; for (i=0; i<8; i++) { SCLK=0; if ((temp&0x80)==0x80) DIO=1; else DIO=0; delay_us(1); SCLK=1; temp = temp<<1; delay_us(1); } } void write_byte(u16 byte) { u16 i, temp; temp = byte; for (i=0; i<16; i++) { SCLK=0; if ((temp&0x8000)==0x8000) DIO=1; else DIO=0; delay_us(1); SCLK=1; temp = temp<<1; delay_us(1); } } void HC595_Latch(void) { RCLK=0; delay_us(1); RCLK=1; delay_us(1); RCLK=0; } void HC595_display(u8 data[]) { HC595_write_byte(seg_table_p[data[3]]); //送数据 HC595_write_byte(0x01); //第一个数码管亮 HC595_Latch(); delay_us(50); HC595_write_byte(seg_table_p[data[2]]); HC595_write_byte(0x02); //第二个数码管亮 HC595_Latch(); delay_us(50); HC595_write_byte(seg_table_p[data[1]]); HC595_write_byte(0x04); //第三个数码管亮 HC595_Latch(); delay_us(50); HC595_write_byte(seg_table_p[data[0]]); HC595_write_byte(0x08); //第四个数码管亮 HC595_Latch(); delay_us(50); } /* 数码管选择显示 参数:select数码管选择1,2,3,4 data发送的数据 */ void shumaguan_Select(u8 select,u8 data) { HC595_write_byte(seg_table_p[data]); HC595_write_byte(select); HC595_Latch(); delay_ms(250); } void shumaguan(u8 duan,u8 wei) { u16 temp; temp=(seg_table_p[wei]<<8)|duan; write_byte(temp); HC595_Latch(); } void Display(u8 data[]) { shumaguan(0x01,data[3]%10); shumaguan(0x02,data[3]%100/10); shumaguan(0x04,data[3]/100); shumaguan(0x08,data[2]); } [/mw_shl_code]
按键按下不松时,数码管只有一个比较亮,其他三个比较暗。
求各位大神指教。

最佳答案

查看完整内容[请看2#楼]

很简答啦 数码管动态扫描显示放到定时器中,按键随便按,设置一个变量数据,按键按下改变变量数据,定时器数码管动态扫描,实时显示那个变量 由于定时中断,所以数码管显示不会受到影响
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

34

主题

388

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4090
金钱
4090
注册时间
2012-10-21
在线时间
642 小时
发表于 2015-11-9 17:51:03 | 显示全部楼层
很简答啦
数码管动态扫描显示放到定时器中,按键随便按,设置一个变量数据,按键按下改变变量数据,定时器数码管动态扫描,实时显示那个变量
由于定时中断,所以数码管显示不会受到影响
回复

使用道具 举报

12

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2014-9-25
在线时间
3 小时
 楼主| 发表于 2015-11-9 17:59:39 | 显示全部楼层


实际显示图。。
用外部中断的话,按键不松,数码管不会一直加啊。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-11-9 22:51:53 | 显示全部楼层
实现这个没什么问题。
当练习题好好想想吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

13

主题

225

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
289
金钱
289
注册时间
2013-11-12
在线时间
29 小时
发表于 2015-11-9 23:09:20 | 显示全部楼层
给按键增加一个长按不释放的状态就行了吧?
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-5-31
在线时间
3 小时
发表于 2016-8-8 23:38:18 | 显示全部楼层
我也遇到了同样的问题,好像是中断的问题,我的动态显示是放在定时器3里面的,当改变其中断时间为5ms左右时,显示没问题,但是放在main函数while的语句执行明显有问题,我再思考中断的时候CPU去做显示的东西了,显示也要时间,主函数的东西就还没执行,当其还未执行,TImer3的中断又开始了……这样是不是一直就有问题,导致main函数while里的东西时间是乱的……
最困难之时,就是离成功不远之日
回复

使用道具 举报

58

主题

359

帖子

0

精华

高级会员

Rank: 4

积分
987
金钱
987
注册时间
2014-9-29
在线时间
261 小时
发表于 2016-8-9 08:39:38 | 显示全部楼层
延时的时间不均衡吧
回复

使用道具 举报

58

主题

359

帖子

0

精华

高级会员

Rank: 4

积分
987
金钱
987
注册时间
2014-9-29
在线时间
261 小时
发表于 2016-8-9 08:42:05 | 显示全部楼层
按键占用了好多时间   以至于数码管扫描时间不同
要么中断处理显示,要么按键函数改一下
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-8-9 11:06:56 | 显示全部楼层
shuiqinghan2012 发表于 2016-8-8 23:38
我也遇到了同样的问题,好像是中断的问题,我的动态显示是放在定时器3里面的,当改变其中断时间为5ms左右时 ...

说的不清不楚。比较简单的,按键10ms扫描一次,不延时。显示 也是10ms一次,而且扫描和显示不要放在中断
回复

使用道具 举报

4

主题

67

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
212
金钱
212
注册时间
2015-8-5
在线时间
49 小时
发表于 2016-8-11 00:03:54 | 显示全部楼层
每隔一段时间扫描一次,按键IO口一共有四种情况(上升沿、下降沿、高电平、低电平)
如果是单击有效,那么直接判断上升沿或者下降沿的时候改变数据
如果是长按有效,那么判断高电平或者低电平即可
当然了,如果连按的触发时间要可调的话尽量还是单独做一个连按处理的线程,从扫描线程接受数据
开源QQ群:431600056
回复

使用道具 举报

25

主题

281

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2504
金钱
2504
注册时间
2015-8-17
在线时间
383 小时
发表于 2016-8-11 11:09:52 | 显示全部楼层
在一些延时或循环的地方加上显示函数就行啦
做事的原则:
1.每个问题重复三遍、研究三遍后再提问,直接得到答案的人什么都没学会。
2.做事要有始有终,感谢那些帮助自己解决问题的人,把解决的方法总结起来。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 05:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表