单片机5按键功能的实现

单片机5按键功能的实现
单片机5按键功能的实现

实验5 按键功能的实现

一、实验目的

1、理解按键电路的作用;

2、学习按键功能的编程方法;

3、熟悉单片机I/O口连接独立式按键的编程应用方法。

二、实验说明

按键在单片机应用系统中实现向单片机输入数据、传送命令等功能,是人工干预单片机工作的主要手段。如果需要较多数量的按键,可以采用按键矩阵和专门的接口器件扩展按键。实际的单片机应用系统中,用到的按键数量一般不多,通常采用单片机I/O口和独立式按键即能满足需要。

实验箱核心板上有 4 个按键,其一端全部与地线相连,另一端顺次与

P1.4~P1.7 相连。本实验需要用到核心板上的3 个按键、3 个指示灯和6 个数码管,所用到的实验电路原理如图 3.1.6 所示。

本实验中 3 个按键设计的功能,是一个实用的简单温度控制系统的按键功能,要求通过按键设定一个温度上限值和一个温度下限值。本实验只涉及按键和显示功能,在今后的实验中,将进一步增加硬件和软件功能,利用单片机实现实际的温度控制系统,使温度维持在上、下限值之间。

①“功能”键:在内存数据区定义一个名称为“KBM”的字节,存放功能编号,共有 3 种功能,分别对应编号为0,1,2。每按一次“功能”键,“KBM”中的值在这三个数字中循环改变一次。与三种功能对应,设计三个LED(发光二极管)指示灯,由单片机P3 口控制,当处于某种功能状态时,相应的指示灯亮。本实验的内容,实际上是后面进一步做温度测量控制系统的一部分。三种功能的含义如下:

功能号0:显示测量的温度值;

功能号1:对温度上限值进行修改;

功能号2:对温度下限值进行修改。

②“↑”键:每按一次“↑”键,内存数据区中指定变量单元的值增1,持续按住则连续增1。

③“↓”键:与“↑”键对应,每按一次“↓”,内存数据区中指定变量单元的值减1,持续按住则连续减1。

功能号为0 时,数码管显示被测温度值,此时按另外两个按键不起作用。功能号为 1 时,数码管显示设定温度的上限值,按另外两个按键可以修改温度上限值。功能号为 2 时,数码管显示设定温度的下限值,此时按另外两个按键可以修改温度下限值。

3、实验任务

1、理解单片机I/O口与按键、指示灯和LED数码管的综合使用方法;

2、理解图3.1.6所示的电路,读懂参考程序;

3、自行设计按键显示功能(比如将6位数码管分成三组,分别显示上限、下限、

测量值),并编程实现所设计的功能。

4、程序流程图及代码分析

D_DAT0 EQU 60H

D_DAT1 EQU D_DAT0+1

D_DAT2 EQU D_DAT1+1

D_DAT3 EQU D_DAT2+1

D_DAT4 EQU D_DAT3+1

D_DAT5 EQU D_DAT4+1 ;定义显示数据单元

LIGHT EQU D_DAT5+1

H_DAT0 EQU LIGHT+1

H_DAT1 EQU H_DAT0+1

KBM EQU H_DAT1+1 ;定义按键功能号存放单元

D_MAX EQU KBM+1 ;定义上限值存放单元

D_MIN EQU D_MAX+1 ;定义下限值存放单元

T_DAT0 EQU D_MIN+1

T_DAT1 EQU T_DAT0+1 ;定义测量值存放单元

ORG 0000H

AJMP START

ORG 0030H

START: MOV SP,#30H ;初始化堆栈指针

MOV D_DAT0, #0

MOV D_DAT1, #0

MOV D_DAT2, #0

MOV D_DAT3, #0

MOV D_DAT4, #0

MOV D_DAT5,#0 ;初始化显示数据

MOV LIGHT, #80H

CLR P1.0

CLR P1.1

CLR P1.2

CLR P1.3 ;初始化有关I/O口

MOV R0,#D_DAT0 ;初始化数据指针,R0指向第一位显示数字

MOV R1,#01H ;初始化需点亮数码管位置代码

MOV KBM,#0 ;初始化功能号

MOV D_MAX, #80

MOV D_MIN, #70 ;初始化上、下限值

MOV T_DAT0, #66

MOV T_DAT1,#0 ;目前人为赋给测量值一个值,将来有实际测量值就存放在此

MOV H_DAT0, T_DAT0

MOV H_DAT1, T_DAT1

LCALL HTD ;将测量值二进制数转换为十进制数

MAIN: LCALL DISP ;刷新显示

LCALL DELAY ;显示、延时子程序同前

;******************************************************

;按键处理程序

;*****************************************************

JB P1.7,KEY1 ;查询K0,若K0未按下则跳转

LCALL DISP

LCALL DELAY ;延时去抖动,顺便刷新显示

JB P1.7,KEY1 ;若K0未真正按下则跳转

INC KBM ;K0真正按下,功能号增1

MOV A,KBM

CJNE A,#3,KEY01

MOV KBM,#0 ;若功能号为3,则清0

KEY01: NOP

AJMP KEND ;跳转至按键结束处理程序

KEY1: JB P1.6,KEY2 ;查询K1

LCALL DISP

LCALL DELAY

JB P1.6,KEY2

MOV A,KBM

CJNE A,#1,KEY11 ;功能号不为1则跳转

INC D_MAX ;功能号1,上限值加1

AJMP KEND

KEY11: CJNE A,#2,KEY12 ;功能号不为2则跳转

INC D_MIN ;功能号2,下限值加1

KEY12: AJMP KEND ;跳转至按键结束处理程序

KEY2: JB P1.5,KEND ;查询K2

LCALL DISP

LCALL DELAY

JB P1.5,KEND

MOV A,KBM

CJNE A,#1,KEY21

DEC D_MAX ;功能号1,上限值减1

AJMP KEND

KEY21: CJNE A,#2,KEND

DEC D_MIN ;功能号2,下限值减1

KEND: NOP ;以下程序根据功能号显示不同内容

MOV A, KBM

