数码管显示和键盘扫描实验资料
实验四 键盘扫描与数码管显示实验

院别:电子信息学院课程名称:微处理器实验
班级:通信11A姓名:xxxx学号:
实验名称:键盘扫描与数码管显示实验实验时间:2013年10月21日
成绩:教师签名:批改时间:
一、实验原理与目的
原理:
74HC164
74HC165
目的:
1、学会利用单片机进行键盘扫描行LED点阵的扫描显示;
2、学会利用单片机实现数码管显示。
二、实验仪器
1、PC机一台
2、DP-51PRO单片机综合仿真实验仪一台
三、实验内容与分析
1、编写一段程序,此程序的目的是通过单片机的P1口控制扫描,用C5区的74HC164控制显示输出,使C3区的8×8LED点阵显示一个“X”。
CLKEQUP3.2
DINAEQUP3.3
DINBEQUP3.4
CLEAREQUP3.5
ORG0000H
AJMPMAIN
ORG 0100H
MAIN:
MOVSP,#70H
MOV50H,#07EH
MOV51H,#0BDH
MOV52H,#0DBH
MOV53H,#0E7H
MOV54H,#0E7H
MOV55H,#0DBH
MOV56H,#0BDH
MOV57H,#07EH
PLEQUP3.0
CLK1EQUP3.1
CLK2EQUP3.2
SEREQUP3.3
Q7EQUP3.5
ORG0000H
LJMPMAIN
ORG0100H
MAIN:MOVSP,#60H;设置堆栈
MOVR4,#00;延时
DJNZR4,$
MOVA,#0;变量清零
SETBQ7;Q=1,端口设为输出状态
键盘、数码管显示综合实验

实验项目名称:键盘、数码管显示综合实验实验室(中心):电子实验室实验完成时间: 09 年11 月 5 日1一.实验目的与要求通过实验,掌握单片机在输入输出口线不够用时,怎样扩展接口的方法来支持8位LED 显示和16键盘集成实现。
熟悉8155、8279等芯片性能;掌握其编程方法。
掌握键盘子程序调试方法,掌握按一个键并将键值显示出来的编程方法,这是诊断硬件、测试硬件、产品开发、软件编程必须掌握的方法。
二.实验原理及实验线路(1)通过8155芯片的扩展功能,建立描述线与数据线同步功能,如图三.实验内容①编写并调试出一个键盘实验子程序;②用子程序调用方法,分别调用键盘子程序和显示子程序,将按一个键的键值(0-F),在数码管上显示出来。
四.实验器材表2.4.5(1):以8155为扩展方式的器件80C51.BUS CRYSTAL PHYC0402NP022P7404 7SEG-MPX6-CC-BLUE RESPACK-88155 HITEMP10U50VBUTTON MINRES10K五、实验程序流程图六.实验步骤1)仿真实验过程:打开Keil程序,执行菜单命令“Project”→“New Project”创建“键盘数码管显示综合实验”项目,并选择单片机型号为AT89C52.BUS。
执行菜单命令“File”→“New”创建文件,输入源程序,保存为“键盘数码管显示综合实验.A51或键盘数码管显示综合实验.c”。
在“Project”栏的File项目管理窗口中右击文件组,选择“Add Files to Group ‘Source Group1’”将源程序“键盘数码管显示综合实验.A51或键盘数码管显示综合实验.c”添加到项目中。
执行菜单命令“Project”→“Options for Target ‘Target 1’”,在弹出的对话框中选择“Output”选项卡,选中“Greate HEX File”。
执行菜单命令“Project”→“Build Target”,编译源程序。
键盘与数码管显示实验

R72 10K
S14 SW-PB S18 SW-PB S22 SW-PB S26 SW-PB
R73 10K
S15 SW-PB S19 SW-PB S23 SW-PB S27 SW-PB
D2 Diode
D3 Diode
D4 Diode
D5 Diode
J33 1 2 3 4 5 6 7 8
Header 8
R94
R95
Res1
Res1
Res1
Res1
Res1
Res1
Res1
Res1
330R
330R
330R
330R
330R
330R
330R
330R
DS1
11 7 4 2 1 10 5 3
a b DIG1 c d e f g DP
HDSP-B09G
DIG2 DIG3
DP3
DP2
K1 DIG4 K2
K3 K4
9 GND COM D 10
ULN2803A GND
VCC
Pad_DS_K1 Pad_DS_K2 Pad_DS_K3 Pad_DS_K4
Pad_DS_K5
Pad_DS_K6
Pad_DS_K7
Pad_DS_K8 J37
S8550
R80 Res1 10K Q20
S8550
R81 Res1 10K Q21
键盘与数码管显示
一、4X4键盘 二、LED显示器的基本结构 三、实验箱原理图 四、STC15 I/O口 工作模式配置 五、实验要求
一、4X4键盘
5V
行线(输出)
•键特征值的判断
列线(输入)
•键盘控制方式:扫描、中断
实验报告七 键盘扫描及显示实验

信息工程学院实验报告课程名称:微机原理与接口技术 实验项目名称:键盘扫描及显示实验 实验时间:2017.1.6 班级: 姓名: 学号:一、实 验 目 的1. 掌握 8254 的工作方式及应用编程。
2. 掌握 8254 典型应用电路的接法。
二、实 验 设 备了解键盘扫描及数码显示的基本原理,熟悉 8255 的编程。
三、实 验 原 理将 8255 单元与键盘及数码管显示单元连接,编写实验程序,扫描键盘输入,并将扫描结果送数码管显示。
键盘采用 4×4 键盘,每个数码管显示值可为 0~F 共 16 个数。
实验具体内容如下:将键盘进行编号,记作 0~F ,当按下其中一个按键时,将该按键对应的编号在一个数码管上显示出来,当再按下一个按键时,便将这个按键的编号在下一个数码管上显示出来,数码管上可以显示最近 6 次按下的按键编号。
键盘及数码管显示单元电路图如图 7-1 和 7-2 所示。
8255 键盘及显示实验参考接线图如图 7-3 所示。
图 7-1 键盘及数码管显示单元 4×4 键盘矩阵电路图图7-2 键盘及数码管显示单元 6 组数码管电路图图7-3 8255 键盘扫描及数码管显示实验线路图四、实验内容与步骤1. 实验接线图如图7-3 所示,按图连接实验线路图。
图7-4 8255 键盘扫描及数码管显示实验实物连接图2.运行Tdpit 集成操作软件,根据实验内容,编写实验程序,编译、链接。
图7-5 8255 键盘扫描及数码管显示实验程序编辑界面3. 运行程序,按下按键,观察数码管的显示,验证程序功能。
五、实验结果及分析:1. 运行程序,按下按键,观察数码管的显示。
图7-6 实验结果分析:当按下键盘其中一个按键时,将该按键对应的编号在一个数码管上显示出来,当再按下一个按键时,便将这个按键的编号在下一个数码管上显示出来,数码管上可以显示最近 6 次按下的按键编号。
六、实验总结:通过本实验,我了解键盘扫描及数码显示的基本原理,以及熟悉8255 的编程。
51单片机数码管显示及矩阵键盘扫描程序

