单片机键盘输入程序

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

这是读取键盘的子程序

主要内容为:如何定义位,如何得到按键状态,防止键盘干扰的方法

以及如何处理读入的键值

思路:首先在某一引脚输出一个电平,然后读入引脚的电平,如果刚好相反

那么可能有按键发生,但是不排除干扰,为了防止干扰,需要软件延时20ms 应该说键盘输入是单片机外部指令输入的重要途径,因此如何设计键盘以及键盘的工作原理、读键盘的方法、键盘的抗干扰设计等在单电能机系统设计中占有重要地位。这个例子在系统硬件的基础上设计了软件查询程序、软件延时程序(防止干扰),大致讲述了一种查询式键盘的工作原理与读取方式。

下面是汇编语言写的单片机键盘输入程序

**************************************************

led1 bit p1.0;LED 显示位定义

led2 bit p1.1

led3 bit p1.2

led4 bit p1.3

led5 bit p1.4

led6 bit p1.5

led7 bit p1.6

led8 bit p1.7

s1 bit p0.0 ;数码管位定义

s2 bit p0.1

s3 bit p0.2

s4 bit p0.3

s5 bit p0.4

s6 bit p0.5

s7 bit p0.6

s8 bit p0.7

led_data equ p2;数码管显示数据定义

key1 bit p3.5 ;按键引脚定义

key2 bit p3.6;

key3 bit p3.7;

key equ 46h;按键寄存单元

org 00h

jmp main

org 030h

main:mov sp,#30h;首先定义

lcall REST;初始化子程序

lp:lcall pro_key;调用键盘查询子程序

lcall KEYPR ;用来显示所查询到的键值jmp lp;反复调用,不断查询

REST:

mov a,#00h

mov b,#00h

mov p0,#0

mov p1,0ffh ;

mov p2,#0

mov key,#00h

mov p2,#255

clr beep

RET

KEYPR:

mov a,key;键值在累加器KEY中

jz PROEND ;如果A= 0,表示没有按键,返回cjne a,#1,k1;A= 1 ,用户按了第一个键mov a,#1 ;处理 A = 1的情况

mov dptr,#tab_nu ;查表

movc a,@a+dptr

mov led_data,a ;显示"1"

setb s1 ;在第一位

clr s2;其余两位不显示

clr s3

jmp PROEND;处理完成,子程序返回

;以下分别处理KEY = 2,3 的情况

k1:cjne a,#2,k2

mov a,#2

mov dptr,#tab_nu

movc a,@a+dptr

mov led_data,a

clr s1

setb s2

clr s3

jmp PROEND

k2:cjne a,#3, PROEND

mov a,#3

mov dptr,#tab_nu

movc a,@a+dptr

mov led_data,a

clr s1

clr s2

setb s3

PROEND:ret

**** 本内容跟帖回复才可浏览*****

;************ 定时20 ms *************

delay20ms: push psw ;保存原来的寄存器单元

clr psw.3;设置新的寄存器

clr psw.4;

mov r0,#2;延时参数1

mov r1,#250;延时参数2

mov r2,#2;延时参数3

dl1:djnz r0,dl1 ;延时循环1

mov r0,#250 ;重新设置循环数据

dl2:djnz r1,dl1 ;开始第二道循环

mov r0,#240;

mov r1,#248;

dl3:djnz r2,dl1;第三道循环

nop;修正定时精度

pop psw ;恢复原来的寄存器组

ret ;返回

;*********** end *******************

;这是数字显示表格,其中带小数点的数字比不带小数点的数字大16

; 比如0 的显示代码为0;那么0.的显示代码为16;如此类推

tab_nu:

db 0c0h, 0f9h, 0a4h, 0b0h, 99h , 92h , 82h, 0f8h ;数字0-7 不带小数点代码

db 80h , 90h, 88h , 83h , 0c6h, 0a1h, 86h, 8eh;数字8-f 不带小数点代码

db 40h , 79h, 24h , 30h , 19h , 12h , 02h, 78h ;数字0-7 带小数点代码

db 00h , 10h, 08h , 03h , 46h , 21h , 06h, 0eh ;数字8-f 带小数点代码

end;告诉编译器本程序到此结束,一定需要加上,否则编译通不过。

消除干扰,然后,等待用户释放,否则,可能重复的到某种结果,发生意外情况

相关文档
最新文档