CJNE A, #0, KEND1

MOV H_DAT0, T_DAT0

MOV H_DAT1,T_DAT1 ;功能号0,准备显示测量数据

MOV LIGHT,#0BFH ;点亮相应指示灯

AJMP KEND3 ;跳转到刷新显示处

KEND1: NOP

CJNE A, #1, KEND2

MOV H_DAT0, D_MAX

MOV H_DAT1,#0 ;功能号1,准备显示上限值

MOV LIGHT,#7FH ;点亮相应指示灯

AJMP KEND3 ;跳转到刷新显示处

KEND2: NOP

CJNE A, #2,KEND3

MOV H_DAT0, D_MIN

MOV H_DAT1,#0 ;功能号2,准备显示下限值

MOV LIGHT,#0DFH ;点亮相应指示灯

KEND3: MOV P0, LIGHT

SETB P1.0

NOP

CLR P1.0 ;产生一个指示灯输出锁存脉冲

LCALL HTD ;将需显示数据转换成4个十进制数

MOV R4, #80H

KEND4: LCALL DISP

LCALL DELAY ;刷新显示,延时

DJNZ R4,KEND4 ;此处循环延时是为了避免按键多次重入

LJMP MAIN ;跳转到主程序开始处循环执行

;******************************************************

;通过595显示4位数字子程序

;*****************************************************

DISP: MOV A,R1 ;取位代码数据

MOV R2,#8

DISP1: CLR C

RLC A

MOV P1.3,C ; 位代码送到SER的输入端

SETB P1.1

NOP

CLR P1.1 ;产生一个输入锁存脉冲

DJNZ R2,DISP1 ;依次将8位位代码移入,实际只有6位有用

MOV A,@R0 ;取需显示的数字

MOV DPTR,#DISPD ;笔画编码表同前

MOVC A,@A+DPTR ;取需显示数字笔画代码

MOV R2, #8

DISP2: CLR C

RLC A

MOV P1.3,C ;笔画代码送到SER的输入端

SETB P1.1

NOP

CLR P1.1 ;产生一个输入锁存脉冲

DJNZ R2,DISP2 ;依次将8位笔画代码(段代码)移入

INC R0 ;R0增1指向下一个需显示数字

MOV A,R1

RL A

MOV R1,A ;R1中的值左移1位,指向下一位数码管

CJNE R1,#40H,DISP3 ;R0中不为70H则继续

MOV R0, #D_DAT0

MOV R1,#01H ;R0中为70H,循环完一轮

;重新赋初值

DISP3: SETB P1.2

CLR P1.2

RET

;数字笔画代码表

; 0 1 2 3 4 5 6 7 8 9 熄DISPD: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,0

;**********************************************

;延时子程序

;**********************************************

DELAY: MOV R7,#2

DELY1: MOV R6,#0FFH

DELY2: DJNZ R6,$ ;$代表当前行(与DJNZ R6,DELY2相同) DJNZ R7, DELY1

RET

;二进制转换十进制子程序

HTD: M OV D_DAT5,#00H ;将结果千位清0

MOV D_DAT4, #00H

MOV D_DAT3, #00H

MOV D_DAT2, #00H

H1000: CLR C ;进位位C清0

MOV A,H_DAT0 ;源数据低位装载到累加器A中

MOV R6,A ;备份源数值低位到寄存器R6中

SUBB A,#0E8H ;源数值低位减去1000的低位0E8H

MOV H_DAT0,A ;余数存回到源数值低位存储单元

MOV A,H_DAT1 ;源数值高位装载到累加器A中

MOV R7,A ;备份源数值高位到寄存器R7中

SUBB A,#03H ;源数值高位带借位减1000的高位03H

MOV H_DAT1,A ;余数存回到源数值低位存储单元

INC D_DAT2 ;千位增1

JNC H1000 ;如果没有借位则利用余数循环再减

;有借位表明为最后一次无效减

;程序顺序执行,应还原最后一次修改值

MOV H_DAT0,R6

MOV H_DAT1,R7 ;用备份值作为新的源数值(余数)

DEC D_DAT2 ;千位数减1,去掉最后一次无效减的影响

H100: MOV A,H_DAT0 ;源数值低位装载到累加器A中MOV R6,A ;备份源数值低位到寄存器R6中

CLR C ;清0进位位C

SUBB A,#100 ;减去100

MOV H_DAT0,A ;存回余数低位

MOV A,H_DAT1 ;取源数值高位

SUBB A,#00H ;减100的高位0,实际上是减去借位位

MOV H_DAT1,A ;存回余数高位

JC H10 ;有借位则跳到下一步继续运算

INC D_DAT3 ;没有借位,百位增1

AJMP H100 ;没有借位继续减

;注意本轮循环中最后一次减时百位未增1

;所以不存在还原的问题

;进入下一轮时,源数值(余数)都在R6中

H10: C LR C

MOV A,R6 ;源数值(低位)装载到累加器A中

;到此源数值高位已经为0,不用再参加计算MOV D_DAT5,A ;存回源数值低位

;如果是最后一次减,则此值即为个位

SUBB A,#10 ;减去10

MOV R6,A ;保存余数

JC H1 ;有借位,运算结束

INC D_DAT4 ;没有借位,十位增1

LJMP H10 ;没有借位继续减

H1: RET ;子程序返回

END

5、实验现象

数码管能正确显示,能正确实现按键的功能。

6、实验小结

本实验重在掌握按键电路的实现,实验程序较为复杂,需要多花功夫理解。

思考题:

1、实验程序如下:

MOV A,#12H

MOV P0,A

MAIN:JNB P1.4,K1

JNB P1.5,K2

JNB P1.6,K3

JNB P1.7,K4

AJMP MAIN

K1: INC A

MOV P0,A

LCALL DELAY

LOOP1:JNB P1.4,LOOP1

AJMP MAIN

K2: DEC A

MOV P0,A

LCALL DELAY

LOOP2:JNB P1.5,LOOP2

AJMP MAIN

K3: RL A

MOV P0,A

LCALL DELAY

LOOP3:JNB P1.6,LOOP3