51单片机数码管显示及矩阵键盘扫描程序硬件实验十一八段数码管实验一、实验任务1、在静态数码管上轮流显示数字0-9。
2、在两个4位数码管上动态显示数字0-9二、流程图及程序静态显示:流程图:程序代码:#include#define uchar unsigned chucharcodevalue[10]={0xC0,0xF9,0xA4,0xB0,0X99,0x92,0x82,0xF8,0 x80,0x90};//0 -9数码管显示段码void delay(char x) //延时子程序{uchar i;for(i=0;i<200;i++);}main() //主函数{int i;while(1){for(i=0;i<10;i++) //显示0-9{P0=codevalue[i];delay(500); //延时1秒}}}动态显示:#include#includetab1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6D,0x7D,0x07,0x7f,0x6f}; //数码管显示数字字段unsigned char tab2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//片选字段unsigned char i,k,j,x;void delay(x); //声明延时子函数void main() //主函数{while(1){for(i=0;i<8;i++) //显示0-7{ P1=tab1[i];P0=tab2[i];delay(5); //延时}P1=tab1[8]; P0=tab2[0]; delay(5); //显示8-9P1=tab1[9]; P0=tab2[1]; delay(5);}}void delay(x) //延时函数定义{do{for(j=0;j<250;j++)for(k=0;k<250;k++);}}硬件实验十二矩阵键盘扫描显示一、实验任务1、把矩阵键盘上的按键输入的键码在静态数码管上显示出来。
数码管显示和键盘扫描实验资料

数码管显示和键盘扫描实验资料实验三LED数码管动态显示及4 X4 键盘控制实验一、实验目的1.巩固多位数码管动态显示方法。
2.掌握行扫描法矩阵式按键的处理方法。
3.熟练应用AT89S52学习板实验装置,进一步掌握keil C51的使用方法。
二、实验内容使用AT89S52学习板上的4位LED数码管和4 X 4矩阵键盘阵列做多位数码管动态显示及行扫描法键盘处理功能实验。
用P0口做数据输出,利用P1做锁存器74HC573的锁存允许控制,编写程序使4位LED数码管按照动态显示方式显示一定的数字;按照行扫描法编写程序对4 X 4矩阵键盘阵列进行定期扫描,计算键值并在数码管上显示。
三、实验系统组成及工作原理1.4位LED数码管和4 X 4矩阵键盘阵列电路原理图2.多位数码管动态显示方式说明4位共阴极LED动态显示3456数字的工作过程首先由I/O口(1)送出数字3的段选码4FH即数据01001111到4个LED共同的段选线上,接着由I/O口(2)送出位选码××××0111到位选线上,其中数据的高4位为无效的×,唯有送入左边第一个LED的COM端D3为低电平“0”,因此只有该LED的发光管因阳极接受到高电平“1”的g、d、c、b、a段有电流流过而被点亮,也就是显示出数字3,而其余3个LED因其COM端均为高电平“1”而无法点亮;显示一定时间后,再由I/O口(1)送出数字4的段选码66H即01100110到段选线上,接着由I/O 口(2)送出点亮左边第二个LED的位选码××××1011到位选线上,此时只有该LED的发光管因阳极接受到高电平“1”的g、f、c、b段有电流流过因而被点亮,也就是显示出数字4,而其余3位LED不亮;如此再依次送出第三个LED、第四个LED的段选与位选的扫描代码,就能一一分别点亮各个LED,使4个LED从左至右依次显示3、4、5、6。
键盘扫描与LED数码管显示课件

设计温度传感器模块,如 DS18B20,用于获取环境温
度。
编写程序读取温度传感器数 据,并进行处理和转换。
04
05
使用LED数码管显示当前温 度值,如“25℃”。
THANKS
感谢观看
特点
LED数码管具有高亮度、低功耗、寿命长、耐腐蚀等特点,且体积小、重量轻, 易于安装和携带。
LED数码管的应用场景与优势
应用场景
LED数码管广泛应用于各种需要数字 显示的场合,如仪表盘、计时器、遥 控器等。
优势
LED数码管具有高亮度、低功耗、寿 命长等特点,能够提供清晰、稳定的 数字显示,同时价格相对较低,易于 实现大规模生产。
联合应用的常见问题与解决方案
常见问题
键盘扫描可能会出现按键抖动、串扰等 问题;LED数码管显示可能会出现亮度不 均、闪烁等问题。
VS
解决方案
针对按键抖动问题,可以采用软件消抖或 硬件消抖的方法;针对串扰问题,可以增 加隔离电路或采用差分信号传输方式。针 对LED数码管亮度不均问题,可以调整各 段数码管的电流参数;针对闪烁问题,可 以增加刷新频率或采用动态扫描显示方式 。
放相应音符。
01
设计音符键区,包括 do-re-mi等音符按键。
03
使用LED数码管显示当 前播放的音符名称,如
“C”。
05
详细描述
02
编写程序识别按键并播 放相应音符,如播放C
大调音阶。
04
案例四:温度显示系统设计
详细描述
总结词:通过温度传感器获 取温度值,使用LED数码管
显示温度值。
01
02
03
键盘扫描原理
通过逐行或逐列扫描键盘的每个按键 ,检测是否有键被按下。当某个按键 被按下时,相应的行或列电平发生变 化,从而识别出被按下的按键。
实验8 键盘扫描和显示实验

