分享免费的编程资源和教程

网站首页 > 技术教程 正文

程序编写4-使用定时器T0中断实现按键扫描及单个数码管0-F显示

goqiw 2025-07-24 17:37:18 技术教程 6 ℃ 0 评论

数码管原理图介绍见-《单片机学习--数码管-code关键字-数组认识

本次新增独立按键原理图如下:

程序上,我们可以把每次扫描到的按键状态都保存起来,当一次按键状态扫描进来的时候,与前一次的状态做比较,如果发现这两次按键状态不一致,就说明按键产生动作了。当上一次的状态是未按下而现在是按下,此时按键的动作就是“按下”;当上一次的状态是按下而现在是未按下,此时按键的动作就是“弹起”。显然,每次按键动作都会包含一次“按下”和一次“弹起”,我们可以任选其一来执行程序,或者两个都用,以执行不同的程序也是可以的。下面介绍下具有上拉的准双向 IO 口:

当内部输出=0时,则反相后为高电平,三极管导通,那么单片机IO口内部输入为低电平,这时,不管外部按键KEY是否按下与否,单片机的 IO 口上内部输入到单片机内部的状态都是低电平,我们无法正常读取到按键的状态;当内部输出=1时,则反相后为低电平,三极管截止,由于上拉的存在,此时单片机IO口内部输入为高电平;当外部按键按下时将电平拉低的话,单片机IO口内部输入为低电平,即可以正常读取到按键的状态了。

从上面的分析就可以得出一个结论,这种具有上拉的准双向 IO 口,如果要正常读取外部信号的状态,必须首先得保证自己内部输出的是 1,如果内部输出 0,则无论外部信号是 1还是 0,这个引脚读进来的都是 0。

另介绍下新变量类型——bit,是51 单片机有一种特殊的变量类型。bit 型是 1 位数据,只占用 1 个位(bit)的内存,用法和标准 C 中其他的基本数据类型是一致的。它的优点就是节省内存空间,8 个bit 型变量才相当于 1 个 char 型变量所占用的空间。虽然它只有 0 和 1 两个值,但也已经可以表示很多东西了,比如:按键的按下和弹起、LED 灯的亮和灭、三极管的导通与关断等等。

我们都知道按键在操作时会产生抖动,所以介绍下使用中断来进行按键消抖。我们启用一个定时中断,每 1ms 进一次中断,扫描一次按键状态并且存储起来,连续扫描 8 次后,看看这连续 8 次的按键状态是否是一致的。8 次按键的时间大概是 8ms,这 8ms 内如果按键状态一直保持一致,那就可以确定现在按键处于稳定的阶段,而非处于抖动的阶段。

下面开始编写程式:

main主函数和一些声明定义:

初始化定时器T0函数:void timer0_init()

按键驱动函数key_driver()

按键动作函数key_action()

按键扫描函数key_scan()

定时器T0中断服务函数:void timer0() interrupt 1

完整程序:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表