# 自制按键计数器
# 思路
独立按键按下一次代表一次数据 主函数不断循环 每一次循环都会检测按键是否被按下 (原来想尝试外部中断 0 的方法 也就是没隔一段时间检测一次键盘是否被按下 但是如果使用 P32 短接 GND 的话 就太麻烦了 软件控制电平来触发外部中断的话 还不如学到计时器的时候用终端 1 要简单的多) 如果被按下 计数器加一 并且在数码管上面显示出来 当位数多起来时 就用动态显示来实现
# 遇到的问题
这过程中遇到很多问题 最多的问题就是数码管的残影问题和代码逻辑问题😂
# 数码管残影
残影最开始出现的时候 我一度认为是我的代码写错了 (当然 代码写错的确有可能导致显示错误) 所以就一直把代码改来改去 但是并没有什么明显的效果 后来上网搜了一下才发现是数码管存在残影的问题
一开始想的很简单 以为就根据普遍做法
1 | P0 = 0xff; //清除段选对位选的影响 也就是让数码管全部关闭 |
但是仍然没有效果 (可能是因为指令执行的还是太快了)
所以通过 delay 函数来控制扫描的速率 来解决这个问题 但是这个方式会有一个小隐患 扫描速率不好调整 扫描快了 (delay 函数定时短) 会有残影 扫描慢了 (delay 函数定时长) 达不到效果
其实后面键盘倒是没有什么难度 独立键盘的话直接检测就好了 只是要注意一个按键防抖 因为当按下按键的过程中 电路的导通状态并不只是一个正常的开断 而是以下这个情况

矩阵键盘的话 可以类似于坐标轴找点 视频里面说的 “线与” 关系 其实就是 只知道 X 轴或者 Y 轴坐标 定位不了具体的点 所以要在很快的时间内 (手松开按键之前) 连续检测行和列的电压值从而得出是哪一个键被按下了
# 成品代码如下 :
1 | /***********单按键版本***************/ |
矩阵键盘版本 :
1 | /***********矩阵键盘版**********/ |
