单片机89C52行列式键盘扫描程序(汇编)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验八键盘扫描显示实验

所需软硬件:

Keil

STC-ISP

MCS-51 89C52实验箱

程序清单:

基于汇编语言

//连线P0接8列(同时也是数码管的位选线)高电平选中某位。P3低两位接行P1接数码管(段选线)低电平选中某段亮。

ORG 0000H

LJMP MAIN

MAIN:

MOV 30H,#00H

MOV 31H,#00H

MOV 32H,#00H

MOV 33H,#00H

MOV 34H,#00H

MOV 35H,#00H

BEGIN:

ACALL SCAN

ACALL CHECK

ACALL DISP

SJMP BEGIN

//子程序SCAN 全扫描2次扫描去抖

SCAN:;全扫描

MOV R0,#00H;去抖,扫描2次计数标志

MOV A,#00H

MOV P0,A;送列扫描码

LOOP:

MOV A,P3;回读行信号

ANL A,#03H;只取低两位

INC R0

CJNE A,#03H,K1

CLR F0;无键,置标志位为0

K1:

NOP

NOP

CJNE R0,#02H,LOOP;去抖,扫描2次

SETB F0;有键,置标志位为1

RET

//子程序CHECK 逐列扫描确定键码

CHECK:

MOV R1,#0FEH ;开始逐列扫描,从第0列开始

MOV R4,#00H;记录列号

MOV R5,#00H;记录行号

MOV A,R1

PUSH ACC;压栈保留第0列扫描码

LOOP1:

MOV P0,A;送列扫描码

MOV A,P3

ANL A,#03H

CJNE A,#03H,K2;有键转K2确定为哪一行

POP ACC;无键扫描下一列

RL A

INC R4

CJNE R4,#08H,LOOP1 ; 是否扫描进行到最后一列

RET

K2:

DEC SP;为保证堆栈平衡

CJNE A,#00H,K3;分支判断,看是否为第一行

SJMP OVER

K3:

MOV A, R5

ADD A,#08H

MOV R5,A;不是第一行,就是第二行,行码加8 OVER:

MOV A,R4

ADD A,R5;行码+列码=键码

PUSH ACC;键码入栈保护

NOP

NOP

LCALL SCAN;扫描看手是否松开

CJNE A,#03H,OVER ;A=03H,表示手未松开,继续扫描

POP ACC;手松开,键码出栈

RET

//子程序DISP 键码分离送数码管显示

DISP:

JNB F0,LOOP3;无键不分离键码

MOV B,#10;有键,要进行十位和个位的分离

DIV AB

MOV 34H,A;A为十位

MOV 35H,B;B为个位

MOV R0,#30H;送显示缓冲首地址

MOV R2,#01H;送位选信号,从最低位开始亮

LOOP3:

MOV A,#0FFH

MOV P1,A;段选:送灭码

MOV A,R2

MOV P0,A;送位选信号

MOV A,@R0;送显示缓冲数据

MOV DPTR,#TAB;查表求字形码

MOVC A,@A+DPTR

MOV P0,A;送段选

ACALL DELAY1MS;延时以保持稳定

INC R0;取下一个数

MOV A,R2

JB ACC.5,EXIT;判断位选是否送到最高位

RL A ;左移选下一个位。

MOV R2,A;

AJMP LOOP3

EXIT:

RET

//子程序DELAY1MS

DELAY1MS:

MOV R7,#0FFH

DJNZ R7,$

RET

TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0AH,86H,8EH END

相关文档
最新文档