实验八键盘扫描和显示实验实验目的:掌握键盘和显示器的接口方法和编程方法;掌握键盘扫描和LED八段数码管显示器的工作原理。
实验内容:利用LAB6000通用微控制器提供的键盘扫描电路和显示电路,完成键盘扫描和显示实验。
把按键输入的键码在六位LED数码管上显示出来。
可分成三个模块:①键输入模块:扫描键盘,读取一次键盘并将键值存入键值缓冲单元。
②显示模块:将显示单元的内容在六位LED数码管上动态显示。
③主程序:调用键输入模块和显示模块。
实验步骤:1.按照流程图分析参考程序,在读懂的基础上编写或修改程序;2.将键盘和显示器的片选连接孔KEY/LED—CS与片选口CS0连接;3.输入编好的程序,汇编并运行。
4.观察程序运行后LED 的显示,按下数字键,再观察LED 的显示。
5.按照思考题的要求,修改程序进行实验。
实验电路原理图:实验报告要求:记录实验现象,分析原因。
整理好运行正确的程序,写出总结和体会。
思考题:1.如果显示5、6、7、8如何修改?2.LEDTAB(字形表)每一个码代表什么?3.如果把CS0改为CS1,程序如何修改?4.怎样关显示,开放键盘?5.CPL A 指令是什么功能?为什么要用该指令?6.MOVC 和MOVX 指令有何不同?7.LEDBuf equ 60H 是什么指令?什么含义?8.MOV LEDBuf+1,#5BH是什么含义?附: 参考流程图附: 参考程序Org 0000hOUTBIT equ 8002h ;位控制口OUTSEG equ 8004h ;段控制口IN equ 8001h ;键盘读入口LEDBuf equ 60h ;显示缓冲器首址 ljmp StartLED字形表LEDTAB:db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07hdb 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hDelay: mov r7, #00h 延时子程序Delay1:djnz r7, Delay1djnz r6, Delay1retDisplay: LED显示子程序mov r0, #LEDBufmov r1, #06h ;共6个八段LEDmov r2, #00100000b ;从左边开始显示Loop: mov dptr, #OUTBIT ;指向位控制口mov a, #00h ;关显示movx @dptr, amov a, @r0 ;取一个待显示数mov dptr, #OUTSEG ;指向段控制口movx @dptr, a ;输出段码mov dptr, #OUTBIT ;指向位控制口mov a, r2 ;取位码movx @dptr, a ;输出位码mov r6, #01hcall Delaymov a, r2 ;位码右移一位rr amov r2, ainc r0 ;指向下一个待显示数djnz r1, Loop ;6个LED都显示完了吗? retTestKey: 扫描键盘mov dptr, #OUTBIT ;指向位控制口mov a, #00h ;开放键盘movx @dptr, amov dptr, #IN ;指向键盘读入口movx a, @dptr ;读入键盘状态cpl aanl a, #0fh ;高4位不用retKeyTab:db 16h, 15h, 14h, 0ffh 键值表db 13h, 12h, 11h, 10hdb 0dh, 0ch, 0bh, 0ahdb 0eh, 03h, 06h, 09hdb 0fh, 02h, 05h, 08hdb 00h, 01h, 04h, 07hGetKey:mov dptr, #OUTBITmov P2, dphmov r0, #Low(IN)mov r1, #00100000bmov r2, #06h ;共6列KLoop: mov a, r1 ;找出键所在列cpl amovx @dptr, acpl arr a ;右移一位,指向下一列mov r1, amovx a, @r0cpl aanl a, #0fhjnz Goon1 ;该列有键入djnz r2, KLoopmov r2, #0ffh ;没有键按下, 返回 0ffh sjmp ExitGoon1: mov r1, a ;键值 = 列*4 + 行mov a, r2dec arl arl amov r2, a ;r2 = (r2-1)*4mov a, r1 ;r1中为读入的行值mov r1, #4LoopC: rrc a ;移位找出所在行jc Exitinc r2 ;r2 = r2+ 行值djnz r1, LoopCExit: mov a, r2mov dptr, #KeyTabmovc a, @a+dptrmov r2, aWaitRelease: 等待键释放mov dptr, #OUTBITclr amovx @dptr, amov r6, #10call Delaycall TestKeyjnz WaitReleasemov a, r2retStart: mov sp, #50hmov LEDBuf+0, #06h ;显示 1mov LEDBuf+1, #5bh ;显示 2mov LEDBuf+1, #4fh ;显示 3mov LEDBuf+2, #66h ;显示 4mov LEDBuf+3, #66hmov LEDBuf+4, #0mov LEDBuf+5, #0MLoop: call Display ;显示(调显示子程序)call TestKey ;有键入? (调扫描键盘子程序) jz MLoop ;无键入, 继续显示call GetKey ;读入键码anl a, #0fh ;显示键码mov dptr, #LEDTABmovc a, @a+dptrmov LEDBuf+5, aljmp MLoopend。
键盘扫描显示实验报告

一、实验目的1. 理解键盘扫描的基本原理,掌握键盘扫描的方法。
2. 掌握数码管显示的基本原理,实现键盘扫描信息的实时显示。
3. 熟悉8255并行接口芯片在键盘扫描和数码管显示中的应用。
二、实验原理1. 键盘扫描原理:键盘扫描是指通过硬件电路对键盘按键进行检测,并将按键信息转换为可识别的数字信号的过程。
本实验采用行列式键盘,通过扫描键盘的行线和列线,判断按键是否被按下。
2. 数码管显示原理:数码管是一种用来显示数字和字符的显示器,由多个发光二极管(LED)组成。
本实验采用七段数码管,通过控制各个段(A、B、C、D、E、F、G)的亮灭,显示相应的数字或字符。
3. 8255并行接口芯片:8255是一款通用的并行接口芯片,具有三个8位并行I/O口(PA、PB、PC),可用于键盘扫描和数码管显示的控制。
三、实验设备1. 实验平台:PC机、8255并行接口芯片、行列式键盘、七段数码管、面包板、导线等。
2. 软件环境:汇编语言编程软件、仿真软件等。
四、实验步骤1. 硬件连接:将8255并行接口芯片、行列式键盘、七段数码管连接到实验平台上,按照电路图进行连线。
2. 编写程序:使用汇编语言编写键盘扫描和数码管显示的程序。
(1)初始化8255并行接口芯片:设置PA口为输出端口,PB口为输出端口,PC口为输入端口。
(2)扫描键盘:通过PC口读取键盘的行线状态,判断是否有按键被按下。
若检测到按键被按下,读取对应的列线状态,确定按键的位置。
(3)数码管显示:根据按键的位置,控制数码管的段(A、B、C、D、E、F、G)的亮灭,显示相应的数字。
3. 仿真调试:使用仿真软件对程序进行调试,确保程序能够正确扫描键盘和显示数字。
五、实验结果与分析1. 实验结果:成功实现了键盘扫描和数码管显示的功能。
当按下键盘上的任意按键时,数码管上会显示对应的数字。
2. 分析:(1)键盘扫描部分:通过读取PC口的行线状态,判断是否有按键被按下。
当检测到按键被按下时,读取PB口的列线状态,确定按键的位置。
汇编数码显示及键盘实验实验报告

