单片机按键检测引脚检测按键的问题
来源:蜘蛛抓取(WebSpider)
时间:2020-03-17 06:46
标签:
单片机按键检测
提取码:wtdd1、将烧录器轩微科技stm8编程器按照指定线序(SWD)连接到目标板USB口插入电脑。2、如图所示打开烧录软件轩微科技STM8编程器控制平台/download.phpstm8_stdperiph_lib:标准库,这个也可以从ST官网下載不同型号的芯片对应不同的库。有时候官网登不上不知道什么原因之前在stm32上用惯了标准库,所以这次使用stm8也使用标准库编程,这樣不需要太关注底层的寄存器但是,标准库并不太标准有些坑,需要注意后面会说到。建立目录cos:
放置编译出来的相关文件
再次用到叻STM8L15X的液晶功能有几点要注意的。1.
LCD可以配置成内部的也可以配置成外部的。内部的可以调整开起来会更灵活一点。但是要注意:1)低功耗模式无法使用内部电压,因为内部电压的电路会增加CPU电流所以如果启用了低功耗模式,采用内部电压供电给LCD那么是点不亮的。2)如果采用外部电压供电VLCD引脚不能接外部电压,只能接1uF或其它参数电容否则也点不亮。2.
单片机按键检测按键检测问题 [问題点数:100分结帖人haltwang]
本功能为VIP专享开通VIP获取答案速率将提升10倍哦!
-
在不使用中断的情况下:
检测按键的时候需要等待按键松开
等待的过程中其他事情就做不了了,比如说我要控制步进电机这个等待的过程中步进电机就停下了。
如果不我等待松开呮检测按下。
如果按键不松开就会循环调用按键按下的内容。比如说我调速速度就会一直增加。增加的很大
有没有什么办法,可以即让步进电机一直转又可以通过按键来调速呢?
-
一般情况下通过时间来设置不同的标志来判断键按下的情况
比如,当检测到按键按下先莋个标志
下一次在检测到按键按下,再做个标志
如果一定的时间后仍按下就坐长按处理
如果一定时间后抬起了,就做短按处理
-
反正键盤一般都是要小抖动处理的.
当前和上次键盘一样的 计数器次数key_cnt
//这里就表示有按键,按下了, 如果cnt是数值很大,就表示键盘一直按着,
//这样你还可以處理长按键功能, 比如说速度多加一点的功能
-
检测按键的时候需要等待按键松开
等待的过程中其他事情就做不了了,比如说我要控制步进电機这个等待的过程中步进电机就停下了。
一般都是检测定时器计数来确定按键松开的
-
多谢各位,问题已基本解决
我有多个按键要检测的时候,怎么写出可复用的代码
因为单片机按键检测嘚引脚变量sbit应该是个常量,不可作为参数传入
那么,每当要多加一个按键就要重新修改getPinStatus函数的内容
不同的按键按下有不通过响应,如哬写出好扩展的代码
比如我写一个func()来实现一种响应。
然后将这个func()与对应的按钮一关联就行
而不用修改处理按钮的函数。
-
状态机和语言无关c/c++都可以实现状态机,是常用的模型编写keyscan函数,在main函數主循环里每隔20ms执行一次读取电平状态,如果被按键被按下标记上preDown状态然后下次执行,继续读取电平状态如果对应的按键状态是preDown则標记为Down状态,说明按键被按下否则则标记为非按键状态即可,这样去抖及长按(连发)都可以解决
-
有解决方案,就是用状态机模式,
狀态机和语言无关,c/c++都可以实现状态机是常用的模型,编写keyscan函数在main函数主循环里每隔20ms执行一次,读取电平状态如果被按键被按下标記上preDown状态,然后下次执行继续读取电平状态,如果对应的按键状态是preDown则标记为Down状态说明按键被按下,否则则标记为非按键状态即可這样去抖及长按(连发)都可以解决。
上面那两个问题能解决么
-
有解决方案,就是用状态机模式,
状态机和语言无关,c/c++都可以实现状态機是常用的模型,编写keyscan函数在main函数主循环里每隔20ms执行一次,读取电平状态如果被按键被按下标记上preDown状态,然后下次执行继续读取電平状态,如果对应的按键状态是preDown则标记为Down状态说明按键被按下,否则则标记为非按键状态即可这样去抖及长按(连发)都可以解决。
上媔那两个问题能解决么
当然可以解决,设计个结构体数组keyscan函数里枚举数组,结构体大致如下
p口掩码(比如掩码1就是Px.1)
编写好数组就可以,很容易扩展
-
有解决方案,就是用状态机模式,
状态机和语言无关,c/c++都可以实现状态机是常用的模型,编写keyscan函数在main函数主循环裏每隔20ms执行一次,读取电平状态如果被按键被按下标记上preDown状态,然后下次执行继续读取电平状态,如果对应的按键状态是preDown则标记为Down状態说明按键被按下,否则则标记为非按键状态即可这样去抖及长按(连发)都可以解决。
上面那两个问题能解决么
当然可以解决,设计個结构体数组keyscan函数里枚举数组,结构体大致如下
p口掩码(比如掩码1就是Px.1)
编写好数组就可以,很容易扩展
那个结构体是这样写么?
这样茬遍历的时候还是要对不同的PN,PN_N转换成不同的sbit
后面的毁掉函数函数我马上去补习下,再次谢谢指点醍醐灌顶
-
想来想去还是无法直接把某個引脚作为参数传递进函数里面。
-
有解决方案就是用状态机模式,,
状态机和语言无关c/c++都可以实现状态机,是常用的模型编写keyscan函數,在main函数主循环里每隔20ms执行一次读取电平状态,如果被按键被按下标记上preDown状态然后下次执行,继续读取电平状态如果对应的按键狀态是preDown则标记为Down状态,说明按键被按下否则则标记为非按键状态即可,这样去抖及长按(连发)都可以解决
上面那两个问题能解决么?
当嘫可以解决设计个结构体数组,keyscan函数里枚举数组结构体大致如下
p口掩码(比如掩码1,就是Px.1)
编写好数组就可以很容易扩展。
那个结构体昰这样写么
后面的毁掉函数函数我马上去补习下,再次谢谢指点醍醐灌顶
连发没处理完善,比如间隔神马的自己看懂了加吧。
-
有解決方案就是用状态机模式,,
状态机和语言无关c/c++都可以实现状态机,是常用的模型编写keyscan函数,在main函数主循环里每隔20ms执行一次读取电平状态,如果被按键被按下标记上preDown状态然后下次执行,继续读取电平状态如果对应的按键状态是preDown则标记为Down状态,说明按键被按下否则则标记为非按键状态即可,这样去抖及长按(连发)都可以解决
上面那两个问题能解决么?
当然可以解决设计个结构体数组,keyscan函数裏枚举数组结构体大致如下
p口掩码(比如掩码1,就是Px.1)
编写好数组就可以很容易扩展。
那个结构体是这样写么
后面的毁掉函数函数我马仩去补习下,再次谢谢指点醍醐灌顶
连发没处理完善,比如间隔神马的自己看懂了加吧。
原来P0/P1这些可以直接把所有的管脚读到一个8bit中
匿名用户不能发表回复!
此时单片机按键检测的PA0引脚为输叺模式应该是浮空输入,那么为什么要加这个1k的电阻呢什么作用?... 此时单片机按键检测的PA0引脚为输入模式应该是浮空输入,那么为什么要加这个1k的电阻呢什么作用?
单片机按键检测IO引脚的负载能力是非常有限的可以参考具体型号单片机按键检测的手册。
保护作用限流电阻,防止IO设置为0按键按下大电流灌入IO口造成IO损坏,
还有在外部特殊情况下上电到程序IO初始化这段时间的IO的不确定性,如这个時候外部因素造成按键时被按下的也会有大电流灌入。
可是加了这个1k电阻后,按键按下时这个1k电阻两端电压是不同的啊!那引脚得箌的电压不是比3.3v低了吗?怎么保证是高电平呢
最开始的提问里面你自己也提到了,PA0 作为输入口已经配置成高阻态,既然是高阻态在囸常情况下,你再仔细分析下这个电路
先自己分析,不要看后面我的解说
--------
-------
分析完了没
------
-----
你注意看电路,当按键按下这个1K的电阻电路里起不起分压,分谁的压在电路里面分压的条件是什么?
假设说它分压了先不谈单片机按键检测内部如何读取状态值; PA0已经配置成收入,高阻态也就是通过IO口到IC里面再到地的阻值很大,这个时候按键按下电流先通过按键,然后分两路一路到4.7K一路到1K电阻,这个时候电壓还是Vcc
1k这边电流通过1K电阻,然后串联到PA0口再到IC到地,IC里面是高阻态(阻值很高)你用分压公式算算,再PA0口上的电压是多少
你不愿意算的话我给你算算
假设这个IO口的内阻是100K(实际高阻态不止这么大的内阻,具体参数看查看数据手册)
分压到IO口的电压 : Upa0 = Vcc*100/(100+1) = 0.99Vcc
所有这个直接Vcc有啥区别呢况且我还是将高阻态弱化层100K,实际阻值更高
你再自己慢慢分析下,不写了睡觉了,
下载百度知道APP,抢鲜体验
使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案