附录C 电路图
第31页,共37页
附录D 源程序
RS BIT P3.5 RW BIT P3.6 E BIT P3.7 ORG 00H ;主程序其始地址 JMP START ;跳至主程序
ORG 0BH ;TIMER0中断其始地址
JMP TIM0
;跳至TIMER0中断子程序
START: MOV P1,#01H ;清除屏幕
CALL ENABLE MOV P1,#38H ;功能设定(8位,2行,5×7点矩阵) CALL ENABLE MOV P1,#08H ;显示器ON,光标ON,闪烁ON
CALL ENABLE MOV P1,#06H ;光标右移
CALL ENABLE MOV P1,#80H CALL ENABLE MOV SCON,#50H ;UART工作在MODE1,SM1=1,REN=1
MOV TMOD,#21H
;设定TIMER0工作在MODE1,TIMER1工作在MODE2
MOV IE,#10000010B ;中断使能 MOV TH1,#0F3H ;波特率2400 MOV TL1,#0F3H
SETB TR0 ;启动TIMER0
SETB
TR1
;启动TIMER1
D1: JB RI,UART ;检测SCON的RI是否为1,是则表示接收到
CALL KEY ;调用KEY,判断是否有按下? CLR EA ;中断屏蔽 JB F0,D1 ;没按则F0=1,没按则F0=0
MOV A,22H
;有按则将取码指针暂存地址的值载入A
RL A
;乘2
MOV
DPTR,#TABLE ;至TABLE取码,取T的值
第32页,共37页
MOVC A,@A+DPTR; MOV MOV MOV RL INC MOVC MOV
MOV
D2: JB CALL SETB JB
JMP
UART:
MOV MOV CALL CALL CALL CLR
RET
KEY:
SETB MOV
MOV
D3: MOV MOV MOV MOV CLR CPL
MOV
TH0,A ;取到的高位字节存入TH0 21H,A ;取到的高位字节存入(21H) A,22H
;再载入取码指针
A ;乘2 A
;加1
A,@A+DPTR ;至TABLE取相对的低位字节计数值 TL0,A ;取到的高位字节存入TL0 20H,A
;取到的高位字节存入(20H)
RI,UART ;检测SCON的RI是否为1,是则表示接收到
KEY ;调用KEY,判断是否有键按下 EA; ;中断使能 F0,D1
;有按否?
D2;
;有则跳至D2
A,SBUF ;将SBUF的值载入ACC
P1,#0CH ;显示器ON,光标OFF,闪烁OFF
ENABLE; WRITE2 ;调用显示子程序
CHECK
;判断光标是否在屏幕最后位置 RI
;清除RI=0
F0 ;设F0=1
R3,#0F7H ;扫描初值(P2.3=0) R1,#00H
;取码指针初值
A,R3 ;载入扫描指针
P2,A ;输出至P2,开始扫描行 A,P2
;读入P2
R4,A C C
;令C=1
R5,#04H
;检测列
第33页,共37页
D4: RLC JNC INC DJNZ MOV CLR CPL RRC MOV JC
RET
KEYIN: MOV CLR
MOV
D5: MOV DJNZ
DJNZ
D6: MOV XRL JZ MOV CALL MOV MOV MOVC MOV MOV CALL CALL
RET
TIM0:
A
;左移一位(P2.7~P2.4) KEYIN
;检测行C=0,表示被按
R1 ;没按则取码指针加1 R5,D4
;4列检测完毕了?
A,R3 C C ;C=1
A
;扫描下一行,即下一行为0 R3,A
;存回R3扫描指针寄存器
D3
;C=0表示扫描完毕
22H,R1 ;取码指针存入22H地址
F0
;令F0=0
R7,#10
;消除抖动
R6,#248 R6,$ R7,D5
A,P2 ;按钮放开否?
A,R4 D6
P1,#0FH ;显示器ON,光标ON,闪烁ON
ENABLE A,R1
;至TABLE1取码
DPTR,#TABLE1 A,@A+DPTR SBUF,A ;载入SBUF发送出去 P1,A
;LCD显示
WRITE2 CHECK
;判断光标是否在屏幕最后位置第34页,共37页
PUSH PUSH MOV MOV CPL POP POP
RETI
CHECK:
MOV CLR SETB CLR NOP SETB JB MOV ANL CJNE MOV
CALL
A3: RET CLEAR: MOV CALL MOV CALL
RET
ENABLE:
CLR CLR CLR CALL SETB
RET
ACC ;将A的值暂存于堆栈 PSW
;将PSW的值暂存于堆栈
TL0,20H ;重设计数值
TH0,21H P3.4
;将P3.4反相
PSW ;至堆栈取回PSW的值 ACC
;至堆栈取回A的值
P1,#0FFH ;令P1=FFH
RS ;RS=0,R/W=1,读BUSY FLAG地址计数器
RW E
E
P1.7,CHECK ;BUSY FLAG=0? A,P1
;是则读入内部地址(光标) A,#7FH ;内部地址DB7无效
A,#48,A3 ;内部地址第2行最后一个字地址为4F P1,#80H ;是则令光标回到80H位置
ENABLE
P1,#01H ;清屏
ENABLE P1,#80H ;令光标回到第一行第一个字位置 ENABLE
RS ;RS=0,R/W=0写入指令组
RW E DELAY E
第35页,共37页