AJMP MAIN

K4: RR A

MOV P0,A

LCALL DELAY

LOOP4:JNB P1.7,LOOP4

AJMP MAIN DELAY:MOV R7,#255

DELAY1:MOV R6,#0

NOP

NOP

NOP

DJNZ R6,$

NOP

NOP

NOP

NOP

DJNZ R7,DELAY1

RET

END

自己写的按键单片机程序

自己写的按键单片机程序 用4个按键来控制数码管显示的内容#include#define duan P0//段选#define wei P2//位选unsigned char code wei1[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制查表的方法控制unsigned char code duan1[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0 x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码unsigned char ge,shi,bai,a,b;sbit key1=P1;sbit key2=P1 ;sbit key3=P1 ;sbit key4=P1 ;void keys();//按键函数void s(unsigned char xms);//延时函数void DigDisplay(); //动态显示函数void init(); //初始化函数void main(void){init(); while(1){DigDisplay();keys();} }void DigDisplay(){unsigned char i;unsigned int j;bai=a/100;shi=a%100/10;ge=a%10;i=0;wei = wei1[i];//发送位选duan = duan1[bai]; //发送段码j = 10;//扫描间隔时间设定while(j--);duan = 0x00; //消隐i++;wei = wei1[i];//发送位选duan = duan1[shi]; //发送段码j = 10;//扫描间隔时间设定while(j--);duan = 0x00; //消隐i++;wei = wei1[i];//发送位选duan = duan1[ge]; //发送段码j = 10;//扫描间隔时间设定while(j--);duan = 0x00; //消隐}void init() {key1=1;key2=1;key3=1;key4=1;TMOD=0X01;TH0=(65536- 45872)/256;TL0=(65536-45872)%256;EA=1;ET0=1;}void s(unsigned char xms){unsigned char x,y;for(x=xms;x>0;x--)for(y=110;y>0;y--);}void times() interrupt 1{TH0=(65536-45872)/256;TL0=(65536-45872)%256;b++;if(b==20){b=0;a++;if(a==256){a=0;}}}void keys(){if(key1==0){s(10);if(key1==0){a++;TR0=0;if(a==256)a=0;while(!key1)Dig Display();}}if(key2==0){s(10);if(key2==0){TR0=0;if(a==0)a=256;a--

按键实现0~9999计数器 单片机

按键调节数码管显示 功能:通过按键加减数码管所显示的数字 按下k1加1,最大加到9999 按下k2减1,最小减到0 按下k3清零复位 C语言程序 //---------------------------------------------------------------------- //名称:按键调节数码管显示 //---------------------------------------------------------------------- //功能:通过按键加减数码管所显示的数字 // 按下k1加1,最大加到9999 // 按下k2减1,最小减到0 // 按下k3清零复位 //---------------------------------------------------------------------- //姓名:陈润源 //地点:内江职业技术学院 //时间:2019年4月6日21:40:41 //---------------------------------------------------------------------- #include #define uchar unsigned char #define uint unsigned int sbit k1 = P1^0; //加 sbit k2 = P1^1; //减

sbit k3 = P1^2; //复位 void key(void); void display(void); uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90}; //数组 char m=99,n=98; //显示初值,m,n的值决定开机显示数值 //**************************************** //延时程序 //**************************************** void delayms(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } //*********************************************** //显示程序 //*********************************************** void display(void) { P2=0X08; P0=table[m%10]; //显示个位 delayms(5); P2=0X04; P0=table[m/10]; //显示十位 delayms(5); P2=0X02; P0=table[n%10]; //显示百位 delayms(5); P2=0X01; P0=table[n/10]; //显示千位 delayms(5); } //*************************************************** //按键处理 //*************************************************** void key() { if(k1==0) //检测按键是否被按下 { //延时消抖 delayms(10); if(k1==0) //再次检测是否真正按下按键 { m++; //m自加一 if(m>=100) //如果m加到100则n加一 (限制m的取值范围) 个位、十位最大显示99 {

基于51单片机的USB键盘设计与实现

三江学院 本科生毕业设计(论文)题目基于51单片机的USB键盘设计与实现高职院院(系)电气工程及其自动化专业 学生姓名梁邱一学号 G105071013 指导教师孙传峰职称讲师 指导教师工作单位三江学院 起讫日期 2013年12月10日至2014年4月12日

摘要 随着计算机技术的不断更新和多媒体技术的快速发展,传统的计算机外设接口因为存在许多缺点已经不能适应计算机的发展需要。比起传统的AT,PS/2,串口,通用串行总线USB,具有速度快,使用方便灵活,易于扩展,支持即插即用,成本低廉等一系列优点,得到了广泛的应用。 本论文阐述了51系列单片机和USB的相关内容,详细介绍了系统的一些功能设计,包括硬件设计和软件设计。在程序调试期间用简单的串口通信电路,通过串口调试助手掌握了USB指令的传输过程,这对整个方案的设计起到了很大的指导作用。论文以单片机最小系统配合模拟键盘组成的USB键盘硬件系统,通过对D12芯片的学习与探索,在其基本命令接口的支持下,结合硬件进行相应的固件程序设计,使其在USB协议下,实现USB模块与PC的数据通信,完成USB键盘的功能模拟。 总结论文研究工作有阐述USB总线的原理、对本设计的系统要求作出了分析、根据要求选定元件和具体编程方案、针对系统所要实现的功能对相关芯片作了详细介绍以及在硬件部分设计了原理图。 关键词:USB;D12;PC

