单片机程序框架

合集下载

51单片机C语言编程入门(详讲版)

51单片机C语言编程入门(详讲版)

中国科学技术大学业余无线电协会编目 录§1 前言 (1)§2 单片机简介 (2)2.1 数字电路简介 (2)2.2 MCS-51单片机简介 (2)2.3 Easy 51 Kit Pro简介 (5)2.4 Easy 51 Kit Pro电路功能分析 (5)§3 MCS-51单片机的C语言编程 (8)3.1 汇编语言 (8)3.2 建立你的第一个C项目 (8)3.3 生成hex文件 (12)3.4 Keil C语言 (14)3.5 单片机I/O (18)3.6 中断 (25)3.7 定时器/计数器 (27)3.8 定时器的应用举例 (29)3.9 外部中断 (34)3.10 串行通信 (38)3.11 定时器2 (43)3.12 看门狗 (47)3.13 空闲模式和掉电模式 (50)§4 MCS-51单片机C语言编程应用进阶 (51)4.1 扫描式键盘 (51)4.2 EEPROM芯片AT93C46的读写 (55)4.3 Keil C的高级使用 (63)§5 编写高质量的单片机C程序 (64)5.1 文件结构 (64)5.2 程序的版式 (66)5.3 单片机程序命名规则与变量选择 (70)5.4 表达式和基本语句 (73)5.5 函数设计 (77)5.6 单片机程序框架 (79)附图:Easy 51 Kit Pro电路图(最小系统板) (80)附图:Easy 51 Kit Pro电路图(学习板) (81)§1 前言什么是单片机,目前还没有一个确切的定义。

普通认为单片机是将CPU、RAM、ROM、定时器/计数器以及输入输出(I/O)接口电路等计算机主要部件集成在一块芯片上,这样所组成的芯片级微型计算机称为单片微型计算机(Single Chip Microcomputer)。

简称为单片微机或单片机。

利用单片机程序,可以实现对硬件系统的小型化的智能控制。

基于STC89C52单片机的自动浇花系统设计

基于STC89C52单片机的自动浇花系统设计

在测试过程中,我们发现系统的性能受到环境因素的影响较大,如土壤类型、 气候条件等。为了优化系统的性能,我们采取了多项措施。例如,针对不同类 型的土壤,我们通过调整模糊控制算法的参数,实现更为精准的浇水策略;此 外,我们还添加了更多的传感器节点,以获取更为准确的环境数据。这些优化 措施显著提高了系统的性能和稳定性。
在软件设计方面,我们采用定时器中断的方式来实现时间的测量。当超声波传 感器接收到反射回来的超声波时,会触发定时器中断。通过计算定时器计数值 与单片机的时钟频率,可以得出超声波的传播时间,从而计算出距离。
为了验证该系统的正确性和可靠性,我们进行了一系列实验。在实验中,我们 将超声波测距系统置于不同的距离处,测量实际距离与系统测距值的误差。实 验结果表明,在距离为50cm到200cm的范围内,系统测距误差小于2%。
关键词:STC89C52单片机、自动 浇花系统、设计
在当今社会,人们越来越重视生活质量,盆栽植物已成为许多家庭和办公室的 必备装饰。但植物的生长需要适量的水分,因此,设计一种能自动检测植物土 壤湿度并适时浇水的系统显得尤为重要。本次演示将介绍一种以STC89C52单 片机为核心的自动浇花系统,该系统能自动检测土壤湿度,并根据植物的需求 进行浇水。
系统优化
为了进一步提高系统的稳定性和可靠性,我们采取了以下措施进行系统优化:
1、采用更精确的传感器:选择测量精度更高的酒精传感器,可以提高系统的 测量准确性。
2、增加滤波算法:在数据处理阶段加入滤波算法,可以去除采集数据中的噪 声,提高测量稳定性。
3、软件优化:针对软件中存在的潜在问题,进行优化和重构,提高系统的可 靠性。
算法设计:算法设计主要包括输入输出算法、模糊控制算法等。输入输出算法 用于读取传感器的值并输出控制信号;模糊控制算法则根据植物的需求和环境 因素,制定相应的浇水策略。

单片机课程设计

单片机课程设计

