单片机实验五报告-单片机键盘实验

单片机实验五报告-单片机键盘实验
单片机实验五报告-单片机键盘实验

南昌大学实验报告

学生姓名:学号:专业班级:

实验类型:?验证 ?综合■设计 ?创新实验日期:2018.05.18 实验成绩:

实验五单片机键盘实验

(一)实验目的

1.掌握单片机键盘控制;

2.掌握数码管显示控制。

(二)设计要求

1.行列扫描按键键值为0~F;

2.按键只支持单键按下,不支持多键同时按下;

3.要求用数码管显示按键值。

(三)实验原理

1.矩阵式键盘的设计

按键数目较多的杨合常采用矩阵式(也称行列式)键盘。键盘由行线和列线组成,按键位于行、列的交叉点上,如下图所示,一个4×4的行列结构可构成一个16个按键的键盘,需要一个8位的并行I/O口。很明显,在按键数目较多的场合,矩阵式键盘要比独立式键盘节省较多的I/O口线。对下图所示的矩阵式键盘的查询扫描,一般包括以下4个步骤。

(1)首先判别整个键盘有无按键按下方法为单片机驱动列线P0.0-P0.3输出全0,然后读行线

P0.4-P0.7的状态,若全为1,则键盘上没有闭合键;若P0.4-P0.7,则有键按下。

(2)去除键的抖动当判别出可能有键按下时,软件延时一段时间(10ms左右)再判别键盘的状态,若仍有键闭合,则认为键盘上有确定的键按下,否则是键抖动。

(3)求出按下键的键号上图中的16个按键,键号依次为0,1,...15。各行的首键号分别为0,4,8,12,列号依次为0,1,2,3。行线通过上拉电阻接+5V,当无键按下时,行线为高电平,当有按键按下时,对应的行线与列线短接,行线的电平将由此行线相连的列线电平决定。

如果把行线设置为单片机的输入口线,列线设置为单片机的输出口线,则按键号的识别过程是:先令0列线P0.0为低电平0,其余3根列线都为高电平,遂行检查行线状态。如果行线P0.4-P0.7都为高电平1,则P0.0这列上没有按键闭合,若P0.4-P0.7中有一行为低电平,则该行线与列线交叉的按键按下。如果P0.0这一列上没有按键闭合,接着再使P0.1为低电平,其余列线为高电平。用同样的方法检查P0.1这列上有无按键闭合,以此类推。这样采用逐列扫描(只有列为低),然后读入各行线的电平,即可求出设下键的键号N=行的首键号+列号。各行的首键号分别为0,4,8,12,列号依次为0,1,2,3。编程时设置1个列号计数器,初值为0,每扫描1列,列号计数器加1。

(4)判闭合键是否松开如果松开则将键号送入相应的寄存器中保存,单片机根据按下键的键号,对该键的一次闭合仅作一次键功能处理。

2.数码管显示键值

上述的键盘扫面步骤结束后,键号存储在相应的寄存器中,要把键号显示出来,只须向P4.0口输出对应的段码、位码以及向P4.3和P5.4口输出相应信号,利用74HC595芯片控制八段数码管从而达到显示相应键号的效果。电路图如下所示:

(四)实验设备

硬件:PC机、USB数据传输线、STC单片机综合实验箱

软件:兼容51单片机的Keil uvision5集成开发环境、STC-ISP单片机烧录软件

(五)实验结果

实验源代码如(七)所示,对代码进行编译,提示0错误0警告,生成hex文件

将单片机试验箱和电脑通过USB数据线连接,打开STC-ISP检测串口

点击点开程序文件,选择刚才生成的hex文件,点击下载程序

(六)结果讨论与心得体会

结果分析讨论:将程序烧录至单片机后,可观察数码管最高位显示0(初始值),其他位消隐。按下矩阵键盘的键,数码管显示相应的键号,从0-F都能完整显示,完成实验。

心得体会:通过本次实验,我学会了如何使用矩阵键盘,掌握了矩阵键盘的扫描原理,理解了矩阵键盘的电路结构以及数码管的显示方式。希望通过自己多次尝试能在今后实验中熟练使用矩阵键盘并将其运用到其他方面。

(七)附录:实验源代码

P4 DATA 0C0H

P5 DATA 0C8H

P0M1 DATA 0x93 ;

P0M0 DATA 0x94 ;

P4M1 DATA 0xB3 ;

P4M0 DATA 0xB4 ;

P5M1 DATA 0xC9 ;

P5M0 DATA 0xCA ;

P_HC595_SER BIT P4.0 ;

P_HC595_RCLK BIT P5.4 ;

P_HC595_SRCLK BIT P4.3 ;

KeyState DATA 70H ;

ORG 0000H

LJMP F_Main

ORG 0100H

F_Main:

CLR A

MOV P0M1, A ;

MOV P0M0, A ;

MOV P4M1, A ;

MOV P4M0, A ;

MOV P5M1, A ;

MOV P5M0, A ;

MOV psw, #00H ;

MOV 27H , #40H ;

MOV KeyState, #00H ;

F_Main_Loop:

LCALL KEY2 ;

LCALL F_delay_ms ;

LCALL F_DisplayScan ;

AJMP F_Main_Loop ;

KEY2:

LCALL KS ;

JNZ S1 ;

LCALL F_delay_ms ;

AJMP QUIT ; S1:

LCALL F_delay_ms ;

LCALL KS ;

JNZ S2 ;

AJMP QUIT ; S2:

MOV R4, #0FEH ;

MOV R5, #00H ; S3:

MOV P0, R4 ; L0:

JB P0.4, L1 ;

MOV A, #00H ;

AJMP LK ;

L1:

JB P0.5, L2 ;

MOV A, #04H ;

AJMP LK ;

L2:

JB P0.6, L3 ;

MOV A, #08H ;

AJMP LK ;

L3:

JB P0.7, NEXT ;

MOV A, #0CH ; LK:

ADD A, R5 ;

PUSH ACC ;

LJMP S4 ; NEXT:

INC R5 ;

MOV A, R4 ;

JNB ACC.3, S4 ;

RL A ;

MOV R4, A ;

AJMP S3 ;

S4:

LCALL KS ;

JNZ S4 ;

POP ACC ;

MOV KeyState, A ;

LJMP QUIT ; KS:

MOV P0, #0FH ;

MOV A, P0 ;

XRL A, #0FH ;

RET

QUIT:

RET

F_delay_ms:

MOV R2, #25 ;

D1:

MOV R3, #200

DJNZ R3, $

DJNZ R2, D1

RET

F_Send_595:

PUSH 01H ;

MOV R1, #8 ;

L_Send_595_Loop:

RLC A ;

MOV P_HC595_SER,C ;

SETB P_HC595_SRCLK ;

CLR P_HC595_SRCLK ;

DJNZ R1,L_Send_595_Loop ;

POP 01H ;

RET

F_DisplayScan:

PUSH ACC ;

MOV A, #080H ;

CPL A ;

LCALL F_Send_595 ;

POP ACC ;

MOV A, KeyState ;

MOV DPTR, #T_Display ;

MOVC A, @A+DPTR ;

LCALL F_Send_595 ;

SETB P_HC595_RCLK ;

CLR P_HC595_RCLK

LCALL F_delay_ms ;

RET

T_Display: ;

DB ;

03FH,006H,05BH,04FH,066H,06DH,07DH,007H,07FH,06FH,077H,07CH,039H,05EH,079H,071H DB

000H

T_COM:

DB

001H,002H,004H,008H,010H,020H,040H,080H

END

相关主题
相关文档
最新文档