我们已经学过了一些基本的数码管显示,但是对于我们的KN键还没有正式的接触过,已经是如何确定其数值的我们也没有讨论过,我们现在就来好好的了解一下
我们分两个例子来说明
- 导航按键测试
- 导航按键与数字按键综合
导航按键测试
实验现象
第一位数码管显示8位转换结果中前三位值,最后两位数码管显示后五位值。数码管下方的发光二极管与数码管对应显示
即按下导航键的任意方向以及不操作均会有数码管显示,其显示的可能值在下面列出
实验原理
我们先来看一下导航按键的电路原理图
按下不同的键就等价于接通不同的脚,电阻值也会不同,从而分得的电压也不同,而我们就是通过判断其电压值从而确定其实际是按的什么键
我们现在就是需要将其在数码管上显示,从而更直观的测试我们的导航键,显示值可参照下表
其值的参考如下
(从左至右边的数码管依次命名为Seg0~Seg7,Seg0 = L7~L5, Seg(6-7) = L4~L3)
注意:
实际数值如果有一点误差,是由于电阻的工艺使得电阻会有一定的误差,关系不大,我们在做导航按键的判断时,都只是取高三位的值,也就是数码管Seg0的值。
但是, 我们的电压值是一个模拟信号,而我们的数码管的值是一个数字信号,这就意味着我们需要进行AD转换
(我们在别的博客会重点讲解)
代码解析
总设计流程图
- 变量定义
uint uiSampleNum = 0;
//采样次数
ulint uiAdSum = 0;
//AD值累加次数
uint uiAdDate8 = 0;
//AD值八位数据
uint uiAdHigh3 = 0;
//AD值高三位
uint uiAdLow5 = 0;
//AD值低五位
uchar ucSegState;
//数码管扫描状态
- 初始化部分
- 需要用到的函数
void InitSYS();
//初始化系统
void InitADC();
//初始化ADC
void HighThree();
//显示高三位和低五位
void timer0()interrupt 1
//定时器中断,用于扫描数码管和发光二极管
void adc_isr() interrupt 5
//AD中断,用于处理ADC结果
其中
定时器0中断就不再做阐述,统计中断次数,选择显示哪一位的结果以及要选择发光二极管以二进制形式显示对应的数字
导航按键与数字按键综合
实验现象
程序主要是将导航按键和数字按键综合控制数码管,区别导航按键和数字按键的区别。
程序运行效果说明:
导航按键的上键:控制数码管上数字的数值增加1;
导航按键的下键:控制数码管上数字的数值减少1;
K1键:数码管上的数字右移一位;
K2键:数码管上的数字左移一位;
K3键:按一下K1,K2键锁死,再按一下K1,K2键解锁。
实验原理及代码解析
相比于导航键的测试,与数字键结合之后我们就需要改变一些代码,比如转换AD的子函数,数码管应该如何显示,按下数字键会造成什么结果
在获取按键导航的键值的子函数的时候,我们就需要考虑到按键消抖,下面是以7次为一次统计次数
我们需要对导航按键的K3的状态进行记录,因为它决定我们是否能够修改值,后面直接用条件语句即可实现
然后我们通过按键的相应状态选择相应的效果
主函数中,我们首先判断K3 是否锁住K1,K2,然后确定是否移位显示以及具体显示的数字也需确定
部分代码如下