Abstract With the rapid development of computer technology and multimedia technology constantly updated, traditional computer peripheral interface because there are many shortcomings have been unable to meet the development needs of the https://www.360docs.net/doc/6d12803132.html,pared to traditional AT, PS / 2, serial, Universal Serial Bus USB, with fast, flexible and easy to use, easy to expand, support Plug and Play, a series of advantages, such as low cost, has been widely used. This paper describes the 51 series and USB related content, detailing some of the features of the system design, including hardware and software design.During debugging a simple serial communication circuit, through the serial port debugging assistant master USB transfer instructions, which designed the entire program has played a significant role in guiding.Thesis smallest single-chip system consisting of analog keyboard with a USB keyboard hardware system, by learning and exploration D12 chips, with the support of its basic command interface, in conjunction with the corresponding hardware firmware design, making it in the USB protocol, USB module data communication with the PC, the USB keyboard to complete the functional simulation. This paper summarizes research work has elaborated the principle of the USB bus, the system is designed to require the analysis, components and solutions based on the specific requirements of the selected programming for the system to achieve the function of the relevant chips are described in detail in the hardware part of the design as well as the principle of Figure. Keywords:USB;D12;PC

单片机矩阵式键盘连接方法及工作原理

矩阵式键盘的连接方法和工作原理 什么是矩阵式键盘?当键盘中按键数量较多时,为了减少I/O 口线的占用,通常将按键排列成矩 阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样做有什么好处呢?大家看下面的电路图,一个并行口可以构成4*4=16 个按键,比之直 接将端口线用于键盘多出了一倍,而且线数越多,区别就越明显。比如再多加一条线就可以构成20 键 的键盘,而直接用端口线则只能多出一个键(9 键)。由此可见,在需要的按键数量比较多时,采用矩 阵法来连接键盘是非常合理的。 矩阵式结构的键盘显然比独立式键盘复杂一些,识别也要复杂一些,在上图中,列线通过电阻接 电源,并将行线所接的单片机4 个I/O 口作为输出端,而列线所接的I/O 口则作为输入端。这样,当按 键没有被按下时,所有的输出端都是高电平,代表无键按下,行线输出是低电平;一旦有键按下,则输 入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了,具体的识别及编程方法如下 所述: 二.矩阵式键盘的按键识别方法 确定矩阵式键盘上任何一个键被按下通常采用“行扫描法”或者“行反转法”。行扫描法又称为 逐行(或列)扫描查询法,它是一种最常用的多按键识别方法。因此我们就以“行扫描法”为例介绍矩 阵式键盘的工作原理: 1.判断键盘中有无键按下 将全部行线X0-X3 置低电平,然后检测列线的状态,只要有一列的电平为低,则表示键盘中有键 被按下,而且闭合的键位于低电平线与4 根行线相交叉的4 个按键之中;若所有列线均为高电平,则表 示键盘中无键按下。 2.判断闭合键所在的位置 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平(即在 置某根行线为低电平时,其它线为高电平),当确定某根行线为低电平后,再逐行检测各列线的电平状 态,若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。 下面给出一个具体的例子: 单片机的P1 口用作键盘I/O 口,键盘的列线接到P1 口的低4 位,键盘的行线接到P1 口的高4

单片机键盘输入程序

这是读取键盘的子程序 主要内容为:如何定义位,如何得到按键状态,防止键盘干扰的方法 以及如何处理读入的键值 思路:首先在某一引脚输出一个电平,然后读入引脚的电平,如果刚好相反 那么可能有按键发生,但是不排除干扰,为了防止干扰,需要软件延时20ms 应该说键盘输入是单片机外部指令输入的重要途径,因此如何设计键盘以及键盘的工作原理、读键盘的方法、键盘的抗干扰设计等在单电能机系统设计中占有重要地位。这个例子在系统硬件的基础上设计了软件查询程序、软件延时程序(防止干扰),大致讲述了一种查询式键盘的工作原理与读取方式。 下面是汇编语言写的单片机键盘输入程序 ************************************************** led1 bit p1.0;LED 显示位定义 led2 bit p1.1 led3 bit p1.2 led4 bit p1.3 led5 bit p1.4 led6 bit p1.5 led7 bit p1.6 led8 bit p1.7 s1 bit p0.0 ;数码管位定义 s2 bit p0.1 s3 bit p0.2 s4 bit p0.3 s5 bit p0.4 s6 bit p0.5 s7 bit p0.6 s8 bit p0.7 led_data equ p2;数码管显示数据定义 key1 bit p3.5 ;按键引脚定义

key2 bit p3.6; key3 bit p3.7; key equ 46h;按键寄存单元 org 00h jmp main org 030h main:mov sp,#30h;首先定义 lcall REST;初始化子程序 lp:lcall pro_key;调用键盘查询子程序 lcall KEYPR ;用来显示所查询到的键值jmp lp;反复调用,不断查询 REST: mov a,#00h mov b,#00h mov p0,#0 mov p1,0ffh ; mov p2,#0 mov key,#00h mov p2,#255 clr beep RET KEYPR: mov a,key;键值在累加器KEY中 jz PROEND ;如果A= 0,表示没有按键,返回cjne a,#1,k1;A= 1 ,用户按了第一个键mov a,#1 ;处理 A = 1的情况 mov dptr,#tab_nu ;查表 movc a,@a+dptr mov led_data,a ;显示"1" setb s1 ;在第一位

单片机频率计数器课程设计

课程设计报告 课程名称:单片机课程设计 题目:基于单片机的频率计数器设计 学院:环境与化学工程系:过程装备与测控工程 专业: 班级: 学号: 学生姓名: 起讫日期: 指导教师:

摘要 数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。它是一种用十进制数字,显示被测信号频率的数字测量仪器。它的基本功能是测量正弦信号,方波信号以及其他各种单位时间内变化的物理量。本课程设计主要设计一个简易的频率计,来实现信号在0-9999HZ范围内周期变化的方波频率的测定。 该文主要介绍了基于STC89C52 单片机频率计的设计方案和实现方法,该系统主要由硬件和软件两部分组成,其中重点给出了具体硬件电路图和软件流程图以及具体工作原理。硬件部分通过洞洞板的布线设计帮助,可以确保焊接时尽量少的飞线和出错。软件通过keil μvision编译及调试,其中在P1.7口编入了一个5500HZ的方波,用以仿真调试该频率计的软硬件功能是否能够实现输出频率的功能。另外,本设计多增加了一个按键功能,通过一个按键来控制定时计数器的开始和关闭。该频率计还带有3*3的矩阵键盘,可以作为扩展应用区,通过编程实现。本设计中用的是LED共阴数码管,输出频率时采用的事动态显示的方法。 关键词:频率计;单片机;动态显示