单片机课程设计《机器人入门》2021年亚太大学生机器人大赛——胜利鼓乐课程名称:单片机课程设计系部:自控系则专业班级:计算机控制20931学生姓名:陆小祥一、总体方案:1.工作原理:本设计使用stc89c52rc单片机做为本系统的掌控模块。

单片机可以把由ds18b20、ds1302、at24c02中的数据利用软件去展开处置,从而把数据传输至表明模块,同时实现温度、日历和闹铃的表明。

以lcd液晶显示器为表明模块,把单片机响起的数据表明出,并且表明多样化。

在表明电路中,主要依靠按键去同时实现各种表明建议的挑选与转换。

2.总体设计:设计总体框架图例如图二、系统硬件设计(单元电路设计及分析):1.stc89c52rc单片机最轻系统:最小系统包括晶体振荡电路、复位开关和电源部分。

图2为stc89c52rc单片机的最小系统。

图2最轻系统电路图2.温度测量模块:温度测量传感器使用dallas公司ds18b20的单总线数字化温度传感器,测温范围为-55℃~125℃,可编程为9十一位~12十一位a/d切换精度,测温分辨率达至0.0625℃,使用真菌电源工作方式,cpu只需一根口线便能够与ds18b20通信,挤占cpu口线太少,可以节省大量引线和逻辑电路。

USB电路例如图3右图。

图3ds18b20测量电路3.时钟模块:时钟模块采用ds1302芯片,ds1302是dallas公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和31字节静态ram通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作可通过am/pm指示决定采用24或12小时格式ds1302与单片机之间能简单地采用同步串行的方式进行通信仅需用到三个口线:rst复位、i/o数据线、sclk串行时钟。

时钟/ram的读/写数据以一个字节或多达31个字节的字符组方式通信。

ds1302工作时功耗很低,保持数据和时钟信息时功率小于1mw,其接线电路如图4所示:图4时钟电路4.存储器模块:图5at24c02存储器电路5.lcd液晶显示模块:lcd液晶显示模块使用lcd1602型号,具备很低的功耗,正常工作时电流仅2.0ma/5.0v。

CC2530单片机原理及应用教学课件第3章

CC2530单片机原理及应用教学课件第3章

~SRAM_SIZE-1。
返回
3.1.2 存储器和映射
CODE映射一
0xFFFF Bank 0-7
(32KB FLASH)
0x8000 0x7FFF
普通区/Bank 0 (32KB FLASH)
0x0000
CC2530F256中的FLASH存储空间为256KB, 超出了8051单片机16位地址总线的寻址空间。
3.3 通用 I/O
3.3.1 功能寄存器PxSEL 3.3.2 方向寄存器PxDIR 3.3.3 配置寄存器 PxINP 教学目标:掌握CC2530通用 I/O 寄存器及其应用。
3.3 通用I/O
知识点1:I/O端口的特点、分类、设置方法 提问:I/O端口的重要特点是什么?CC2530有哪些端口?分别是多少位? 对应哪些引脚? 知识点2:功能选择寄存器PxSEL 提问:功能选择寄存器有什么作用?如何配置? 知识点3:方向寄存器PxDIR 提问:方向寄存器有什么作用?如何配置? 知识点4:寄存器应用 提问:如何控制LED闪烁
1111
=0xFFF F
信息页面映射到XDATA的地址区域为
XBANK ( 可选的32KB闪存区 )
0x7800~0x7FFF,个只读区域,存储与芯片相
0x8000 0x7FFF
0x7800
信息页面 (2KB)
关的信息。 8051的SFR寄存器映射的地址区域为
8051 SFR空间 8051 DATA 空间
(0x8000+SRAM_SIZE-1),从而使程序代码从RAM执行。
0:SRAM映射到CODE功能禁用;1:SRAM映射到CODE功能使能
2~0 XBANK[2:0] 000 R/W XDATA区选择,控制物理闪存存储器的哪个代码区域映射到

【C语言】单片机上的按键检测框架

【C语言】单片机上的按键检测框架

【C语⾔】单⽚机上的按键检测框架⼜好久没来写blog,最近在做项⽬发现之前写的stm32操作都忘了,还好做了个记录,回来看了下很多忘了的就⼜知道怎么做了。

下⾯是我之前写的⼀个按键检测的框架,适合⽐较多的按键操作,从信号接收、滤波、最好处理按键任务,⼤体上没什么问题,不过没具体测试过到时可能会有bug。