数码显示及键盘实验【实验内容】1、数码管显示0-72、独立按键识别【需要了解的知识】1、GPIO设定2、数码管动态扫描显示原理,键盘扫描工作原理,输入与输出及其处理【实验预习】仔细预读实验指导电子文档的实验六、七及其前面的实验流程【实验设备】Keil C51软件、ICE52 仿真驱动、MEFlash编程软件、USB驱动程序【实验过程】实验一数码管显示0-7实验任务:1)先将“0-7”数码管的段码值写入存储器中,使8位数码管从右至左显示0-7.实验步骤:1)首先在硬盘上建立一个文件夹;2)启动Keil C51软件;3)执行Keil C51软件的菜单“Project|New Project……”,弹出一个名为“Create New Project”的对话框。
输入工程文件名,选择保存路径uv2后缀,点击“保存”按钮;4)紧接着弹出“Options for Target‘Target 1’”,为刚才的项目选择ATMEL的AT89S52的CPU。
选择之后,点击“确定”按钮;5)接下来弹出一个对话框提示你是否要把标准8051的启动代码添加项目中去,此时,点击“否”按钮;6)执行菜单“File|New……”,出现一个名为“Text1”的文档。
接着执行菜单“File|Save”弹出一个名为“Save As”的对话框,将文件名改为“.asm”后缀,然后保存;7)添加源程序文件到工程中,一个空的源程序文件建成。
单击Keil C51软件左边项目工作窗口“Target1”上的“+”,将其展开。
然后右击“Source Group1”文件夹弹出下拉菜单,单击其中的“Add Files to Group‘Source Group1’”项;8)在弹出的对话框中先选择文件类型为“Asm Source file(*.s*;*.src;*.a*)”,这时对话框内创建的空的源程序文件已经出现在项目工作窗口的“Source Group1”文件夹中;输入源程序代码;9)点击工具栏“Options for target”按钮,弹出一个对话框,定义“Xtal”为11.0592.下面依序是存储模式、程序空间大小等设置,均用默认值即可。
微机原理键盘扫描及显示完整实验报

实验9键盘扫描及显示实验
实验时间2019年12月18日
实验类型■验证性□设计性□综合性
1.实验目的
了解键盘扫描及数码显示的基本原理,熟悉8255的编程。
2.实验内容及过程(主要内容、操作步骤)
将8255单元与键盘及数码管显示单元连接,编写实验程序,扫描键盘输入,并将扫描结果送数码管显示。
键盘采用4X4键盘,每个数码管显示值可为0~F 共16个数。
实验具体内容如下:将键盘进行编号,记作0~F,当按下其中-一个按键时,将该按键对应的编号在一个数码管上显示出来,当再按下一个按键时,便将这个按键的编号在下一个数码管上显示出来,数码管上可以显示最近4次按下的按键编号。
3.测试数据及实验结果
4.实验分析及总结(主要考察内容)
通过本次实验,我理解了键盘扫描及数码显示的基本原理,通过理解分析程序,自己对程序进行了一些总结和修改,并进行了验证,进一步掌握了微机接口的学习方法。
教师评阅
评价指标:实验目的、操作步骤、设计、算法、程序结构、实验结果、实验分析、实验总结
1/ 1。
【单片机实验七】键盘扫描及显示设计实验

程序及注解见附件CLEAR: MOV DPTR, #B_8255 ;清屏 MOV A,#00H MOVX @DPTR,A RET DIS: PUSH ACC ;显示子程序 PUSH 00H PUSH 03H MOV R0,#50H ;显示缓冲首地址 MOV R3,#0DFH ;显示扫描值AGAIN: MOV A,#0FFH ;关闭显示 MOV DPTR,#A_8255 MOVX @DPTR,A MOV A,@R0 MOV DPTR,#DSEGS ;数码管段表地址 MOVC A,@A+DPTR ;查表 MOV DPTR,#B_8255 ;送段显示 MOVX @DPTR,A MOV A,R3 MOV DPTR,#A_8255 MOVX @DPTR,A ACALL DL1MS INC R0 ;显示缓冲加1 MOV A,R3 JNB ACC.0,OUT ;扫描结束否 RR A ;向右移一位 MOV R3,A AJMP AGAIN OUT: POP 03H POP 00H POP ACC RET ;数码管段显示值DSEGS: DB 03FH, 06H,05BH,04FH,066H,06DH,07DH, 07H DB 07FH,06FH,077H,07CH,039H,05EH,079H,071H DL1MS: MOV R7,#01H DL0: MOV R6,#080H DL1: DJNZ R6,DL1 DJNZ R7,DL0 RET PUTBUF: PUSH 00H ;保存键值到缓冲RAM 中 PUSH ACC MOV A,R5 MOV R0,A POP ACC MOV @R0,A DEC R5 CJNE R5,#04FH,GOBACK MOV R5,#55H ;重置缓冲地址GOBACK: POP 00H RET END ;==============================================================; 文件名称: KeyScan.Asm; 功能描述: 8255扩展IO, 完成键盘及数码管显示实验.; 按下按键, 数码管显示相应键值.;==============================================================A_8255 EQU 7F00H ;8255端口定义B_8255 EQU 7F01HC_8255 EQU 7F02HCON_8255 EQU 7F03HORG 0000HLJMP MAINORG 0100HMAIN: MOV 50H,#00H ;键值缓冲清0MOV 51H,#00HMOV 52H,#00HMOV 53H,#00HMOV 54H,#00HMOV 55H,#00HMOV R5, #55HMOV A, #81H MOV DPTR, #CON_8255 ;8255控制端口MOVX @DPTR, A ;写入控制字BEGIN: LCALL DIS ;调用显示子程序LCALL CLEAR ;清屏LCALL CCSCAN ;调用键扫子程序JNZ INK1 ;判是否有键按下LJMP BEGININK1: LCALL DISLCALL DL1MS ;消除按键抖动LCALL DL1MSLCALL CLEARLCALL CCSCANJNZ INK2AJMP BEGININK2: MOV R2,#0FEHMOV R4,#00H ;从第0列开始扫描COLUM: MOV DPTR,#A_8255MOV A,R2MOVX @DPTR,A ;写入列扫描值MOV DPTR, #C_8255MOVX A,@DPTRJB ACC.0,LINE1 ;判第0行的值MOV A,#00H ;第0行AJMP KCODELINE1: JB ACC.1,LINE2MOV A,#04H ;第1行AJMP KCODELINE2: JB ACC.2,LINE3MOV A,#08H ;第2行AJMP KCODELINE3: JB ACC.3,NEXTMOV A, #0CH ;第3行KCODE: ADD A,R4 ;得到键值ACALL PUTBUFPUSH ACCKON: ACALL DISACALL CLEARACALL CCSCANJNZ KONPOP ACCNEXT: INC R4MOV A,R2JNB ACC.4,KERRRL AMOV R2,AAJMP COLUMKERR: AJMP BEGINCCSCAN: MOV DPTR,#A_8255 ;按键扫描MOV A,#00HMOVX @DPTR,AMOV DPTR,#C_8255MOVX A,@DPTRCPL A ;取反ANL A,#0FHRET。
实验四键盘扫描及显示设计实验报告

