谭久刚 《单片机应用技术》1-4_第1页
谭久刚 《单片机应用技术》1-4_第2页
谭久刚 《单片机应用技术》1-4_第3页
谭久刚 《单片机应用技术》1-4_第4页
谭久刚 《单片机应用技术》1-4_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

子情境1-4:键盘控制灯的显示任务1-4-2任务1-4-1键盘扫描及控制程序设计键盘电路设计任务1-4-1:键盘电路设计任务要求:设计4个独立式键盘用于控制灯的显示独立式键盘电路设计认识键盘

Step1Step2任务实施步骤知识点小结Step1.认识键盘键盘是最为常用输入设备之一,操作人员可以向单片机系统输入数据、指令、地址等信息,从而实现对系统的灵活控制。

1.键盘的分类

键盘分编码键盘和非编码键盘。键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如BCD码键盘、ASCLL码键盘等;而靠软件来识别的称为非编码键盘。 在单片机组成的测控系统及智能化仪器中,用的最多的是非编码键盘。

非编码键盘有分为:独立式非编码键盘和行列式非编码键盘。Step1.认识键盘2.独立式键盘按键的识别1)按键输入原理

如图,键盘一端经上拉电阻接5V电源,再接到单片机的I/O口(P2),另一端接地,无键按下时,P2口8各引脚全部为高电平“1”,当某个键按下时,便会将相应引脚置为低电平“0”。因而,CPU通过指令不断读取P2口状态,当查询到某个引脚为低电平时,表示该引脚所接键盘被按下。2)按键消抖

在按下或释放按键时,通常伴随机械抖动,然后才会稳定下来,在键盘抖动期间读取P2状态便会出现误操作,即一次按键会被CPU错误的认为是多次操作。为了克服键盘抖动带来的误操作,必须采取去抖动措施,主要有硬件去抖和软件去抖两种方法。

硬件消抖采用双稳态R-S触发器对按键波形进行整形后再送到单片机引脚,会增加设计成本。我们经会采用的是软件去抖:在检查到有键按下时,延时10ms左右再次检测确认该键按下,若仍为闭合状态,则认为是一次按键操作。按键机械抖动硬件去抖电路Step1.认识键盘2.独立式键盘按键的识别

3)按键释放判断

由于单片机运行指令的速度特别快,1ms内可以运行单周期指令1000条,因此,一次按键期间,单片机可能会执行多次按键操作,通常检测到有键按下时,继续检测引脚电平,直到检测到键盘已松开才执行相应的按键功能程序。而且,还可以通过这种方法对同一按键进行长按键、短按键及复合键等功能的设计。4)键盘程序设计一个完整的键盘程序应具备以下功能:检测有无按键按下,并进行按键消抖;有可靠的逻辑处理办法,每次只处理一个按键,处理按键功能期间,对任何按键的操作都不会对系统产生影响;无论一次按键时间有多长,系统仅执行一次按键功能程序;准确输出按键值,以满足跳转指令的需要。Step2.系统键盘电路设计

任务要求设置4个按键,分别用于控制小灯小灯的闪烁、左右流动显示及速度控制。为便于理解,我们采用P2.0~P2.3作为键盘输入口。Step3.按键扫描及控制程序设计

1.独立式键盘的软件结构1).P2口内部结构

P2口内部结构如图所示,有两种用途:作为普通I/O口和地址总线使用。

P2口作为普通I/O口其功能与P1相同。具有输入、输出、端口操作三种工作方式,负载能力也与P1相同。再次强调,作为准双向口,在对P2引脚进行读操作时,应首先对P2口写“1”后再读,以保证读回数据的正确性。

P2口作为地址总线当访问片外存储器或I/O设备时,作为地址总线高8位使用。

P2口内部结构Step3.按键扫描及控制程序设计

1.独立式键盘的软件结构2).独立式键盘查询方式编程的软件结构

K0~K7为功能程序入口地址标号,PROM0~PROM7分别为每个按键的功能程序。设P2口接键盘,软件结构如下,包括键盘扫描、延时去抖、等待按键释放及按键功能处理几部分。KEY_SCAN: LCALL READ_P2 ;键状态输入