目录 一、频率计数器的设计任务和要求 (1) 1.1 频率计数器的设计任务 (1) 1.2 设计要求及发挥部分 (1) 二、方案的总体设计 (1) 2.1 方案的设计 (1) 2.2 方案的整体框图 (2) 2.3 方案的说明 (2) 三、硬件设计 (2) 3.1 单片机的最小系统 (2) 3.1.1 上电复位电路 (2) 3.1.2 晶振电路 (3) 3.2 LED数码管显示电路 (3) 3.3 整体电路 (4) 四、软件设计 (4) 4.1 程序流程图 (5) 4.2 初始化子函数 (5) 4.3 延时子函数 (5) 4.4 中断子函数 (5) 五、系统的调试和说明 (6) 5.1 C程序的说明 (6) 5.2 C程序编译的结果 (6) 5.3 实物图 (7) 六、设计总结与心得体会 (8) 6.1设计总结 (8) 6.2 设计心得 (9) 七、参考文献 (9) 附录 (10)

单片机按键连接方法

单片机按键连接方法总结(五种按键扩展方案详细介绍) 单片机在各种领域运用相当广泛,而作为人机交流的按键设计也有很多种。不同的设计方法,有着不同的优缺点。而又由于单片机I/O资源有限,如何用最少的I/O口扩展更多的按键是我所研究的问题。接下来我给大家展示几种自己觉得比较好的按键扩展方案,大家可以在以后的单片机电路设计中灵活运用。 1)、第一种是最为常见的,也就是一个I/O口对应一个按钮开关。 这种方案是一对一的,一个I/O口对应一个按键。这里P00到P04,都外接了一个上拉电阻,在没有开关按下的时候,是高电平,一旦有按键按下,就被拉成低电平。这种方案优点是电路简单可靠,程序设计也很简单。缺点是占用I/O资源多。如果单片机资源够多,不紧缺,推荐使用这种方案。 2)、第二种方案也比较常见,但是比第一种的资源利用率要高,硬件电路也不复杂。 这是一种矩阵式键盘,用8个I/O控制了16个按钮开关,优点显而易见。当然这种电路的程序设计相对也还是很简单的。由P00到P03循环输出低电平,然后检测P04到P07的状态。比方说这里P00到P03口输出1000,然后检测P04到P07,如果P04为1则说明按下的键为s1,如果P05为1则说明按下的是s2等等。为了电路的可靠,也可以和第一种方案一样加上上拉电阻。 3)、第三种是我自己搞的一种方案,可以使用4个I/O控制8个按键,电路多了一些二极管,稍微复杂了一点。 这个电路的原理很简单,就是利用二极管的单向导电性。也是和上面的方案一样,程序需要采用轮训的方法。比方说,先置P00到P03都为低电平,然后把P00置为高电平,接着查询P02和P03的状态,如果P02为高则说明按下的是s5,若P03为高则说明按下的是s6,然后再让P00为低,P01为高,同样检测P02和P03的状态。接下来分别让P02和P03为高,其他为低,分别检测P00和P01的状态,然后再做判断。这种方案的程序其实也不难。 4)这是我在一本书上看到的,感觉设计的非常巧妙,同样它也用到了二极管,不过比我的上一种方案的I/O利用率更高,他用4个I/O口控制了12个按键。我相信你了解了之后也会惊奇的。 首先好好品味一下这个方案吧,想想怎么来识别按键呢!

单片机按键的解决方法

单片机按键的解决解决方案 1、单片机上的按键控制一般采用两种控制方法:中断和查询。中断必须借助中断引脚,而 查询按键可用任何IO端口。按键较少时,一个按键占用一个端口,而按键较多时,多采用矩阵形式(如:经常用4个端口作为输出,4个端口作为输入的4X4矩阵来获得16个按键);还可以用单片机的AD转换功能一个引脚接多个按键,根据电阻分压原理判断是哪个按键按下。 2、中断形式 STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但是STM32中只使用4位,高4位有效),每4个通道的8位中断优先级控制字构成一个32位的优先级寄存器。68个通道的优先级控制字至少构成17个32位的优先级寄存器. 4bit的中断优先级可以分成2组,从高位看,前面定义的是抢占式优先级,后面是响应优先级。按照这种分组,4bit一共可以分成5组 第0组:所有4bit用于指定响应优先级; 第1组:最高1位用于指定抢占式优先级,后面3位用于指定响应优先级; 第2组:最高2位用于指定抢占式优先级,后面2位用于指定响应优先级; 第3组:最高3位用于指定抢占式优先级,后面1位用于指定响应优先级; 第4组:所有4位用于指定抢占式优先级。 所谓抢占式优先级和响应优先级,他们之间的关系是:具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。每一个中断源都必须定义2个优先级。 有几点需要注意的是: 1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果; 2)抢占式优先级别相同的中断源之间没有嵌套关系; 3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。 GPIO外部中断: STM32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组为一个单位的,同组间的外部中断同一时间智能使用一个,如:PA0,PB0,PC0,PD0,PE0,PF0这些为1组,如果我们使用PA0作为外部中断源,那么别的就不能使用了,在此情况下我们使用类似于PB1,PC2这种末端序号不同的外部中断源,每一组使用一个中断标志EXTI x.EXTI0~EXTI4这5个外部中断有着自己单独的中断响应函数。EXTI5~EXTI9共用一个中断响应函数,EXTI10~EXTI15共使用一个中断响应函数。 对于中断的控制,STM32有一个专用的管理机构NVIC.中断的使能,挂起,优先级,活动等等都是由NVIC在管理的。 编写IO口外部中断步骤及其注意事项:

单片机一个按键的多次击键组合判别技巧