实验四键盘扫描及显⽰设计实验报告实验四键盘扫描及显⽰设计实验报告⼀、实验要求1. 复习⾏列矩阵式键盘的⼯作原理及编程⽅法。
2. 复习七段数码管的显⽰原理。
3. 复习单⽚机控制数码管显⽰的⽅法。
⼆、实验设备1.PC 机⼀台2.TD-NMC+教学实验系统三、实验⽬的1. 进⼀步熟悉单⽚机仿真实验软件 Keil C51 调试硬件的⽅法。
2. 了解⾏列矩阵式键盘扫描与数码管显⽰的基本原理。
3. 熟悉获取⾏列矩阵式键盘按键值的算法。
4. 掌握数码管显⽰的编码⽅法。
5. 掌握数码管动态显⽰的编程⽅法。
四、实验内容根据TD-NMC+实验平台的单元电路,构建⼀个硬件系统,并编写实验程序实现如下功能:1.扫描键盘输⼊,并将扫描结果送数码管显⽰。
2.键盘采⽤ 4×4 键盘,每个数码管显⽰值可为 0~F 共 16 个数。
实验具体内容如下:将键盘进⾏编号,记作 0~F,当按下其中⼀个按键时,将该按键对应的编号在⼀个数码管上显⽰出来,当再按下⼀个按键时,便将这个按键的编号在下⼀个数码管上显⽰出来,数码管上可以显⽰最近 4 次按下的按键编号。
五、实验单元电路及连线矩阵键盘及数码管显⽰单元图1 键盘及数码管单元电路实验连线图2实验连线图六、实验说明1. 由于机械触点的弹性作⽤,⼀个按键开关在闭合时不会马上稳定地接通,在断开时也不会⼀下⼦断开。
因⽽在闭合及断开的瞬间均伴随有⼀连串的抖动。
抖动时间的长短由按键的机械特性决定,⼀般为 5~10ms。
这是⼀个很重要的时间参数,在很多场合都要⽤到。
键抖动会引起⼀次按键被误读多次。
为了确保 CPU 对键的⼀次闭合仅做⼀次处理,必须去除键抖动。
在键闭合稳定时,读取键的状态,并且必须判别;在键释放稳定后,再作处理。
按键的抖动,可⽤硬件或软件两种⽅法消除。
2. 为了减少键盘与单⽚机接⼝时所占⽤ I/O 线的数⽬,在键数较多时,通常都将键盘排列成⾏列矩阵形式。
3. 从数码管显⽰⽅式看,数码管分为静态显⽰和动态显⽰两种⽅式。
矩阵键盘扫描与数码管显示实验结果分析

矩阵键盘扫描与数码管显示实验结果分析
矩阵键盘扫描与数码管显示实验是一种常见的数字电路实验。
在这个实验中,我们可以通过按下矩阵键盘上的按键,控制数码管上的数字显示。
实验结果分析主要包括以下几个方面:
1. 矩阵键盘扫描:在实验中按下键盘上的某个按键,可以通过扫描算法检测到按键的位置,并将对应按键的行列信息送入微处理器或控制电路。
分析实验结果时,可以观察是否可以正常检测到按键的位置,并且是否能够正确传递给其他部分的电路或处理器。
2. 数码管显示:通过实验中的控制电路,可以将微处理器或其他控制器输出的数字信号转换成数码管上的对应数字显示。
在分析实验结果时,可以观察数码管是否能够正常显示所期望的数字,并且是否能够响应输入信号的变化。
3. 信号传递与处理:在整个实验电路中,信号的传递和处理是关键部分。
可以分析信号在各个部分的传递过程中是否出现错误或干扰,是否能够实现正确的数据传输和处理。
4. 稳定性和可靠性:实验结果的分析还需要考虑电路的稳定性和可靠性。
即在长时间使用或复杂环境条件下,电路能否保持正常工作,并且不出现意外错误或故障。
总结来说,矩阵键盘扫描与数码管显示实验结果的分析需要关注按键的检测和传递、数码管的正确显示、信号传递与处理等方面,同时也需要考虑电路的稳定性和可靠性。
实验5键盘输入与数码管显示实验

