[国产单片机] 实在搞不定了,求思路方法,望指教

[复制链接]
3192|26
 楼主| 时光深巷已无她 发表于 2017-3-27 15:34 | 显示全部楼层 |阅读模式
最近在弄电子琴的模块,一直在弄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 | 显示全部楼层
你原来用的定时器中断吧,改成这个代码就是了

  1. main()
  2. {
  3.   delay(5ms);
  4.   Scan();
  5. }
 楼主| 时光深巷已无她 发表于 2017-3-27 16:12 | 显示全部楼层
NE5532 发表于 2017-3-27 16:04
你原来用的定时器中断吧,改成这个代码就是了

现在一直弄汇编,关于你这个程序,我有点疑问,每隔5ms去扫描一次键盘,这样判断释放的语句你写在扫描函数里了?
NE5532 发表于 2017-3-27 16:27 | 显示全部楼层
  1. char key_last = Null;
  2. char key;

  3. main()
  4. {
  5. delay(5ms);
  6. key = Scan();

  7. if (key != Keylast)
  8. {
  9.   Keylast = key;
  10.   Display();
  11. }
  12. }
NE5532 发表于 2017-3-27 16:28 | 显示全部楼层
检测“变化”即可。
 楼主| 时光深巷已无她 发表于 2017-3-27 16:39 | 显示全部楼层

我有点蒙圈了,还请您点评一下,我是这样理解你的代码的:每隔5ms去执行扫描函数如果有按键按下则将按下的值赋给key,如果key值不是0(空)则执行显示函数。这样问题来了,我要实现的功能是:比如我按下了第五个键,则key==5,我一直按着它才会稳定的显示5,我松开它显示5+80也就是85,你这里的延时起到什么作用呀?想请您指点一下
NE5532 发表于 2017-3-27 16:41 | 显示全部楼层
你把“释放”也当成一个键值,这个键值是Release,再来想这个问题,就容易了。其实PC键盘就是这样做的,一个键按下去和抬起来是两个值,程序检测的是“变化”,而不是“状态”(这个是初级思维)。
 楼主| 时光深巷已无她 发表于 2017-3-27 16:46 | 显示全部楼层
NE5532 发表于 2017-3-27 16:41
你把“释放”也当成一个键值,这个键值是Release,再来想这个问题,就容易了。其实PC键盘就是这样做的,一 ...

哦哦,谢谢,前辈我还有一些问题  您知道矩阵键盘的行线或者列线上加4个二极管有什么作用么?还有一个问题,您会使用汇编么?如果会的话我把我写的汇编的程序发给您看看
NE5532 发表于 2017-3-27 17:05 | 显示全部楼层
二极管一般是用来做某种逻辑的,请发电路图来看。

我精通汇编,但是没有时间帮你检查程序,程序的调试方法在本版精华帖《程序调试黑宝书》里,请参考。
 楼主| 时光深巷已无她 发表于 2017-3-27 17:31 | 显示全部楼层
NE5532 发表于 2017-3-27 17:05
二极管一般是用来做某种逻辑的,请发电路图来看。

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

电路图没有,我只是看到键盘上有二极管,哦哦十分感谢
山东电子小菜鸟 发表于 2017-3-27 22:03 | 显示全部楼层
NE5532 发表于 2017-3-27 17:05
二极管一般是用来做某种逻辑的,请发电路图来看。

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

程序调试黑宝书
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个字节来记录每个按键的状况,这样处理起来很方便。

评论

正解  发表于 2017-3-28 13:03
sparue 发表于 2017-3-28 13:41 | 显示全部楼层
这个相当简单啊
 楼主| 时光深巷已无她 发表于 2017-3-29 13:44 | 显示全部楼层
sparue 发表于 2017-3-28 13:41
这个相当简单啊

大神啊,看我的代码不
 楼主| 时光深巷已无她 发表于 2017-3-29 13:46 | 显示全部楼层
computer00 发表于 2017-3-27 22:55
二极管是为了能够支持更多的键能同时按下(解决按键冲突问题),不然当三个键位于同一个矩形的顶点时,
就 ...

你的思路很正确,但我估计写不出来,昨天焊了一天板子,今天上午又在焊板子,下午看看能不能写出来,谢谢了
mailshichao 发表于 2017-3-29 19:58 | 显示全部楼层
一定要用汇编么,给我用c可以搞定,汇编到不会
 楼主| 时光深巷已无她 发表于 2017-3-30 09:00 | 显示全部楼层
mailshichao 发表于 2017-3-29 19:58
一定要用汇编么,给我用c可以搞定,汇编到不会

c我也会,汇编占的内存小,减少成本
pang7 发表于 2017-3-30 10:04 | 显示全部楼层
好的c编译器 不一定比一个烂汇编码农编出来的代码 尤其是按键这些 不涉及到运算的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

247

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部