上篇:DSC12887时钟的驱动程序
下篇:24C01的IIC 读写的c51程序

键盘接口软件设计

 

软件设计要考虑以下3部分内容:键盘缓冲区的设置;初始化程序;中断服务程序。

    1、键盘缓冲区

    键盘缓冲区地址为:30H-4FH,共32个字节。使用R1作为缓冲区放数指针,R7为取数指针。缓冲区为环形。放满后将R1置为30H,再从头放数;当放数指针追上取数指针时,停止放数。当取数指针追上放数指针时,停止取数。

    2、初始化程序

    包括8052的初始化和键盘的初始化。程序清单如下:

   MOV IE,#0H  ;关中断

   CLR F0 ;F0=0为类型1键盘;F0=1为类型2键盘

   MOV R0,#0H

   MOV R1,#30H ;置缓冲区放数指针起始值

   MOV R2,#0H

   MOV R3,#0H

   MOV R4,#0H

   MOV R5,#0H

   MOV R6,#0H

   MOV R7,#2FH ;置缓冲区取数指针起始值

   MOV B,#0H

   MOV TCON,#0H     ;置INT0为电平触发方式

KEYINT:   ;主中断服务程序

   MOV IE,#0H  ;关中断

   MOV A,R7    ;取数指针放到A

   XRL A,R1    ;与放数指针比较

   JZ KL4 ;放数指针=取数指针则退出

   INC R0 ;脉冲计数

KL1:    JNB P3.2,KL1     ;等待时钟脉冲为“1”

   CJNE R0,#01H,K12 ;首次收到脉冲则判断键盘类型

   MOV C,P1.0

   KL2:JB F0,KL3    ;根据F0的值转不同服务程序

   MOV F0,C    ;保存键盘类型

   MOV C,P1.0  ;采用数据

   LCALL INTB  ;类型2键盘中断服务程序

   MOV IE,#81H ;开中断

   RETI

KL3:    MOV C,P1.0  ;采样数据

   LCALL INTA  ;类型1键盘中断服务程序

KL4:    MOV IE,#81H ;开中断

   RETI

    限于篇幅,以下公列出类型1键盘中断服务子程序的处理程序,类型2键盘中断服务子程序除需要进行奇校验及计数脉冲个数不同外,流程基本一致。

    类型1键盘中断服务子程序:

INTA:

   MOV A,R2    ;数据位移入R2和R3中

   RRC A

   MOV R2,A

   MOV A,R3

   RRC A

   MOV R3,A

   CJNE R0,#0AH,INTA1    ;计数脉冲不为10退出,否则转换

   CLR C

   MOV A,R3

   RLC A

   MOV A,R2

   RLC A

   MOV R5,A    ;数据存入R5

   ANL A,#80H

   JNZ INTA3   ;是否为放键码,是则退出

   MOV A,R5

   MOV DPTR,#1000H  ;1000H为码表转换区起址

   MOVC A,@A+DPTR   ;扫描码转换为ASCII

   MOV @R1,A   ;ASCII码存入键盘缓冲区

   INC R1

   CJNE R1,#50H,INTA3

   MOV R1,#30H ;缓冲区满则R1=30H

INTA3:  CJNE R7,#2FH,INT4

   MOV R7,#30H

INTA4:  MOV R0,#0H  ;脉冲计数清零

   MOV R5,#0H

INTA2:  MOV R2,#0H

   MOV R3,#0H

INTA1:  RET

   ORG 1000H   ;码表转换区

   ORG 1002H   ;这里仅列出0-9的转换表

   DB 31H,32H,33H,34H,35H,36H,37H,38H,39H,30H