班级学号姓名实验组别实验日期室温报告日期成绩报告内容:(目的和要求、原理、步骤、数据、计算、小结等)实验名称:实验5键盘输入与数码管显示实验一、实验目的学习键盘工作原理,掌握数据输入输出的方法。
二、实验内容及原理矩阵键盘扫描原理:由处理器通过行线给某一行按键送入低电平信号,按键在未使用的情况下列线上拉高电平信号,处理器对行线输出相连的I/O口进行扫描,当扫描到低电平信号时证明对应的键被按下。
本实验中采用的是2*8键盘,为了减少对处理器芯片I/O接口的直接引用,实验中使用了一片74HC595(U6)用来实验数据串并转换。
三、实验原理图四、实验步骤1. 实验连线74HC595(U6)时钟控制端接LPC2103总线接口模块的P0.19,数据输入端接总线接口模块的P0.20,选通端接总线接口模块的P0.21。
数据输出端接按键行扫描输入端。
按键8根行线接74HC595的数据输出端,2根列线分别接LPC2103总线接口模块的P0.17,P0.18.同时在列线上接入+3.3V 电源和上拉电阻以确保在没有信号输入的情况下列线给处理器送入的是高电平信号。
2.仿真器的设置:一般选用JTAG 调试,若使用RelInFlash 生成目标时,编译连接生成的目标代码会将芯片加密。
此时调试无法继续,须将硬件调成ISP 模式进行全片擦除。
3. 运行程序:keytest.hex4. 接通电源,按下按键并观察实验板上数码管的变化。
五、流程图主程序显示子程序键盘扫描六、实验程序#include "config.h" #include "Num show.h" #include "key.h"/**************************************************************************** * 名称:main()* 功能:数据送入数码管显示****************************************************************************/ int main(void){uint8 key_val=0,dis;uint8 str[8]={0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00};PINSEL0=0x00000000;//设置所有引脚连接GPIOPINSEL1=0x00000000;IODIR=SPI_IOCON; //设置LED为输出其他为输入//Num_show(str);while(1){key_val=get_key(); //取键值if(key_val<16){dis = key_val;if(dis<10){str[7]=dis;str[6]=0;}else{str[6]=1;str[7]=dis%10;}//for(m=0;m<10;m++) //延时显示键值}Num_show(str);//显示改变后的数值}return (0);}#include "config.h"#define SPI_CS 0x00000100//P0.8#define SPI_CS1 1<<11//P0.11#define SPI_DATA 0x00000040//P0.6#define SPI_DATA1 0x00000080//P0.7/**************************************************************************** * 名称:DelayNS()* 功能:长软件延时* 入口参数:dly参数越大延时越久* 出口参数:无****************************************************************************/ void DelayNS(uint32 dly){uint32 i;for(;dly>0;dly--)for(i=0;i<5000;i++);}/**************************************************************************** * 名称:HC595_SendDat()* 功能:向74HC595发送一个字节的数据* 入口参数:data要发送的数据* 出口参数:无* 说明:高位数据先发送****************************************************************************/ void HC595_SendDat(uint8 dat){uint8 i;IOCLR = SPI_CS; //SPI_CS=0for(i=0;i<8;i++) //发送8位数据{IOCLR = SPI_CLK; //SPI_CLK=0if((dat&0x80)!=0) IOSET = SPI_DA TA;else IOCLR = SPI_DA TA;dat<<=1;IOSET = SPI_CLK; //SPI_CLK=1}IOSET = SPI_CS; //SPI_CS=1,输出显示数据}void HC595_SendDat1(uint8 dat){uint8 i;IOCLR = SPI_CS1; //SPI_CS=0for(i=0;i<8;i++) //发送8位数据{IOCLR = SPI_CLK; //SPI_CLK=0if((dat&0x80)!=0) IOSET = SPI_DA TA1;dat<<=1;IOSET = SPI_CLK; //SPI_CLK=1}IOSET = SPI_CS1; //SPI_CS=1,输出显示数据}/***************************************************************************** 名称:Num_show()* 功能:显示收到的数据* 入口参数:str[],要显示的数据****************************************************************************/ int Num_show(uint8 str[]){const uint8 DISP_TAB1[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80};const uint8 DISP_TAB[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//0--f 暗亮G P U r -uint8 i;// while(1){for(i=0;i<8;i++){HC595_SendDat(DISP_TAB[str[i]]);HC595_SendDat1(DISP_TAB1[i]);DelayNS(1);HC595_SendDat(0xff);HC595_SendDat1(DISP_TAB1[i]);}}return(0);}#include "config.h"#include "Num show.h"#define SPI_CS2 1<<21//P0.21#define SPI_DATA2 1<<20//P0.20#define SPI_CLK2 1<<19//P0.19#define KEY1 1<<17// P0.17#define KEY2 1<<18// P0.18/***************************************************************************** 名称:HC595_SendDat2()* 功能:向74HC595发送一个字节的数据* 入口参数:data要发送的数据* 说明:高位数据先发送****************************************************************************/ void HC595_SendDat2(uint8 dat){uint8 i;IOCLR = SPI_CS2; //SPI_CS2=0for(i=0;i<8;i++) //发送8位数据{IOCLR = SPI_CLK2; //SPI_CLK2=0if((dat&0x80)!=0) IOSET = SPI_DA TA2;else IOCLR = SPI_DA TA2;dat<<=1;IOSET = SPI_CLK2; //SPI_CLK2=1}IOSET = SPI_CS2; //SPI_CS2=1,输出显示数据}/**************************************************************************** * 名称:get_key()* 功能:按下按键取数值* 入口参数:无* 出口参数:键值* 说明:高位数据先发送****************************************************************************/uint8 get_key(void){uint8 key_value=16,i,j;uint8 k1[8]={0,1,2,3,4,5,6,7};uint8 k2[8]={8,9,10,11,12,13,14,15};const uint8 DISP_TAB2[8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};for(i=0;i<8;i++){HC595_SendDat2(DISP_TAB2[i]); //扫描if((IOPIN&KEY1)==0){ DelayNS(10);if((IOPIN&KEY1)==0){ while((IOPIN&KEY1)==0);key_value=k1[i];break;}}}{for(j=0;j<8;j++){HC595_SendDat2(DISP_TAB2[j]); //扫描if((IOPIN&KEY2)==0){ DelayNS(10);if((IOPIN&KEY2)==0){while((IOPIN&KEY2)==0);key_value=k2[j];break;}}}}return key_value;}。
实验四、键盘扫描与数码管显示

特点:编码过程简单,编码复杂且不连续,不便处理
0、1、2、3 → 列号
0、4、8、C → 行首码
按键编码 = 列号+行首码
特点:编码过程复杂,编码简单且连续,便于处理
二进制组合编码键位识别:
(1)检测是否有键按下 ① 行线送全扫描字(P1=F0H),让P1.0~P1.3都为低电平; ② 读列线状态(P1?=F0H),若P1.4~P1.7全为高电平,则无键按下,反之则有键按下。
(2)确认键位
① 行线送全扫描字(P1=F0H),读出列线值;
② 列线送全扫描字(P1=0FH),读出行线值; ③ 行列值组合确认键位。
二进制组合编码 共阳极字段码 显示数字 二进制组合编码 共阳极字段码 显示数字
EEH DEH BEH 7EH EDH DDH BDH 7DH C0H F9H A4H B0H 99H 0 1 2 3 4 92H 82H 5 6 F8H 7 77H 8EH F
(2)键盘原理与按键消抖
前沿抖动
后沿抖动
机械式按键抖动时间 一般为5ms~10ms
抖动会引起一次按键被误读多次,必须消抖:
① 硬件消抖:利用RS触发器反馈形成双稳态电路
② 软件消抖:利用延时程序跳过抖动
(3)矩阵键盘与键位编码
独立键盘: ① 每个按键占用一根I/O线 ② 电路、程序简单 ③ 适合按键少 矩阵键盘: ① 按键采用行列结构复用I/O线 ② 电路、程序复杂 ③ 适合按键多
EBH DBH BBH 7BH E7H D7H B7H 80H 90H 88H 83H C6H A1H 86H 8 9 A B C D E
4×4矩阵键盘扫描与7段数码管显示
键盘采用二进制组合编码,数码管为7段共阳极
数码管显示及键盘检测