1/******************************************************************************2* @file button.c3* @author wule4* @version5* @date6* @brief7******************************************************************************8*9*****************************************************************************/1011 typedef unsigned char ButtonSizeType;1213 typedef enum{14 RESET = 0,15 SET = !RESET,16 }FLAG;1718 typedef struct button_bit{19 ButtonSizeType button1:1;20 ButtonSizeType button2:1;21 ButtonSizeType button3:1;22 ButtonSizeType button4:1;23 ButtonSizeType button5:1;24 ButtonSizeType button6:1;25 ButtonSizeType button7:1;26 ButtonSizeType button8:1;27 }ButtonBitType;2829 typedef union30 {31 ButtonBitType button_bit;32 ButtonSizeType button;33 }ButtonType;3435 ButtonType InputFlag;3637//初始化按键标志状态38void Init_Button_Variable(void)39 {40 InputFlag.button = 0;41 }4243//判断函数,读取每个按键的状态44 ButtonSizeType ReadButtonBit(void)45 {46 ButtonType button_bit;4748 button_bit.button = 0;4950 button_bit.button_bit.button1 = 1;51 button_bit.button_bit.button3 = 1;52 button_bit.button_bit.button5 = 1;5354return button_bit.button;55 }56//滤波,返回值代表当前按键的值57 ButtonSizeType Button_Filter(void)58 {59 ButtonSizeType bf_buf;60static ButtonSizeType bf_pre_buf = 0,bf_backval = 0;61static unsigned char bf_filtercnt = 0;6263 bf_buf = ReadButtonBit();6465if(bf_buf != bf_backval && bf_buf == bf_pre_buf)//判断两次是否相同66 {67 bf_filtercnt ++;68if(bf_filtercnt > 50)//作⼀个简单的滤波69 {70 bf_backval = bf_pre_buf;71 }72 }73else74 {75 bf_pre_buf = bf_buf;76 bf_filtercnt = 0;77 }7879return bf_backval;80 }81//处在⼀个时间可控的位置,这⾥可以实现各种按键的操作82void ButtonTask(void)83 {84 ButtonType bt_state = Button_Filter();//得到按键状态8586if(InputFlag.button_bit.button1 == 0 && bt_state.button_bit.button1 == 1)87 {88//单次触发89 }90else if(InputFlag.button_bit.button1 == 1 && bt_state.button_bit.button1 == 0) 91 {92//单次释放93 }949596if(bt_state.button_bit.button1 == 1)97 {98//计时触发99 }100else101 {102//结束判断按的时间103 }104 }。

教学课件 单片机原理及接口技术(第二版)李全利

教学课件 单片机原理及接口技术(第二版)李全利

输入设备
存储器
输出设备
控制器
运算器
2023/3/2
5
电子计算机经历了五个年代
电子管计算机 晶体管计算机 集成电路计算机 大规模集成电路计算机 超大规模集成电路计算机
结构仍然没有突破冯·诺依曼提出的计算机的经 典结构框架。
2023/3/2
6
1.1.2 微型计算机的组成及其应用形态
微处理器
1971年1月,INTEL将: ❖ 运算器 ❖ 控制器 ❖ 一些寄存器 集成在一个芯片上 --------微处理器
2023/3/2
3
1.1 电子计算机概述
1.1.1 电子计算机的经典结构
1946年2月 15日,第一 台电子数字 计算机问世。
ENIAC
标志着计算机时代的到来,对人类的生产和生活方式产生了 巨大的影响 。
2023/3/2
4
冯·诺依曼提出“程序存储”和“二进制运 算”的思想,构建了计算机经典结构:
特点:结构体系完善,性能已大大提高,面向控制 的特点进一步突出。现在,MCS-51已成为公认的单 片机经典机种 。
2023/3/2
14
性能提高阶段
近年来,不断有单片机新品出现。如ATMEL公司推出 的单片机AT89C51RD2:
8位CPU;64K字节ROM(有ISP能力);256字节RAM+1K 字节的XRAM+2K字节EEPROM;1个全双工串行口;3个 16位定时/计数器;7个中断源,4个优先级;硬件看 门狗等。
20
指令的表示形式
指令是让单片机执行某种操作的命令,按 一定的顺序以二进制码的形式存放于程序存 储器。如:
0000 0100B
04H
04H:累加器A的内容加1,难记! INC A,记忆容易。称为符号指令。