JNB ACC.0,K0 ;检测0号键是否按下,按下转(P1.0=0 JNB ACC.1,K1 ;检测1号键是否按下,按下转

…… JNB ACC.7,K7

;检测7号键是否按下,按下转

LJMP KEY_SCAN ;无键按下返回,再顺次检测K0: LCALL DELAY10ms ;延时去抖

LCALL READ_P2 JNB ACC.0,PROM0 ;键盘仍按下,转入执行相应功能程序

LJMP KEY_SCAN ;键盘抖动,则返回继续扫描

…… ……K7: LCALL DELAY10ms LCALL READ_P2 JNB ACC.7,PROM7

LJMP KEY_SCAN PROM0: LCALL READ_P2 ;等待按键释放

JNB ACC.0,PROM0

…… ;0号键功能程序

LJMPKEY_SCAN ;0号键功能程序执行完返回

……

……

PROM7:

LCALL READ_P2 JNB ACC.0,PROM0

…… ;7号键功能程序

LJMP START ;7号键功能程序执行完返回READ_P2: MOV A,#0FFH

MOV P2,A ;置P2口为输入状态

MOV A,P2 RET键盘扫描延时去抖等待按键释放按键功能程序读P2口状态无键按下K0键按下无键按下K0键仍然按下K0键功能程序执行完成Step3.按键扫描及控制程序设计

2.系统程序设计1).程序功能分系及流程图

4个按键对应4种控制功能,分别用于控制小灯的闪烁、右移显示、左移显示和显示速度:单片机系统上电启动,未按键时不显示;分别按闪烁、左移、右移一次,按要求显示,再按熄灭,同一时刻只有一种显示;显示时,按速度键控制显示速度,速度分4档,显示间隔分别是:1s、0.5s、0.2s和50ms,不按速度键,1s间隔显示,再按依次递减,50ms间隔显示后,再按,循环回到1s间隔显示。根据功能要求,结合前面的中断定时程序,程序基本思路是:主程序初始化任务完成后,进入循环查询P2口状态,结合查询结果,利用定时中断延时并选择性控制灯的显示状态。Step3.按键扫描及控制程序设计

2.系统程序设计1).程序功能分系及流程图主程序流程图Step3.按键扫描及控制程序设计

2.系统程序设计1).程序功能分系及流程图定时中断服务程序流程图Step3.按键扫描及控制程序设计

2.系统程序设计2).变量定义变量名单元地址含义FLASH_LED00H(20H.0),bit为1,闪烁显示MOVE_LEFT01H(20H.1),bit为1,左移显示MOVE_RIGHT02H(20H.2),bit为1,右移显示DISPLAY03H(20H.3),bit为1,正在显示NUM_50ms30H,BYTE50ms循环次数Step3.按键扫描及控制程序设计

2.系统程序设计3).汇编语言源程序(变量定义,主程序—初始化);**************************************;键盘控制小灯显示,变量定义;********************************************************************** FLASH_LED BIT 00H ;为1,闪烁显示

MOVE_LEFT BIT 01H ;为1,左移显示

MOVE_RIGHT BIT 02H ;为1,右移显示

DISPLAY BIT 03H ;为1,正在显示

NUM_50ms EQU 30H ;循环次数;**********************************************;主程序(初始化、循环扫描键值、按键功能处理);************************************************************************* ORG 0000H LJMP START ORG 000BH LJMP INT_T0 ORG 0030HSTART: MOV 20H,#00H ;各显示状态清零

MOV P1,#0FFH ;P1口初始化,灯全灭

MOV NUM_50ms,#20 ;延时1s,50ms计时循环次数设为20 MOV R7,NUM_50ms …… ……EQU(表达式或寄存器赋名伪指令)指令格式:符号名EQU

寄存器名或表达式指令功能:给一个寄存器或数值赋一个指定的符号名。例如程序中的“NUM_50msEQU30H”,执行该指令后,NUM_50ms在后续指令中使用时就代表30H这个数。例如,后续指令:“MOVNUM_50ms,#10”的含义是将立即数10送入RAM的30H单元,此处的NUM_50ms为直接寻址方式。 BIT(位定义伪指令)指令格式:符号名

BIT

位地址

指令功能:将一个位地址赋指定的符号名,注意经BIT定义过的符号名不能被改变。

例如程序中的伪指令“FLASH_LEDBIT 00H”相当于给00H这个位地址单元起了一个名字FLASH_LED,在后续程序中遇到FLASH_LED这个符号时,都代表00H位地址单元。Step3.按键扫描及控制程序设计

2.系统程序设计3).汇编语言源程序(主程序—按键扫描及闪烁键功能处理);*****************************循环扫描键盘**********************************KEY_SCAN: LCALL READ_P2 ;键状态输入

JNB ACC.0,FLASH_KEY

;检测闪烁键是否按下(P2.0=0)?

JNB ACC.1,ML_KEY

;检测左移键是否按下(P2.1=0)?

JNB ACC.2,MR_KEY