数码管的显示数码管的显示原理同流水灯,都是通过控制单片机输出的的高低电平控制发光二极管的点亮和熄灭。
使用LED 显示器时,要注意区分这两种不同的接法。
为了显示数字或字符,必须对数字或字符进行编码。
七段数码管加上一个小数点,共计8段。
因此为LED 显示器提供的编码正好是一个字节。
TX 实验板用共阴LED 显示器,根据电路连接图显示16进制数的编码已列在下表。
共阴数码管码表▪ 0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d , ▪ 0 1 23 4 5▪ 0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c , ▪ 6 7 8 9 A B ▪ 0x39 , 0x5e , 0x79 , 0x71 , 0x00 ▪ C D E F 无显示静态显示方式LED 显示器工作方式有两种:静态显示方式和动态显示方式。
静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。
当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。
这种方法的优点是占用CPU 时间少,显示便于监测和控制。
缺点是硬件电路比较复杂,成本较高。
动态显示动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。
这样一来,就没有必要每一位数码管配一个锁存器,从而大大地简化了硬件电路。
选亮数码管采用动态扫描显示。
所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。
动态显示实例 :原理图:cd e GND dpa b c d e f g f d b(a ) b )例:利用动态显示在数码管上显示1,2,3,4;#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit dula=P0;sbit wela=P2;uchar num;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//字符数组uchar code s[]={1,2,4,8};//位选数码管1,2,3,4 void delay(uint z);void main(){wela=1;//11101010P0=0xea;wela=0;//初始化while(1){for(num=1;num<5;num++){P0=table[num];delay(1000);P2=s[num-1];}}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}*数码管动态显示注意事项1,动态显示需注意延时的时间,延时的时间决定数码管的亮度2,多个数码管显示时扫描的频率,保证显示不闪烁下面做一个数码管显示实验,利用静态显示在数码管上显示1;源程序:#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit dula=P0;sbit wela=P2;void main(){wela=1;//选择第一个数码管P0=0x06;//显示编码1}静态显示会浪费很多的IO口,所以常用动态显示键盘检测1、键盘的分类●键盘分编码键盘和非编码键盘。
单片机实训报告键盘和数码管显示(WORD档)