单片机应用系统总体设计

单片机应用系统总体设计
单片机应用系统总体设计
目 录
• 单片机应用系统概述 • 单片机应用系统的硬件设计 • 单片机应用系统的软件设计 • 单片机应用系统的调试与测试 • 单片机应用系统的实际案例分析
01 单片机应用系统概述
单片机的定义与特点
单片机是一种集成电路芯片,它集成了 中央处理器、存储器、定时器/计数器、 输入/输出接口等基本功能模块,具有 体积小、功耗低、可靠性高、成本低等
工业自动化控制系统
系统功能
控制机械臂、传感器数据采集、生产流程控制等。
技术特点
高精度、实时性、抗干扰能力强。
医疗设备控制系统
要点一
系统功能
控制医疗设备、监测生理参数、数据存储与分析等。
要点二
技术特点
高安全性、低功耗、易于集成。
智能仪表控制系统
系统功能
数据采集、仪表控制、通信接口等。
技术特点
高精度、低功耗、易于扩展性。
优点。
单片机具有高度的集成性和灵活性,可 单片机具有丰富的外设接口,可以方便
以根据不同的应用需求进行定制和扩展, 地与各种传感器、执行器等外围设备进
广泛应用于智能仪表、工业控制、智能
行连接统的应用领域
智能仪表
单片机在智能仪表领域的应用非常广泛 ,如水表、电表、燃气表等,可以实现 远程抄表、数据采集、控制等功能。
考虑微控制器的开发工具和编程环境,确保易于开发与调试。
存储器设计
01
根据系统需求选择适当的存储器类型,如RAM、ROM、 EEPROM等。
02
确定存储器容量,以满足程序运行和数据存储的需求。
03
考虑存储器的访问速度和功耗,以确保系统性能和稳定性。
输入输出接口设计
根据系统输入输出需求,选择适当的接口芯片和 电路。

基于51单片机的轴向位移测量系统的设计

基于51单片机的轴向位移测量系统的设计

设计基于51单片机的轴向位移测量系统涉及到传感器的选择、信号处理、数据显示等多个方面。

以下是一个基本的设计框架:
系统组成:
1. 传感器选择:选择合适的轴向位移传感器,如应变片传感器、压力传感器等,用于测量被测物体的位移。

2. 信号调理:设计模拟电路,将传感器输出的模拟信号进行放大、滤波、AD转换等处理,然后输入到51单片机中。

3. 数据处理:在51单片机中编写程序,对采集到的位移信号进行处理和计算,得到实际的位移数值。

4. 数据显示:可以通过数码管、LCD 显示屏等方式将测量到的位移数值显示出来,也可以通过串口等方式输出到上位机进行显示和记录。

基本步骤:
1. 传感器接口设计:将传感器连接到51单片机的模拟输入引脚上,设计适当的电路进行信号处理。

2. 程序设计:编写51单片机的程序,包括模拟信号采集、数字信号处理和位移计算等部分。

3. 数据显示设计:根据需要选择合适的显示方式,并编写相应的显示程序。

4. 系统集成:将各部分组件进行连接和调试,确保系统正常工作。

注意事项:
1. 精度要求:根据实际需求确定位移测量的精度要求,选择合适的传感器和信号处理方案。

2. 系统稳定性:考虑系统在长时间运行时的稳定性和可靠性,避免因环境因素引起的误差。

3. 电源供应:确保系统稳定的电源供应,避免电源波动对系统造成影响。

以上是基于51单片机的轴向位移测量系统设计的基本框架和步骤,具体实施时需要根据具体要求和条件进行调整和完善。

如果需要更详细的设计方案或技术支持,建议咨询相关领域的专业人士或工程师。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

可编辑 精品文档,欢迎下载 大家来侃侃单片机的裸奔程序的框架呀!以下是我总结的一些东西,不合乎之处来请大家指点呀,本人第二次在21ic发帖,希望大家鼓励鼓励呀!!

