|
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
|
|