|
A机代码:;端口引脚定义区LCD_RS BIT P1.0 ;1602数据命令选择端口
LCD_RW BIT P1.1 ;1602读写选择端口
LCD_EN BIT P1.2 ;1602使能端口
LCD_DATA EQU P0 ;1602数据端口
;变量声明区
ALL_FLAG EQU 20H ;标志位
LCD_FLAG EQU ALL_FLAG.7 ;1602读忙标志位
LCD_DAT EQU 30H ;1602数据命令字
DELAYED EQU 31H ;延时字
G EQU 50H
S EQU 51H
G_R EQU 59H
S_R EQU 58H
DDATA_R EQU 57H
DDATA EQU 56H ;延时字
org 0000H
LJMP start
org 0003H ;外部中断0 中断入口
LJMP EXT0
ORG 0023H
LJMP UARTInterrupt
org 0030H
start:
MOV SP,#60H
LCALL LCD_INIT
LCALL Init_Exit
LCALL InitUART
LOOP:
MOV LCD_DAT,#80H
ACALL LCD_W_CMD
MOV LCD_DAT,#73H
ACALL LCD_W_DATA
MOV LCD_DAT,#65H
ACALL LCD_W_DATA
MOV LCD_DAT,#6eH
ACALL LCD_W_DATA
MOV LCD_DAT,#64H
ACALL LCD_W_DATA
MOV LCD_DAT,#3AH
ACALL LCD_W_DATA
MOV LCD_DAT,S
ACALL LCD_W_DATA
MOV LCD_DAT,G
ACALL LCD_W_DATA
LCALL ASCII
LCALL KEY
AJMP LOOP
Init_Exit:
MOV IP ,#00010100B ;配置优先级
MOV IE,#10010101B ;中断允许
MOV TCON,#01000101B ;配置触发条件
RET
EXT0:
POP ACC
POP PSW
LCALL SendOneByte
CALL WaitSendFinish
PUSH ACC
PUSH PSW
RETI
InitUART:
MOV TMOD,#20H
MOV SCON,#40H
MOV TH1,#0FDH
MOV TL1,TH1
MOV PCON,#80H
SETB EA
SETB ES
SETB TR1
SETB REN
RET
UARTInterrupt:
JB RI,IsUART_Receive
CLR TI
RETI
IsUART_Receive:
CLR RI
PUSH ACC
MOV A,SBUF
MOV DDATA_R,A
POP ACC
RETI
SendOneByte:
CLR ES
CLR TI
MOV A,DDATA
MOV C, P
MOV TB8, C ;校验位送到TB8
MOV SBUF, A
WaitSendFinish:
JB TI,WaitSendFinish
CLR TI
SETB ES
RET
LCD_R_DATA:
MOV LCD_DATA,#0FFH
LCD_BUSY: CLR LCD_RS
SETB LCD_RW
NOP
SETB LCD_EN
NOP
MOV Acc,LCD_DATA
MOV C,Acc.7
MOV LCD_FLAG,C
CLR LCD_EN
NOP
JB LCD_FLAG,LCD_BUSY
RET
LCD_W_DATA:
LCALL LCD_R_DATA
SETB LCD_RS
CLR LCD_RW
NOP
MOV LCD_DATA,LCD_DAT
SETB LCD_EN
NOP
CLR LCD_EN
RET
LCD_W_CMD:
LCALL LCD_R_DATA
CLR LCD_RS
CLR LCD_RW
NOP
MOV LCD_DATA,LCD_DAT
SETB LCD_EN
NOP
CLR LCD_EN
RET
LCD_CMD:
CLR LCD_RS
CLR LCD_RW
NOP
MOV LCD_DATA,LCD_DAT
SETB LCD_EN
NOP
CLR LCD_EN
RET
LCD_INIT:
MOV DELAYED,#30
LCALL DELAY_MS
MOV LCD_DAT,#38H
LCALL LCD_CMD
MOV DELAYED,#10
LCALL DELAY_MS
MOV LCD_DAT,#38H
LCALL LCD_CMD
MOV DELAYED,#10
LCALL DELAY_MS
MOV LCD_DAT,#38H
LCALL LCD_CMD
MOV DELAYED,#10
LCALL DELAY_MS
MOV LCD_DAT,#038H
LCALL LCD_W_CMD
MOV LCD_DAT,#08H
LCALL LCD_W_CMD
MOV LCD_DAT,#01H
LCALL LCD_W_CMD
MOV LCD_DAT,#06H
LCALL LCD_W_CMD
MOV LCD_DAT,#0CH
LCALL LCD_W_CMD
RET
KEY:
ACALL KEY0_1 ;调用KEY0_1,判断是否有键按下
JB F0,$-2 ;无键按下,转ACALL KEY0_1,继续扫描
MOV A,R1 ;R1为取码指针
MOV DDATA,R1
RET
KEY0_1: ;按键检测子程序
SETB F0 ;设F0=1
MOV R3,#0F7H ;行扫描指针初值(P2.3=0)
MOV R1,#00H ;取码指针初值
L2:
MOV A,R3 ;载入扫描指针
MOV P2,A ;输出至P2,开始扫描为0的一行
NOP
MOV A,P2 ;读入P2
SETB C
MOV R5,#4 ;检测P2.7~P2.4,共4 列
L3: ;检测4列
RLC A ;左移一位(P2.7~P2.4)
JNC KEY1 ;检测到C=0,表示被按下
INC R1 ;无键按下则取码指针加1
DJNZ R5,L3 ;4列检测完毕?
MOV A,R3 ;载入扫描指针
SETB C
RRC A ;扫描为0的下一行,
MOV R3,A ;存回R3扫描指针寄存器
JC L2 ;C=0,行扫描完毕
MOV LCD_DAT,#0C0H ;换行
ACALL LCD_W_CMD
MOV LCD_DAT,#72H
ACALL LCD_W_DATA
MOV LCD_DAT,#65H
ACALL LCD_W_DATA
MOV LCD_DAT,#63H
ACALL LCD_W_DATA
MOV LCD_DAT,#65H
ACALL LCD_W_DATA
MOV LCD_DAT,#69H
ACALL LCD_W_DATA
MOV LCD_DAT,#76H
ACALL LCD_W_DATA
MOV LCD_DAT,#65H
ACALL LCD_W_DATA
MOV LCD_DAT,#64H
ACALL LCD_W_DATA
MOV LCD_DAT,#3AH
ACALL LCD_W_DATA
MOV LCD_DAT,S_R
ACALL LCD_W_DATA
MOV LCD_DAT,G_R
ACALL LCD_W_DATA
LCALL ASCII2
RET
KEY1:
CLR F0 ;F0清0 ,表示按键按下
RET
ASCII:
MOV A,R1 ;显示秒
MOV B,#10
DIV AB
ADD A, #48
MOV S,A
MOV A,B
ADD A, #48
MOV G,A
RET
ASCII2:
MOV A,DDATA_R
MOV B,#10
DIV AB
ADD A, #48
MOV S_R,A
MOV A,B
ADD A, #48
MOV G_R,A
RET
DELAY_MS:
MOV R7,DELAYED
D19: MOV R6,#0F8H
D20: DJNZ R6,D20
DJNZ R7,D19
RET
DELAY_US:
MOV R7,A
DU1:
DJNZ R7,DU1
RET
end
B机代码:;端口引脚定义区
LCD_RS BIT P1.0 ;1602数据命令选择端口
LCD_RW BIT P1.1 ;1602读写选择端口
LCD_EN BIT P1.2 ;1602使能端口
LCD_DATA EQU P0 ;1602数据端口
;变量声明区
ALL_FLAG EQU 20H ;标志位
LCD_FLAG EQU ALL_FLAG.7 ;1602读忙标志位
LCD_DAT EQU 30H ;1602数据命令字
DELAYED EQU 31H ;延时字
G EQU 50H
S EQU 51H
G_R EQU 59H
S_R EQU 58H
DDATA_R EQU 57H
DDATA EQU 56H ;延时字
org 0000H
LJMP start
org 0003H ;外部中断0 中断入口
LJMP EXT0
ORG 0023H
LJMP UARTInterrupt
org 0030H
start:
MOV SP,#60H
LCALL LCD_INIT
LCALL Init_Exit
LCALL InitUART
LOOP:
MOV LCD_DAT,#80H
ACALL LCD_W_CMD
MOV LCD_DAT,#73H
ACALL LCD_W_DATA
MOV LCD_DAT,#65H
ACALL LCD_W_DATA
MOV LCD_DAT,#6eH
ACALL LCD_W_DATA
MOV LCD_DAT,#64H
ACALL LCD_W_DATA
MOV LCD_DAT,#3AH
ACALL LCD_W_DATA
MOV LCD_DAT,S
ACALL LCD_W_DATA
MOV LCD_DAT,G
ACALL LCD_W_DATA
LCALL ASCII
LCALL KEY
AJMP LOOP
Init_Exit:
MOV IP ,#00010100B ;配置优先级
MOV IE,#10010101B ;中断允许
MOV TCON,#01000101B ;配置触发条件
RET
EXT0:
POP ACC
POP PSW
LCALL SendOneByte
CALL WaitSendFinish
PUSH ACC
PUSH PSW
RETI
InitUART:
MOV TMOD,#20H
MOV SCON,#40H
MOV TH1,#0FDH
MOV TL1,TH1
MOV PCON,#80H
SETB EA
SETB ES
SETB TR1
SETB REN
RET
UARTInterrupt:
JB RI,IsUART_Receive
CLR TI
RETI
IsUART_Receive:
CLR RI
PUSH ACC
MOV A,SBUF
MOV DDATA_R,A
POP ACC
RETI
SendOneByte:
CLR ES
CLR TI
MOV A,DDATA
MOV C, P
MOV TB8, C ;校验位送到TB8
MOV SBUF, A
WaitSendFinish:
JB TI,WaitSendFinish
CLR TI
SETB ES
RET
LCD_R_DATA:
MOV LCD_DATA,#0FFH
LCD_BUSY: CLR LCD_RS
SETB LCD_RW
NOP
SETB LCD_EN
NOP
MOV Acc,LCD_DATA
MOV C,Acc.7
MOV LCD_FLAG,C
CLR LCD_EN
NOP
JB LCD_FLAG,LCD_BUSY
RET
LCD_W_DATA:
LCALL LCD_R_DATA
SETB LCD_RS
CLR LCD_RW
NOP
MOV LCD_DATA,LCD_DAT
SETB LCD_EN
NOP
CLR LCD_EN
RET
LCD_W_CMD:
LCALL LCD_R_DATA
CLR LCD_RS
CLR LCD_RW
NOP
MOV LCD_DATA,LCD_DAT
SETB LCD_EN
NOP
CLR LCD_EN
RET
LCD_CMD:
CLR LCD_RS
CLR LCD_RW
NOP
MOV LCD_DATA,LCD_DAT
SETB LCD_EN
NOP
CLR LCD_EN
RET
LCD_INIT:
MOV DELAYED,#30
LCALL DELAY_MS
MOV LCD_DAT,#38H
LCALL LCD_CMD
MOV DELAYED,#10
LCALL DELAY_MS
MOV LCD_DAT,#38H
LCALL LCD_CMD
MOV DELAYED,#10
LCALL DELAY_MS
MOV LCD_DAT,#38H
LCALL LCD_CMD
MOV DELAYED,#10
LCALL DELAY_MS
MOV LCD_DAT,#038H
LCALL LCD_W_CMD
MOV LCD_DAT,#08H
LCALL LCD_W_CMD
MOV LCD_DAT,#01H
LCALL LCD_W_CMD
MOV LCD_DAT,#06H
LCALL LCD_W_CMD
MOV LCD_DAT,#0CH
LCALL LCD_W_CMD
RET
KEY:
ACALL KEY0_1 ;调用KEY0_1,判断是否有键按下
JB F0,$-2 ;无键按下,转ACALL KEY0_1,继续扫描
MOV A,R1 ;R1为取码指针
MOV DDATA,R1
RET
KEY0_1: ;按键检测子程序
SETB F0 ;设F0=1
MOV R3,#0F7H ;行扫描指针初值(P2.3=0)
MOV R1,#00H ;取码指针初值
L2:
MOV A,R3 ;载入扫描指针
MOV P2,A ;输出至P2,开始扫描为0的一行
NOP
MOV A,P2 ;读入P2
SETB C
MOV R5,#4 ;检测P2.7~P2.4,共4 列
L3: ;检测4列
RLC A ;左移一位(P2.7~P2.4)
JNC KEY1 ;检测到C=0,表示被按下
INC R1 ;无键按下则取码指针加1
DJNZ R5,L3 ;4列检测完毕?
MOV A,R3 ;载入扫描指针
SETB C
RRC A ;扫描为0的下一行,
MOV R3,A ;存回R3扫描指针寄存器
JC L2 ;C=0,行扫描完毕
MOV LCD_DAT,#0C0H ;换行
ACALL LCD_W_CMD
MOV LCD_DAT,#72H
ACALL LCD_W_DATA
MOV LCD_DAT,#65H
ACALL LCD_W_DATA
MOV LCD_DAT,#63H
ACALL LCD_W_DATA
MOV LCD_DAT,#65H
ACALL LCD_W_DATA
MOV LCD_DAT,#69H
ACALL LCD_W_DATA
MOV LCD_DAT,#76H
ACALL LCD_W_DATA
MOV LCD_DAT,#65H
ACALL LCD_W_DATA
MOV LCD_DAT,#64H
ACALL LCD_W_DATA
MOV LCD_DAT,#3AH
ACALL LCD_W_DATA
MOV LCD_DAT,S_R
ACALL LCD_W_DATA
MOV LCD_DAT,G_R
ACALL LCD_W_DATA
LCALL ASCII2
RET
KEY1:
CLR F0 ;F0清0 ,表示按键按下
RET
ASCII:
MOV A,R1 ;显示秒
MOV B,#10
DIV AB
ADD A, #48
MOV S,A
MOV A,B
ADD A, #48
MOV G,A
RET
ASCII2:
MOV A,DDATA_R
MOV B,#10
DIV AB
ADD A, #48
MOV S_R,A
MOV A,B
ADD A, #48
MOV G_R,A
RET
DELAY_MS:
MOV R7,DELAYED
D19: MOV R6,#0F8H
D20: DJNZ R6,D20
DJNZ R7,D19
RET
DELAY_US:
MOV R7,A
DU1:
DJNZ R7,DU1
RET
end
|
|