《一个按键的多次击键组合判别技巧》大话篇 小匠自从上次在旧社区发表了一篇《<程序编写规范倡议书>大话篇》后,好久没有发表"高"论了.急坏了一帮MM,以为小匠退隐江湖了。 (斑竹在旁问道:“MM”不是“Mie Mie”,而是“Ma Ma”吧?) 论坛内外谣言四起,有人说小匠改行了,不做程序匠,改做泥水匠了;还有人说小匠上阿富汗反恐怖去了;其实非也,只因新板论坛启用后,小匠一直用不惯...... (斑竹在旁笑道:是“用不来”吧?) 今天,小匠再次隆重登坛献演。贴一个小程序段..... (斑竹道:我看是“蹬痰现眼”吧?) (程序匠人贴完帖子,下到后台,一边洗着手上残余的浆糊,一边哼着小曲:“如果你的‘芯’是一座作坊,我愿作那不知疲倦的程序匠,……”) (一黑客悄悄贴近匠人,将一个废弃的浆糊桶扣到匠人头上......)

(匠人忙问:“斑竹,谁把灯给关了?”) (众人哈哈大笑!......) 一个按键的多次击键组合判别技巧 有时在设计中,往往要用一个按键来输入多种信息。如:单击/双击/三击、短击/长击、还有各种组合击键方式。可以用以下程序来做。如果按键闭合时间<500MS,判断为一次短击(0); 如果按键闭合时间>500MS,判断为一次长击(1); 两次击键时间间隔应<700MS,如果按键释放后700MS内无键按下,则结束读键。 读键完毕返回一个键号值KEY_NUM。其意义如下: KEY_NUM 意义 00000000 无键按下过 00000001 无意义 00000010 单次短击 00000011 单次长击 00000100 短击+ 短击 00000101 短击+ 长击 00000110 长击+ 短击 00000111 长击+ 长击

第13讲51单片机按键电路

标题:键盘接口电路 教学目标与要求: 1.键盘去抖动和连接、控制方式 2.独立式按键及其接口电路 3.矩阵式键盘及其接口电路 授课时数:2 教学重点:.矩阵式键盘及其接口电路 教学内容及过程: 一、键盘接口概述 1、按键开关去抖动问题 机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。其抖动过程如图9-11所示,抖动时间的长短与开关的机械特性有关,一般为5 10 ms 在触点抖动期间检测按键的通与断状态,可能导致判断出错,即按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的。为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施。这一点可从硬件、软件两方面予以考虑。在键数较少时,可采用硬件去抖,而当键数较多时,采用软件去抖。在硬件上可采用在键输出端加R-S触发器(双稳态触发器)或单稳态触发器构成去抖动电路。图9-12是一种由R-S触发器构成的去抖动电路,当触发器一旦翻转,触点抖动不会对其产生任何影响。 软件上采取的措施是:在检测到有按键按下时,执行一个10 ms左右(具体时间应视所使用的按键进行调整)的延时程序后,再确认该键电平是否仍保持闭合状态电平,若仍保持闭合状态电平,则确认该键处于闭合状态。同理,在检测到该键释放后,也应采用相同的步 骤进行确认,从而可消除抖动的影响。

2.编制键盘程序 一个完善的键盘控制程序应具备以下功能: (1) 检测有无按键按下,并采取硬件或软件措施,消除键盘按键机械触点抖动的影响。 (2) 有可靠的逻辑处理办法。每次只处理一个按键,其间对任何按键的操作对系统不产生影响,且无论一次按键时间有多长,系统仅执行一次按键功能程序。 (3) 准确输出按键值(或键号),以满足跳转指令要求。 二、独立式按键 单片机控制系统中,往往只需要几个功能键,此时,可采用独立式按键结构。 1. 独立式按键结构 独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其它I/O口线的状态。独立式按键的典型应用如图7.4所示。 独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。 2.矩阵式键盘 I/O端线分为行线和列线,按键跨接在行线和列线上,按键按下时,行线与列线发生短路。特点: ①占用I/O端线较少; ②软件结构教复杂。 适用于按键较多的场合。 3.键盘扫描控制方式 ⑴程序控制扫描方式 键处理程序固定在主程序的某个程序段。 特点:对CPU工作影响小,但应考虑键盘处理程序的运行间隔周期不能太长,否则会影响对键输入响应的及时性。 ⑵定时控制扫描方式 利用定时/计数器每隔一段时间产生定时中断,CPU响应中断后对键盘进行扫描。 特点:与程序控制扫描方式的区别是,在扫描间隔时间内,前者用CPU工作程序填充,后者用定时/计数器定时控制。定时控制扫描方式也应考虑定时时间不能太长,否则会影响对键输入响应的及时性。 ⑶中断控制方式 中断控制方式是利用外部中断源,响应键输入信号。 特点:克服了前两种控制方式可能产生的空扫描和不能及时响应键输入的缺点,既能及时处理键输入,又能提高CPU运行效率,但要占用一个宝贵的中断资源。 三、独立式按键及其接口电路 1、按键直接与I/O口连接

单片机按键识别方法之一