单片机实训报告(一)班级:测控 9 0 1学号:姓名实验名称:键盘和数码管显示实验目的:熟悉掌握ZLG7289的功能和特性,ZLG7289芯片各引脚名称及功能和ZLG7289与微控制器的接口,ZLG7289的SPI接口和控制指令。
同时进一步熟悉掌握keil软件的操作和编程。
实验原理:ZLG7289是一款数码显示驱动和键盘扫描管理的芯片。
主要有如下的特性:1.直接驱动8位共阴式数码管或64只独立的LED;2.管理多达64只按键,自动消除抖动;3.段电流可达15mA以上,位电流可达100mA;4.具有左移、右移、闪烁、消隐、段点亮等多种功能;5.与微控制器之间采用三线SPI总线接口,占用I/O资源少。
电路主要由芯片ZLG7289、8位共阴极数码管、64键的键盘矩阵以及单片机构成。
ZLG7289的控制电路图:电路的工作原理:当ZLG7289接收到单片机发出的指令(包括纯指令)后,经过读取、分析和处理,将会在数码管上显示相对应的操作指令。
当ZLG7289检测到有效的按键时,KEY脚将从高电平变为低电平,并一直保持到按键结束。
在此期间,如果ZLG7289接收到“读键盘数据指令”,则输出当前按键的键盘代码。
ZLG7289芯片各引脚名称及功能:引脚名称说明1、2 RTCC、Vcc 接电源3、5 NC 悬空4 Vss 接地6 /CS 片选输入端,低电平时,可向其发指令或读键盘。
ZLG7289使用SPI串行总线与微控制器接口。
SPI接口SPI串行总线是Motorola公司推出的一种同步串行接口。
通常它需要四条线,就可与微控制器之间实现全双工的同步串行通讯。
SPI串行总线主要有如下的特性:1.采用主从模式(Master Slave)架构,支持多Slave模式,一般只支持单Master,Master 控制时钟。
2.采用四线,实现全双工通信。
图1 SPI接口连线示意图SPI的数据传输时序模式SPI接口定义了四种数据传输的时序模式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三LED数码管动态显示及4 X4 键盘控制实验一、实验目的1.巩固多位数码管动态显示方法。
2.掌握行扫描法矩阵式按键的处理方法。
3.熟练应用AT89S52学习板实验装置,进一步掌握keil C51的使用方法。
二、实验内容使用AT89S52学习板上的4位LED数码管和4 X 4矩阵键盘阵列做多位数码管动态显示及行扫描法键盘处理功能实验。
用P0口做数据输出,利用P1做锁存器74HC573的锁存允许控制,编写程序使4位LED数码管按照动态显示方式显示一定的数字;按照行扫描法编写程序对4 X 4矩阵键盘阵列进行定期扫描,计算键值并在数码管上显示。
三、实验系统组成及工作原理1.4位LED数码管和4 X 4矩阵键盘阵列电路原理图2.多位数码管动态显示方式a b c d e f g dp com a b c d e f g dpcoma b c d e f g dpcoma b c d e f g dpcomD0IO(2)IO(1)说明4位共阴极LED动态显示3456数字的工作过程首先由I/O口(1)送出数字3的段选码4FH即数据01001111到4个LED共同的段选线上,接着由I/O口(2)送出位选码××××0111到位选线上,其中数据的高4位为无效的×,唯有送入左边第一个LED的COM端D3为低电平“0”,因此只有该LED的发光管因阳极接受到高电平“1”的g、d、c、b、a段有电流流过而被点亮,也就是显示出数字3,而其余3个LED因其COM端均为高电平“1”而无法点亮;显示一定时间后,再由I/O口(1)送出数字4的段选码66H即01100110到段选线上,接着由I/O 口(2)送出点亮左边第二个LED的位选码××××1011到位选线上,此时只有该LED的发光管因阳极接受到高电平“1”的g、f、c、b段有电流流过因而被点亮,也就是显示出数字4,而其余3位LED不亮;如此再依次送出第三个LED、第四个LED的段选与位选的扫描代码,就能一一分别点亮各个LED,使4个LED从左至右依次显示3、4、5、6。
3.4 X 4 矩阵式按键扫描处理程序行扫描法又称逐行零扫描查询法,即逐行输出行扫描信号“0”,使各行依次为低电平,然后分别读入列数据,检查此(低电平)行中是否有键按下。
如果读得某列线为低电平,则表示此(低电平)行线与此列线的交叉处有键按下,再对该键进行译码计算出键值,然后转入该键的功能子程序入口地址;如果没有任何一根列线为低电平,则说明此(低电平)行没有键按下。
接着进行下一行的“0”行扫描与列读入,直到8行全部查完为止,若无键按下则返回。
有时为了快速判断键盘中是否有键按下,也可先将全部行线同时置为低电平,然后检测列线的电平状态,若所有列线均为高电平,则说明键盘中无键按下,立即返回;若要有一列的电平为低,则表示键盘中有键被控下,然后再如上那样进行逐行扫描。
四、实验设备和仪器PC机一台AT89S52单片机学习板、下载线一套五、实验步骤1.按时实验要求编写源程序(实验前写)进行软件模拟调试。
2.软件调试好,连接硬件电路。
3.下载程序,进行硬件调试,观察数码管显示的情况,与设计的是否相同。
六、实验参考程序1. 4位LED数码管动态显示扫描程序ORG 0000HMAIN:MOV 30H,#0 ;定义4个字节空间,放置待显示数字“1、2、3、4”MOV 31H,#1MOV 32H,#2MOV 33H,#3MOV P0,#00HDISP:MOV R0,#30H ;把待显示数字首地址送给R0寄存器MOV R1,#4 ;把R1作为显示数码管位数计数器MOV R2,#0FEH ;把首位数码管的位选码暂存在R2寄存器中MOV DPTR,#TAB ;把段选码存储空间的首地址给DPTRLOOP1:MOV A,@R0 ;把待显示数字的段选码提取出来MOVC A,@A+DPTR;MOV P0,A ;把段选码放在数据总线上SETB P1.1 ;段选码锁存器的锁存允许置位NOPCLR P1.1MOV P0, R2 ;把位选码放在数据总线上SETB P1.2 ;位选码锁存器的锁存允许置位NOPCLR P1.2RL A ;下一位待显示数码管位选码预处理MOV R2,AINC R0ACALL DEL ;调用延时子程序DJNZ R1,LOOP1;4位没有显示完,转去显示下一位SJMP DISP ;4位显示完,再次进行新一轮的扫描/*定义段选码*/TAB:DB 0C0H;0DB 0F9H;1DB 0A4H;2DB 0B0H;3DB 099H;4DB 092H;5DB 082H;6DB 0F8H;7DB 080H;8DB 090H;9/*延时5ms子程序*/DEL:MOV R7,#10LOOP2:MOV R6,#250DJNZ R6,$DJNZ R7,LOOP2RETEND2. 键盘扫描及数码管动态显示程序ORG 0000HMAIN:MOV 30H,#10 ;定义4个字节空间,放置待显示数字MOV 31H,#10MOV 32H,#10MOV 33H,#10MOV P0,#00HMOV 40H,#0FFH;定义1个字节空间,放置键值KEY: ACALL KEYSCAN ;调用键盘全扫描子程序JNC LK1 ;有按键按下,转去延时去抖ACALL DISPLAY ;无按键按下,调用显示子程序AJMP KBZ ;送无键按下标志LK1: ACALL DISPLAY ;两次调用显示,实现延时功能ACALL DISPLAYACALL KEYSCAN ;延时去抖后,再次调用键盘全扫描子程序JNZ LK2 ;确实有按键按下,转入逐行扫描AJMP KBZ ;抖动,无按键/*逐行扫描程序模块*/LK2: MOV R7,#0EFH ;第一行行线置为0MOV R6,#00H ;行数寄存器COL0: MOV P3,R7 ;第一行行线置为0MOV A,P3 ;读入列线状态JB ACC.0,COL1 ;若不是第一列按键按下,转查第二列MOV A,#01H ;若是第一列按键按下,则记下列值为1AJMP LKP ;转去计算键值COL1: JB ACC.1,COL2;若不是第二列按键按下,转查第三列MOV A,#02H ;若是第二列按键按下,则记下列值为2AJMP LKP ;转去计算键值COL2: JB ACC.2,COL3;若不是第三列按键按下,转查第四列MOV A,#03H ;若是第三列按键按下,则记下列值为3AJMP LKP ;转去计算键值COL3: JB ACC.3,NEXTR ;若不是第四列按键按下,转去扫描下一行MOV A,#04H ;若是第四列按键按下,则记下列值为4AJMP LKP ;转去计算键值/*键值计算程序键值=行值×4+列值*/LKP: MOV R5,A;MOV A,R6MOV B,#04HMUL ABADD A,R5MOV 40H,AMOV A,40HMOV B,#10 ;DIV ABMOV 32H,AMOV 33H,BACALL DISPLAY ;AJMP KEY/*下一行扫描值预处理*/NEXTR: INC R6;MOV A,R7 ;JNB ACC.7,KBZ ;RL A ;MOV R7,AAJMP COL0KBZ: MOV 40H,#0FFH;若无按键按下,则用FF表示键值AJMP KEY/*键盘全扫描子程序*/KEYSCAN:MOV P3,#0FH ;NOPMOV P3,#0FH;MOV A,P3CPL AANL A,#0FHRET/*LED数码管显示键值子程序*/DISPLAY:MOV R0,#30H;MOV R1,#4;MOV R2,#0FEH;MOV DPTR,#TAB;LOOP1:MOV A,@R0;把待显示数字的段选码提取出来MOVC A,@A+DPTR;MOV P0,A;把段选码放在数据总线上SETB P1.1;锁存器的锁存允许置位NOPCLR P1.1MOV A,R2;把段选码放在数据总线上MOV P0,ASETB P1.2;NOPCLR P1.2RL AMOV R2,AINC R0ACALL DELDJNZ R1,LOOP1RET/*定义段选码*/TAB:DB 0C0H;0DB 0F9H;1DB 0A4H;2DB 0B0H;3DB 099H;4DB 092H;5DB 082H;6DB 0F8H;7DB 080H;8DB 090H;9DB 0FFH;NO /*延时5ms子程序*/ DEL:MOV R4,#10 LOOP2:MOV R3,#250DJNZ R3,$DJNZ R4,LOOP2RETEND。