从07年参加全国大学生电子设计大赛初次接触单片机开发至今已经有4年了,初学单片机时,都会纠结于其各个模块功能的应用,如串口(232,485)对各种功能IC的控制,电机控制PWM,中断应用,定时器应用,人机界面应用,CAN总线等. 这是一个学习过程中必需的阶段,是基本功。很庆幸,在参加电子设计大赛赛前培训时,MCU周围的控制都训练的很扎实。经过这个阶段后,后来接触不同的MCU就会发现,都大同小异,各有各的优势而已,学任何一种新的MCU都很容易入手包括一些复杂的处理器。而且对MCU的编程控制会提升一个高度概况——就是对各种外围进行控制(如果是对复杂算法的运算就会 用DSP了),而外围与MCU的通信方式一般也就几种时序:IIC,SPI,intel8080,M6800。这样看来MCU周围的编程就是一个很简单的东西了。 然而这只是嵌入式开发中的一点皮毛而已,在接触过多种MCU,接触过复杂设计要求,跑过操作系统等等后,我们在回到单片机的裸机开发时,就不知不觉的就会考虑到整个程序设计的架构问题;一个好的程序架构,是一个有经验的工程师和一个初学者的分水岭。 以下是我对单片机程序框架以及开发中一些常用部分的认识总结: 任何对时间要求苛刻的需求都是我们的敌人,在必要的时候我们只有增加硬件成本来消灭它;比如你要8个数码管来显示,我们在没有相关的硬件支持的时候必须用MCU以动态扫描的方式来使其工作良好;而动态扫描将或多或少的阻止了MCU处理其他的事情。在MCU负担很重的场合,我会选择选用一个类似max8279外围ic来解决这个困扰; 然而庆幸的是,有着许多不是对时间要求苛刻的事情: 例如键盘的扫描,人们敲击键盘的速率是有限的,我们无需实时扫描着键盘,甚至可以每隔几十ms才去扫描一下;然而这个几十ms的间隔,我们的MCU还可以完成许多的事情; 单片机虽然是裸机奔跑,但是往往现实的需要决定了我们必须跑出操作系统的姿态——多任务程序; 比如一个常用的情况有4个任务: 1 键盘扫描; 2 led数码管显示; 3 串口数据需要接受和处理; 4 串口需要发送数据; 如何来构架这个单片机的程序将是我们的重点;

读书时代的我会把键盘扫描用查询的方式放在主循环中,而串口接收数据用中断,在中断服务函数中组成相应的帧格式后置位相应的标志位,在主函数的循环中进行数据的处理,串口发送数据以及led的显示也放在主循环中;