单片机按键识别方法之一 1.实验任务 每按下一次开关SP1,计数值加1,通过AT89S51单片机的P1端口的P1.0到P1.3显示出其的二进制计数值。 2.电路原理图 图4.8.1 3.系统板上硬件连线 (1.把“单片机系统”区域中的P3.7/RD端口连接到“独立式键盘”区域中的SP1端口上;

(2.把“单片机系统”区域中的P1.0-P1.4端口用8芯排线连接到“八路发光二极管指示模块”区域中的“L1-L8”端口上;要求,P1.0连接到L1,P1.1连接到L2,P1.2连接到L3,P1.3连接到L4上。 4.程序设计方法 (1.其实,作为一个按键从没有按下到按下以及释放是一个完整的过程,也就是说, 当我们按下一个按键 时,总希望某个命令只 执行一次,而在按键按 下的过程中,不要有干 扰进来,因为,在按下的过程中,一旦有干扰过来,可能造成误触发过程,这并不是我们所想要的。 因此在按键按下的时候,图4.8.2 要把我们手上的干扰信号以及按键的机械接触等干扰信号给滤除掉,一般情况 下,我们可以采用电容来滤除掉这些干扰信号,但实际上,会增加硬件成本及 硬件电路的体积,这是我们不希望,总得有个办法解决这个问题,因此我们可 以采用软件滤波的方法去除这些干扰信号,一般情况下,一个按键按下的时候, 总是在按下的时刻存在着一定的干扰信号,按下之后就基本上进入了稳定的状 态。具体的一个按键从按下到释放的全过程的信号图如上图所示: 从图中可以看出,我们在程序设计时,从按键被识别按下之后,延时5ms以上,从而避开了干扰信号区域,我们再来检测一次,看按键是否真得已经按下,若真得已经按下,这时肯定输出为低电平,若这时检测到的是高电平,证明刚才是由于干扰信号引起的误触发,CPU 就认为是误触发信号而舍弃这次的按键识别过程。从而提高了系统的可靠性。 由于要求每按下一次,命令被执行一次,直到下一次再按下的时候,再执行一次命令,因此从按键被识别出来之后,我们就可以执行这次的命令,所以要有一个等待按键释放的过程,显然释放的过程,就是使其恢复成高电平状态。

基于单片机的键盘和LED数码管工作原理

基于单片机的键盘和LED数码管工作原理 摘要:键盘和显示器是微机最常见的输入输出设备。本文介绍键盘和LED显示器的基本工作原理,并给出在8051基础上的电路结构及C语言代码。 关键字:键盘,LED,单片机 键盘是微型计算机系统中最基本、最常见的输入设备。在各种工业过程的计算机控制和监视系统中,广泛应用发光二极管向用户提供提示。由发光二极管可以构成7段/8段LED显示器,用于显示工作状态、参数数值和故障位置。一.键盘的工作原理 键盘实际上是一组按键开关的集合,平时按键开关总是处于断开状态,当按下键时它才闭合。 (一)键盘的基本介绍 1.键盘的功能 键盘接口必须具有4个基本功能: 1.去抖动 2.防串键 3.识别被按键并产生与之对应的键码 4.释放键 而键码产生后如何去实现按键的特定功能,是操作系统和应用程序的任务2.键盘的分类 根据按键开关的排列方式,键盘可分为线性键盘和矩阵键盘。 线性键盘:硬件连接和接口程序都很简单,只适用于按键少的场合,因为线性键盘有多少按键,就需要有多少根连线与微机输入端口相连。 矩阵键盘:将按键排成n行m列,每个按键占据行列的一个交点,需要的外连接线数目是m+n,而容许的最大按键数是m*n,显然可以减少微机接口的连线,是一般微机常采用的键盘结构。 3.键盘与单片机的连接方式 矩阵键盘的连接方法有多种。可直接连接于单片机的I/O口线;可利用扩展的并行I/O口连接;也可利用可编程的键盘、显示接口芯片(如8297)进行连接等等。其中,利用扩展的并行I/O口连接方便灵活,在单片机应用系统中比较常用。下图就是通过8255A芯片扩展的并行I/O口连接的矩阵键盘。

基于单片机的光电计数器课程设计

计控学院 College of computer and control engineering Qiqihar university 电气工程课程设计报告题目:基于单片机的光电计数器 系别电气工程系 专业班级电气123班 学生姓名宋恺 学号2012024073 指导教师李艳东 提交日期 2015年6月 24日 成绩

电气工程课程设计报告 摘要 光电计数器是利用光电元件制成的自动计数装置。其工作原理是从光源发出的一束平行光照射在光电元件(如光电管、光敏电阻等)上,每当这束光被遮挡一次时,光电元件的工作状态就改变一次,通过放大器可使计数器记下被遮挡的次数。光电计数器的应用范围非常广泛,常用于记录成品数量,例如绕线机线圈匝数的检测、点钞机纸币张数的检测、复印机纸张数量的检测,或展览会参观者人数。 光电计数器与机械计数器相比,具有可靠性高、体积小、技术频率高、能和计算机链接实现自动控制等优点。本文即介绍基于MCS-51单片机的光电技术器。 关键词:单片机;光电计数器;数码显示;自动报警

齐齐哈尔大学计控学院电气工程系课程设计报告 目录 1 设计目的及意义 (1) 2 设计内容 (1) 2.1 系统整体设计 (1) 2.1.1 实验方案 (1) 2.1.2 光电计数器结构框图 (2) 图1 光电计数器结构框图 (2) 2.2系统硬件设计 (2) 2.2.1稳压直流电源电路 (2) 2.2.2发射接收电路 (3) 2.2.3显示电路 (3) 2.2.4报警电路 (4) 2.2.5硬件系统 (4) 2.3系统软件设计 (6) 3 结论7 4 参考文献 (8)

51单片机C语言实验及实践教程_8.按键识别方法之一

51单片机C语言实验及实践教程_8.按键识别方法之一 发布: 2009-4-04 12:57 | 作者: 孙青安 | 查看: 88次 1.实验任务 I/O并行口直接驱动LED显示 每按下一次开关SP1,计数值加1,通过AT89S51单片机的P1端口的P1.0到P1.3显示出其的二进制计数值。 2.电路原理图 图4.8.1 3.系统板上硬件连线

(1.把“单片机系统”区域中的P3.7/RD端 口连接到“独立式键盘”区域中的SP1端口上; (2.把“单片机系统”区域中的P1.0-P1.4端口用8芯排线连接到“八路发光二极管指示模块”区域中的“L1-L8”端口上;要求,P1.0连接到 L1,P1.1连接到L2,P1.2连接到L3,P1.3连接到L4上。 4.程序设计方法 (1.其实,作为一个按键从没有按下到按下以及释放是一个完整的过程,也就是说,当我们按下一个按键时,总希望某个命令只执行一次,而 在按键按下的过程中,不要有干扰进来,因为,在按下的过程中, 一旦有干扰过来,可能造成误触发过程,这并不是我们所想要的。因 此在按键按下的时候,图4.8.2 要把我们手上的干扰信号以及按键的机械接触等干扰信号给滤除 掉,一般情况下,我们可以采用电容来滤除掉这些干扰信号,但实际 上,会增加硬件成本及硬件电路的体积,这是我们不希望,总得有个 办法解决这个问题,因此我们可以采用软件滤波的方法去除这些干扰 信号,一般情况下,一个按键按下的时候,总是在按下的时刻存在着 一定的干扰信号,按下之后就基本上进入了稳定的状态。具体的一个 按键从按下到释放的全过程的信号图如上图所示: 从图中可以看出,我们在程序设计时,从按键被识别按下之后,延时5ms 以上,从而避开了干扰信号区域,我们再来检测一次,看按键是否真得已经按下,若真得已经按下,这时肯定输出为低电平,若这时检测到的是高电平,证明刚才是由于干扰信号引起的误触发,CPU就认为是误触发信号而舍弃这次的按键识别过程。从而提高了系统的可靠性。 由于要求每按下一次,命令被执行一次,直到下一次再按下的时候,再执行一次命令,因此从按键被识别出来之后,我们就可以执行这次的命令,所以要有一个等待按键释放的过程,显然释放的过程,就是使其恢复成高电平状态。

4×4矩阵键盘原理及其在单片机中的简单应用(基Proteus仿真)

4×4矩阵键盘原理及其在单片机中的简单应用 基于Proteus仿真 1、4×4矩阵键盘的工作原理 如下图所示,4×4矩阵键盘由4条行线和4条列线组成,行线接P3.0-P3.3,列线接P3.4-P3.7,按键位于每条行线和列线的交叉点上。

按键的识别可采用行扫描法和线反转法,这里采用简单的线反转法,只需三步。 第一步,执行程序使X0~X3均为低电平,此时读取各列线Y0~Y3的状态即可知道是否有键按下。当无键按下时,各行线与各列线相互断开,各列线仍保持为高电平;当有键按下时,则相应的行线与列线通过该按键相连,该列线就变为低电平,此时读取Y0Y1Y2Y3的状态,得到列码。 第二步,执行程序使Y0~Y3均为低电平,当有键按下时,X0~X3中有一条行线为低电平,其余行线为高电平,读取X0X1X2X3的状态,得到行码。 第三步,将第一步得到的列码和第二步得到的行码拼合成被按键的位置码,即Y0Y1Y2Y3X0X1X2X3(因为行线和列线各有一条为低电平,其余为高电平,所以位置码低四位和高四位分别只有一位低电平,其余为高电平)。 也就是说,当某个键按下时,该键两端所对应的行线和列线为低电平,其余行线和列线为高电平。比如,当0键按下时,行线X0和列线Y0为低电平,其余行列线为高电平,于是可以得到0键的位置码Y0Y1Y2Y3X0X1X2X3为01110111,即0X77。当5键按下时,行线X1和列线Y1为低电平,其余行列线为高电平,于是可得到5键的位置码Y0Y1Y2Y3X0X1X2X3为10111011,即0XBB。全部矩阵键盘的位置码如下: 2、4×4矩阵键盘在单片机的简单应用举例(一) 如下图所示,运行程序时,按下任一按键,数码管会显示它在矩阵键盘上的序号0~F,并且蜂鸣器发出声音,模拟按键的声音。此处采用线反转法识别按键。 C程序如下:

单片机4×4矩阵键盘设计方案教学文案

1、设计原理 (1)如图14.2所示,用单片机的并行口P3连接4×4矩阵键盘,并以单片机的P3.0-P3.3各管脚作输入线,以单片机的P3.4-P3.7各管脚作输出线,在数码管上显示每个按键“0-F”的序号。 (2)键盘中对应按键的序号排列如图14.1所示。 2、参考电路 图14.2 4×4矩阵式键盘识别电路原理图

3、电路硬件说明 (1)在“单片机系统”区域中,把单片机的P3.0-P3.7端口通过8联拨动拨码开关JP3连接到“4×4行列式键盘”区域中的M1-M4,N1-N4端口上。 (2)在“单片机系统”区域中,把单片机的P0.0-P0.7端口连接到“静态数码显示模块”区域中的任何一个a-h端口上;要求:P0.0对应着a,P0.1对应着b,……,P0.7对应着h。 4、程序设计内容 (1)4×4矩阵键盘识别处理。 (2)每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。 5、程序流程图(如图14.3所示)

6、汇编源程序 ;;;;;;;;;;定义单元;;;;;;;;;; COUNT EQU 30H ;;;;;;;;;;入口地址;;;;;;;;;; ORG 0000H LJMP START ORG 0003H RETI ORG 000BH

按键处理程序 C语言 单片机

分享一种按键处理程序(用C) //头文件定义: Ustruct KEY { Uchar Val; #define Key_Model_C 0 //按键1值 #define Key_AddVal_C 1 //按键2值 Uint ScanOnTime; Uchar LongKeyState; Uchar LongKeyRestState; Uchar SetInRn; Uchar Model; //按键状态(模式) #define Off_C 0 //之前未按下 #define On_C 1 //现按下 #define Delay_C 2 //按键处理后标志 }Key; //----------------定义两个IO输入口为按键入口--------------------// #define KeyMo_Bin (GPIOB->IDR.Bit.B5) #define KeyAdd_Bin (GPIOB->IDR.Bit.B6) /*===============================================================*/ GPIO_Init(GPIO_Pin_5|GPIO_Pin_6,GPIO_Mode_In_PU_No_IT); //初始化为上拉输入无中断 /*===============================================================*/ //主程序大循环中每1毫秒扫描1次 void KeyScan(void) { if(Key.LongKeyRestState == 1) //长按键标志(复位处理长按键) { if((KeyMo_Bin == 1) && (KeyAdd_Bin == 1)) //当两按键均抬起 { if(++Key.ScanOnTime >= 130) //延时后复位 { Key.LongKeyRestState=0; Key.Model=Delay_C; } } else Key.ScanOnTime=0; return; } if(Key.Model == Off_C) //如果当前按键状态为未按下“Off_C” { if((KeyMo_Bin == 0) || (KeyAdd_Bin == 0))//按键1或按键2已按下(低有效) { if(++Key.ScanOnTime >= 10) //当按下后自加1,加够10次即1ms*10=10ms去抖动

相关文档
最新文档