当前位置:文档之家› 单片机4X4键盘扫描和显示课程设计

单片机4X4键盘扫描和显示课程设计

二、设计内容1、本设计利用各种器件设计,并利用原理图将8255单元与键盘及数码管显示单元连接,扫描键盘输入,最后将扫描结果送入数码管显示。

键盘采用4*4键盘,每个数码管可以显示0-F共16个数。

将键盘编号,记作0-F,当没按下其中一个键时,将该按键对应的编号在一个数码管上显示出来,当在按下一个键时,便将这个按键的编号在下一个数码管上显示,数码管上可以显示最近6次按下的按键编号。

设计并实现一4×4键盘的接口,并在两个数码管上显示键盘所在的行与列。

三、问题分析及方案的提出4×4键盘的每个按键均和单片机的P1口的两条相连。

若没有按键按下时,单片机P1口读得的引脚电平为“1”;若某一按键被按下,则该键所对应的端口线变为地电平。

单片机定时对P1口进行程序查询,即可发现键盘上是否有按键按下以及哪个按键被按下。

实现4×4键盘的接口需要用到单片机并编写相应的程序来识别键盘的十六个按键中哪个按键被按下。

因为此题目还要求将被按下的按键显示出来,因此可以用两个数码管来分别显示被按下的按键的行与列表示任意一个十六进制数)分别表示键盘的第二行、第三行、第四行;0xXE、0xXD、0xXB、0xX7(X表示任意一个十六进制数)则分别表示键盘的第一列、第二列、第三列和第四列。

例如0xD7是键盘的第二行第四列的按键对于数码管的连接,采用了共阳极的接法,其下拉电阻应保证芯片不会因为电流过大而烧坏。

五、电路设计及功能说明4×4键盘的十六个按键分成四行四列分别于P1端口的八条I/O数据线相连;两个七段数码管分别与单片机的P0口和P2口的低七位I/O数据线相连。

数码管采用共阳极的接法,所以需要下拉电阻来分流。

结合软件程序,即可实现4×4键盘的接口及显示的设计。

当按下键盘其中的一个按键时,数码管上会显示出该按键在4×4键盘上的行值和列值。

所以实现了数码管显示按键位置的功能四、设计思路及原因对于4×4键盘,共有十六个按键。

如果每个按键与单片机的一个引脚相连,就会占用16个引脚,这样会使的单片机的接口不够用(即使够用,也是对单片机端口的极大浪费)。

因此我们应该行列式的接法。

行列式非编码键盘是一种把所有按键排列成行列矩阵的键盘。

在这种键若没有按键按下时,单片机从P1口读得的引脚电平为“1”;若某一按键被按下,则该键所对应的端口线变为地电平。