这样整个程序就以标志变量的通信方式,相互配合的在主循环和后台中断中执行; 然而必须指出其不妥之处: 每个任务的时间片可能过长,这将导致程序的实时性能差。如果以这样的方式在多加几个任务,使得一个循环的时间过长,可能键盘扫描将很不灵敏。所以若要建立一个良好的通用编程模型,我们必须想办法,消去每个任务中费时间的部分以及把每个任务再次分解;下面来细谈每个任务的具体措施:可编辑 精品文档,欢迎下载 1 键盘扫描 键盘扫描是单片机的常用函数,以下指出常用的键盘扫描程序中,严重阻碍系统实时性能的地方; 众所周知,一个键按下之后的波形是这样的(假定低有效): 在有键按下后,数据线上的信号出现一段时间的抖动,然后为低,然后当按键释放时,信号抖动一段时间后变高。当然,在数据线为低或者为高的过程中,都有可能出现一些很窄的干扰信号。 unsigned char kbscan(void) { unsigned char sccode,recode; P2=0xf8; if ((P2&0xf8)!=0xf8) { delay(100); //延时20ms去抖--------这里太费时了,很糟糕 if((P2&0xf8)!=0xf8) { sccode=0xfe; while((sccode&0x08)!=0) { P2=sccode; if ((P2&0xf8)!=0xf8) break; sccode=(sccode<<1)|0x01; } recode=(P2&0xf8)|0x0f; return(sccode&recode); } } return (KEY_NONE); } 键盘扫描是需要软件去抖的,这没有争议,然而该函数中用软件延时来去抖(ms级别的延时),这是一个维持系统实时性能的一个大忌讳; 一般还有一个判断按键释放的代码: While( kbscan() != KEY_NONE) ; //死循环等待 这样很糟糕,如果把键盘按下一直不放,这将导致整个系统其它的任务也不能执行,这将是个很严重的bug。 有人会这样进行处理: While(kbsan() != KEY_NONE ) { Delay(10); If(Num++ > 10) Break; 可编辑 精品文档,欢迎下载 } 即在一定得时间内,如果键盘一直按下,将作为有效键处理。这样虽然不导致整个系统其它任务不能运行,但也很大程度上,削弱了系统的实时性能,因为他用了延时函数;

我们用两种有效的方法来解决此问题: 1 在按键功能比较简单的情况下,我们仍然用上面的kbscan()函数进行扫描,只是把其中去抖用的软件延时去了,把去抖以及判断按键的释放用一个函数来处理,它不用软件延时,而是用定时器的计时(用一般的计时也行)来完成;代码如下 void ClearKeyFlag(void) { KeyDebounceFlg = 0; KeyReleaseFlg = 0; }

void ScanKey(void) { ++KeyDebounceCnt;//去抖计时(这个计时也可以放在后台定时器计时函数中处理) KeyCode = kbscan(); if (KeyCode != KEY_NONE) { if (KeyDebounceFlg)//进入去抖状态的标志位 { if (KeyDebounceCnt > DEBOUNCE_TIME)//大于了去抖规定的时间 { if (KeyCode == KeyOldCode)//按键依然存在,则返回键值 { KeyDebounceFlg = 0; KeyReleaseFlg = 1;//释放标志 return; //Here exit with keycode } ClearKeyFlag(); //KeyCode != KeyOldCode,只是抖动而已 } }else{ if (KeyReleaseFlg == 0) { KeyOldCode = KeyCode; KeyDebounceFlg = 1; KeyDebounceCnt = 0; }else{ if (KeyCode != KeyOldCode) ClearKeyFlag(); 可编辑 精品文档,欢迎下载 } } }else{ ClearKeyFlag();//没有按键则清零标志 } KeyCode = KEY_NONE; }

在按键情况较复杂的情况,如有长按键,组合键,连键等一些复杂功能的按键时候,我们跟倾向于用状态机来实现键盘的扫描; //avr 单片机 中4*3扫描状态机实现 char read_keyboard_FUN2() { static char key_state = 0, key_value, key_line,key_time; char key_return = No_key,i; switch (key_state) { case 0: //最初的状态,进行3*4的键盘扫描 key_line = 0b00001000; for (i=1; i<=4; i++) // 扫描键盘 { PORTD = ~key_line; // 输出行线电平 PORTD = ~key_line; // 必须送2次!!!(注1) key_value = Key_mask & PIND; // 读列电平 if (key_value == Key_mask) key_line <<= 1; // 没有按键,继续扫描 else { key_state++; // 有按键,停止扫描 break; // 转消抖确认状态 } } break; case 1: //此状态来判断按键是不是抖动引起的 if (key_value == (Key_mask & PIND)) // 再次读列电平, { key_state++; // 转入等待按键释放状态 key_time=0; } else key_state--; // 两次列电平不同返回状态0,(消抖处理) break; case 2: // 等待按键释放状态 可编辑 精品文档,欢迎下载 PORTD = 0b00000111; // 行线全部输出低电平 PORTD = 0b00000111; // 重复送一次 if ( (Key_mask & PIND) == Key_mask) { key_state=0; // 列线全部为高电平返回状态0 key_return= (key_line | key_value);//获得了键值 } else if(++key_time>=100)//如果长时间没有释放 { key_time=0; key_state=3;//进入连键状态 key_return= (key_line | key_value); } break; case 3://对于连键,每隔50ms就得到一次键值,windows xp 系统就是这样做的 PORTD = 0b00000111; // 行线全部输出低电平 PORTD = 0b00000111; // 重复送一次 if ( (Key_mask & PIND) == Key_mask) key_state=0; // 列线全部为高电平返回状态0 else if(++key_time>=5) //每隔50MS为一次连击的按键 { key_time=0; key_return= (key_line | key_value); } break; } return key_return; }

以上用了4个状态,一般的键盘扫描只用前面3个状态就可以了,后面一个状态是为增加“连键”功能设计的。连键——即如果按下某个键不放,则迅速的多次响应该键值,直到其释放。在主循环中每隔10ms让该键盘扫描函数执行一次即可;我们定其时限为10ms,当然要求并不严格。

相关文档
最新文档