打印
[国产单片机]

实在搞不定了,求思路方法,望指教

[复制链接]
2645|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
最近在弄电子琴的模块,一直在弄8*8的矩阵扫描程序,现在要求不用中断,8*8的扫描能实现,但是现在又要求要能判别按键的按下与抬起状态,按下时显示的是键值抬起时显示的是键值加上80,希望前辈们能提供点意见。有源码更是感谢。

相关帖子

沙发
NE5532| | 2017-3-27 15:45 | 只看该作者
主循环内定期扫描,比如每5mS扫描一次。

使用特权

评论回复
板凳
时光深巷已无她|  楼主 | 2017-3-27 15:49 | 只看该作者
NE5532 发表于 2017-3-27 15:45
主循环内定期扫描,比如每5mS扫描一次。

前辈能详细点么,现在公司要求是用汇编写。谢谢

使用特权

评论回复
地板
NE5532| | 2017-3-27 16:04 | 只看该作者
你原来用的定时器中断吧,改成这个代码就是了

main()
{
  delay(5ms);
  Scan();
}

使用特权

评论回复
5
时光深巷已无她|  楼主 | 2017-3-27 16:12 | 只看该作者
NE5532 发表于 2017-3-27 16:04
你原来用的定时器中断吧,改成这个代码就是了

现在一直弄汇编,关于你这个程序,我有点疑问,每隔5ms去扫描一次键盘,这样判断释放的语句你写在扫描函数里了?

使用特权

评论回复
6
NE5532| | 2017-3-27 16:27 | 只看该作者
char key_last = Null;
char key;

main()
{
delay(5ms);
key = Scan();

if (key != Keylast)
{
  Keylast = key;
  Display();
}
}

使用特权

评论回复
7
NE5532| | 2017-3-27 16:28 | 只看该作者
检测“变化”即可。

使用特权

评论回复
8
时光深巷已无她|  楼主 | 2017-3-27 16:39 | 只看该作者

我有点蒙圈了,还请您点评一下,我是这样理解你的代码的:每隔5ms去执行扫描函数如果有按键按下则将按下的值赋给key,如果key值不是0(空)则执行显示函数。这样问题来了,我要实现的功能是:比如我按下了第五个键,则key==5,我一直按着它才会稳定的显示5,我松开它显示5+80也就是85,你这里的延时起到什么作用呀?想请您指点一下

使用特权

评论回复
9
NE5532| | 2017-3-27 16:41 | 只看该作者
你把“释放”也当成一个键值,这个键值是Release,再来想这个问题,就容易了。其实PC键盘就是这样做的,一个键按下去和抬起来是两个值,程序检测的是“变化”,而不是“状态”(这个是初级思维)。

使用特权

评论回复
10
时光深巷已无她|  楼主 | 2017-3-27 16:46 | 只看该作者
NE5532 发表于 2017-3-27 16:41
你把“释放”也当成一个键值,这个键值是Release,再来想这个问题,就容易了。其实PC键盘就是这样做的,一 ...

哦哦,谢谢,前辈我还有一些问题  您知道矩阵键盘的行线或者列线上加4个二极管有什么作用么?还有一个问题,您会使用汇编么?如果会的话我把我写的汇编的程序发给您看看

使用特权

评论回复
11
NE5532| | 2017-3-27 17:05 | 只看该作者
二极管一般是用来做某种逻辑的,请发电路图来看。

我精通汇编,但是没有时间帮你检查程序,程序的调试方法在本版精华帖《程序调试黑宝书》里,请参考。

使用特权

评论回复
12
时光深巷已无她|  楼主 | 2017-3-27 17:31 | 只看该作者
NE5532 发表于 2017-3-27 17:05
二极管一般是用来做某种逻辑的,请发电路图来看。

我精通汇编,但是没有时间帮你检查程序,程序的调试方法 ...

电路图没有,我只是看到键盘上有二极管,哦哦十分感谢

使用特权

评论回复
13
山东电子小菜鸟| | 2017-3-27 22:03 | 只看该作者
NE5532 发表于 2017-3-27 17:05
二极管一般是用来做某种逻辑的,请发电路图来看。

我精通汇编,但是没有时间帮你检查程序,程序的调试方法 ...

程序调试黑宝书

使用特权

评论回复
14
computer00| | 2017-3-27 22:55 | 只看该作者
二极管是为了能够支持更多的键能同时按下(解决按键冲突问题),不然当三个键位于同一个矩形的顶点时,
就会出现按键冲突的问题,如果没有二极管的话,这时软件是扫描不出来的。
对于你的程序,建议你用8个字节的每个bit(共64bit)来表示每个按键的当前状态,1表示按住。
扫描一遍,返回结果为8个字节。然后另外用8个字节把前一次扫描的结果也保存下来。
这样每次扫描完之后,两个8字节的数据对比一下,看哪些bit发生了改变,如果某bit从0变成1,
则表示这个按键按下。如果某bit从1变成了0,则表示这个按键释放。按键的值就是该bit所在的位置。
如果觉得这样比较耗费内存(需要16字节),那么就要用另外一种方案,把当前按住的键都存起来,
需要存多少,看你需要支持多少个键能同时按,例如只需要支持3个,那么就可以用3字节记录。
然后下一次扫描出来的结果(同样也需要3字节)和上一次的3字节对比,看多了啥,少了啥,
就知道了。如果是多了,则表示按下,如果少了,则表示松开。但如果你需要支持很多键同时按下,
用这种方式反而更占内存,更麻烦。所以我建议你用8个字节来记录每个按键的状况,这样处理起来很方便。

使用特权

评论回复
评论
wlzeagle 2017-3-28 13:03 回复TA
正解 
15
sparue| | 2017-3-28 13:41 | 只看该作者
这个相当简单啊

使用特权

评论回复
16
时光深巷已无她|  楼主 | 2017-3-29 13:44 | 只看该作者
sparue 发表于 2017-3-28 13:41
这个相当简单啊

大神啊,看我的代码不

使用特权

评论回复
17
时光深巷已无她|  楼主 | 2017-3-29 13:46 | 只看该作者
computer00 发表于 2017-3-27 22:55
二极管是为了能够支持更多的键能同时按下(解决按键冲突问题),不然当三个键位于同一个矩形的顶点时,
就 ...

你的思路很正确,但我估计写不出来,昨天焊了一天板子,今天上午又在焊板子,下午看看能不能写出来,谢谢了

使用特权

评论回复
18
mailshichao| | 2017-3-29 19:58 | 只看该作者
一定要用汇编么,给我用c可以搞定,汇编到不会

使用特权

评论回复
19
时光深巷已无她|  楼主 | 2017-3-30 09:00 | 只看该作者
mailshichao 发表于 2017-3-29 19:58
一定要用汇编么,给我用c可以搞定,汇编到不会

c我也会,汇编占的内存小,减少成本

使用特权

评论回复
20
pang7| | 2017-3-30 10:04 | 只看该作者
好的c编译器 不一定比一个烂汇编码农编出来的代码 尤其是按键这些 不涉及到运算的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

247

帖子

4

粉丝