因此0xEX(X表示任意4×4键盘的第一行中的某个按键被按下,相应的0xDX、0xBX、0x7X(X二、实验内容设计并实现一4×4键盘的接口,并在两个数码管上显示键盘所在的行与列。

即将8255单元与键盘及数码管显示单元连接,编写实验程序扫描键盘输入,并将扫描结果送数码显示,键盘采用4×4键盘,每个数码管值可以为0到F,16个数。

将键盘进行编号记作0—F当按下其中一个按键时将该按键对应的编号在一个数码管上显示出来,当按下下一个按键时便将这个按键的编号在下一个数码管上显示出来,且数码管上可以显示最近6次按下按键的编号。

基本原理1.电路设计及功能说明2.硬件原理框图及电路图(包括接口芯片简介)电路图:六、实验步骤(1).把实验平台与PC机串行口连起来,根据实验连线提示在实验台上连线,之后打开电源。

(2).在PC机上用鼠标点击“Wave”图标,进入WINDOWS调试环境,而后进行初始化设置。

点击[仿真器\仿真器设置]出现“仿真器设置”窗,进行仿真器的设置。

(3).用鼠标点一下[文件\打开文件],输入文件名*.asm,创建新文件,在该窗口中输入事先编好的程序。

(4).用鼠标点[项目\全部编译]窗,对当前源文件进行编译,反复修改好程序,直到编译通过为止。

(5).全速运行程序,通过在键盘按键,观察八段管的显示结果,理解键盘扫描原理及程序编写方法。

接口芯片简介AT89C51简介AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS 8位微处理器,俗称单片机。

单片机的可擦除只读存储器可以反复擦除100次。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器。

主要管脚说明:VCC:供电电压。

GND:接地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

当P1口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。

在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。

P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。

在FLASH 编程和校验时,P1口作为第八位地址接收。

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。

并因此作为输入时,P2口的管脚被外部拉低,将输出电流。

这是由于内部上拉的缘故。

P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。

在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。

P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。

当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。

作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

P3口同时为闪烁编程和编程校验接收一些控制信号。

ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。

在FLASH编程期间,此引脚用于输入编程脉冲。

在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。

因此它可用作对外部输出的脉冲或用于定时目的。

然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。

如想禁止ALE的输出可在SFR8EH地址上置0。

此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。

另外,该引脚被略微拉高。

如果微处理器在外部执行状态ALE禁止,置位无效。

/PSEN:外部程序存储器的选通信号。

在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。

但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

数码管简介数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。

共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。

共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。

当某一字段的阴极为高电平时,相应字段就不亮。

共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。

共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。

当某一字段的阳极为低电平时,相应字段就不亮。

七、软件部分的程序流程图,算法和使用的编程技巧 1.编程技巧1.在按键扫描程序中,通过for 循环语句实现被按下的按键的行值的确定,用switch 语句实现列值的确定。

0xEX(X 表示任意一个十六进制数)表示4×4键盘的第一行中的某个按键被按下,相应的0xDX、0xBX、0x7X(X表示任意一个十六进制数)分别表示键盘的第二行、第三行、第四行;0xXE、0xXD、0xXB、0xX7(X 表示任意一个十六进制数)则分别表示键盘的第一列、第二列、第三列和第四列;2. ucRow+ucLine+1即为被按下的按键的行列值;3.用十六个switch语句实现对单片机P0端口和P2口的I/O数据线的控制,来控制数码管显示被按下按键的行值和列值;2.程序流程图主流程图子流程图否是是否开始显示缓冲区初始化LED显示读取键值键值转换为显示数据开始输出列扫描信号列扫描信号移位该列有键输入?读入行信号返回6列扫描完?有键输入?初始化地址参数按照行列计算键值查表得键码等待按键释放返回八、程序编程OUTBIG EQU 8002H ; 位控制口OUTSEG EQU 8004H ; 段控制口KEYIN EQU 8001H ; 键盘读入口READY: MOV 20H,#3FH ;缓冲器设初值,赋值到6个数码管MOV 21H,#3FHMOV 22H,#3FHMOV 23H,#3FHMOV 24H,#3FHMOV 25H,#3FHMAIN: LCALL DISPLAY ;无键码输入,调用显示模块LCALL TESTJZ MAIN ;累加器为0即说明无按键,则转移继续显示LCALL SEARCH ;有键值输入,寻找输入键值所在的行和列MOV 20H,21H ;数码管显示出输入的键值MOV 21H,22HMOV 22H,23HMOV 23H,204MOV 24H,25HMOV DPTR,#LEDTABMOVC A,@A+DPTRMOV 25H,ASJMP MAINDISPLAY: ;显示模块MOV R0,#20H ;缓冲区从20H处开始MOV R1, #6 ;共6个八段管MOV R2, #00100000B ;从左边开始显示灯亮为1,灭为0, LOOP: MOV DPTR, #OUTBIGMOV A, #0MOVX @DPTR, A ; 位选码初值设为0,即关闭所有八段管MOV A, @R0 ;将以20H为首地址的内存值发送到段码输出口8004HMOV DPTR, #OUTSEGMOVX @DPTR,AMOV DPTR, #OUTBIG ;输出位选通信号,使每次只显示一位八段管MOV A, R2MOVX @DPTR, ALCALL DELAY ;延时MOV A, R2RR A ;位选信号右移一位,即动态显示下一个数码管MOV R2, AINC R0 ;内存地址加一,提供段码输出DJNZ R1, LOOPRETDELAY: MOV R7,#01H ; 延时子程序DEL1: MOV R6,#00HDEL2: DJNZ R6, DEL2DJNZ R7, DEL1RETTEST: MOV DPTR,#OUTBIG ;检测有无键值输入MOV A,#00HMOVX @DPTR,A ;输出线置为0MOV DPTR,#KEYINMOVX A,@DPTR ;读入键状态CPL A ;累加器求反ANL A,#0FH ;高四位不用RETSEARCH: ;找出键值所在的的位置(行和列)MOV R1,#00100000BMOV R2,#06HMOV R5,#00HMOV R4,#03HLSEARCH: ;找出列所在位置后MOV A,R1MOV DPTR,#OUTBIGMOVX @DPTR,ACPL ARR A ;通过判断循环几次进位为1来实现计数的功能,从而得知行所在位置MOV R1,AMOV DPTR,#KEYINMOVX A,@DPTRCPL AANL A,#0FHJNZ HSEARCH ;找到所在列,继续寻找行所在位置INC R5DJNZ R2,LSEARCHHSEARCH:MOV R7,#04HLOOP2: RRC AJC GETDEC R4DJNZ R7, LOOP2GET: ;确定输入的键码值MOV A,R4 ;键值=行*6+列,R4*6+R5->AMOV B,#6HADD A,R5MOV DPTR,#KEYTAB ;取出键码所在位置MOVC A,@A+DPTRMOV 26H,A ;将取出键值暂时保存在内存中,以免数据丢失WAIT: MOV DPTR,#OUTBIG ;等键释放CLR AMOVX @DPTR,ALCALL DELAYLCALL TESTJNZ WAITMOV A,26H ;释放出键盘输入值RETLEDTAB: ; 八段管显示码DB 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07hDB 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hKEYTAB: ;键盘码DB 07H,08H,09H,0AH,00H,00HDB 04H,05H,06H,0BH,00H,00HDB 01H,02H,03H,0CH,00H,00HEND九、仿真过程综述1.按照设计思路在PROTEUS软件中找到相应元器件,按照正确的连线方法将各个元器件连起来。

相关主题