;检测右移键是否按下(P2.2=0)?

JNB ACC.3,SPEED_KEY

;检测速度键是否按下(P2.3=0)?

LJMP KEY_SCAN ;无键按下返回,再顺次检测;************************按键功能处理,闪烁键功能处理************************FLASH_KEY: LCALL DELAY10ms ;延时去抖

LCALL READ_P2

JNB ACC.0,WAIT

LJMP KEY_SCANWAIT: LCALL READ_P2

;等待按键释放

JNB ACC.0,WAIT

CPL FLASH_LED

;闪烁标志取反,原来不显,按下显。

CLR MOVE_LEFT

;禁止左移显示

CLR MOVE_RIGHT

;禁止右移显示

JNB FLASH_LED,NO_DIS

;是否显示?

SETB DISPLAY

;显示标志有效

MOV P1,#00H

;闪烁初始化

LCALL INIT_TIMER0

;初始化定时器,开始显示

LJMP KEY_SCAN ……键盘扫描延时去抖等待按键释放按键功能程序按闪烁,开或关闪烁显示,同一时刻只有一种显示Step3.按键扫描及控制程序设计

2.系统程序设计3).汇编语言源程序(主程序——左移、右移按键程序);##################################左移键功能处理##########################ML_KEY:

LCALL DELAY10ms LCALL READ_P2 JNB ACC.1,WAIT1

LJMP KEY_SCAN WAIT1:

LCALL READ_P2 JNB ACC.1,WAIT1

CLR FLASH_LED ;禁止闪烁

CPL MOVE_LEFT ;左移显示标志取反

CLR MOVE_RIGHT ;禁止右移显示

JNB MOVE_LEFT,NO_DIS SETB DISPLAY MOV P1,#0FEH ;左移显示初始化

LCALL INIT_TIMER0

LJMP KEY_SCAN;##################################右移键功能处理##########################MR_KEY:

LCALL DELAY10ms LCALL READ_P2 JNB ACC.2,WAIT2

LJMP KEY_SCAN WAIT2:

LCALL READ_P2 JNB ACC.2,WAIT2

CLR FLASH_LED ;禁止闪烁

CLR MOVE_LEFT ;禁止左移显示

CPL MOVE_RIGHT ;右移显示标志取反

JNB MOVE_RIGHT,NO_DIS SETB DISPLAY MOV P1,#7FH

;右移显示初始化

LCALL INIT_TIMER0 LJMP KEY_SCANNO_DIS:

MOV P1,#0FFH ;关显示

CLR TR0 CLR DISPLAY ;显示标志无效

MOV NUM_50ms,#20 LJMP KEY_SCANStep3.按键扫描及控制程序设计

2.系统程序设计3).汇编语言源程序(主程序——速度键、读P2口及定时器初始化程序);##################################速度键功能处理############################SPEED_KEY:

LCALL DELAY10ms LCALL READ_P2 JNB ACC.3,WAIT3

LJMP KEY_SCAN WAIT3:

LCALL READ_P2 JNB ACC.3,WAIT3 JNB DISPLAY,SCAN_KEY ;灯未显示,则返回扫描

MOV A,NUM_50ms ;修改显示速度

CJNE A,#20,SPEED1

MOV NUM_50ms,#10SCAN_KEY: LJMP KEY_SCANSPEED1:

CJNE A,#10,SPEED2 MOV NUM_50ms,#4

LJMP KEY_SCANSPEED2: CJNE A,#4,SPEED3 MOV NUM_50ms,#1

LJMP KEY_SCANSPEED3: MOV NUM_50ms,#20 LJMP KEY_SCAN;*****************************************;读P2口子程序;************************************************************************READ_P2: MOV A,#0FFH MOV P2,A ;置P2口为输入状态

MOV A,P2 RET;******************************************;定时器初始化子程序;*************************************************************************INIT_TIMER0: MOV TMOD,#01H MOV TH0,#3CH MOV TL0,#0B0H SETB EA SETB ET0 SETB TR0 RET CJNE(比较不等则转移)指令格式:CJNZ

A,

#data,rel

指令功能:如果(A)≠#data,则跳转到目标语句,否则程序顺序执行。分支程序中,用作条件转移。程序中“CJNEA,#20,SPEED1”指令功能就是查看之前的显示间隔是否为1s,是则执行下一句:修改间隔时间为0.5s;否则再查看是否为0.5s……。Step3.按键扫描及控制程序设计

2.系统程序设计3).汇编语言源程序(定时中断服务子程序);10ms延时子程序,用于延时去抖;**************************************************************************DELAY10ms: MOV

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论