2013年9月21日 星期六

KeyScan with LCD Display (8051 ASM)

;*******************************************************
; KeyScan with LCD Display
;
;CPU: STC90C54RD+
;XTAL: 11.0592MHz
;PCB: HC6800E
;File: KEYSCAN_LCD.asm
;Date: 13_July_2011
;*******************************************************
;LCD Function Pin
ENABLE BIT P2.7 ;P3.5
RW BIT P2.5 ;P3.6
RS BIT P2.6 ;P3.7
;
DQBUF EQU 41H

START           EQU     100H

          ORG     0H
          AJMP START


;**************************************
                ORG     START
MOV R5,#50
ST1:
ACALL DELAY20
DJNZ R5,ST1
ACALL CLR_RAM
MOV P3,#0FFH ;Input Mode
ACALL LCD_INTIAL
MOV DPTR,#LOGO
ACALL PRT_LOGO
MOV SP,#15
MOV A,#0C0H
ACALL WRINS
;
;**************************************
GET_DA:
CLR PSW.5 ;Reset the press key flag
ACALL KSCAN
MOV A,20H
CJNE A,#0FH,S2A
AJMP GET_DA
S2A:
JNB PSW.5,S2B
MOV DQBUF,20H
ACALL DELAY20
S2B:
CLR PSW.5
ACALL KSCAN
JB PSW.5,S2B
ACALL DELAY20
MOV A,DQBUF
ACALL HEX_ASCII
ACALL WRDATA
AJMP GET_DA
;
;***************************************
KSCAN:
JB PSW.5,S3
MOV R1,#07FH
MOV R4,#04H
MOV A,R1
MOV R2,#00H
COLLUM:
MOV P3,A
MOV R3,#03H
MOV A,P3
JUG2:
ANL A,#00001111B
MOV 20H,A
;
JUG:
JB ACC.1,NT1
MOV DQBUF,R2
SETB PSW.5 ;User Bit¸m1
RET
NT1:
INC R2
RR A
DJNZ R3,JUG
MOV A,R1
RR A
MOV R1,A
DJNZ R4,COLLUM
RET
S3:
RET
;
;*************************************
PRT_LOGO:
MOV A,#80H
ACALL WRINS
PRT_LOGO1:
CLR A
MOVC A,@A+DPTR
CJNE A,#10H,PRT_LOGO2
RET
PRT_LOGO2:
ACALL WRDATA
INC DPTR
AJMP PRT_LOGO1
;
;*************************************
HEX_ASCII:
CJNE A,#0,HEX1
MOV A,#23H ;"#"
RET
HEX1:
CJNE A,#1,HEX2
MOV A,#30H ;"0"
RET
HEX2:
CJNE A,#2,HEX3
MOV A,#2AH ;"*"
RET
HEX3:
CJNE A,#3,HEX4
MOV A,#39H ;"9"
RET
HEX4:
CJNE A,#4,HEX5
MOV A,#38H ;"8"
RET
HEX5:
CJNE A,#5,HEX6
MOV A,#37H ;"7"
RET
HEX6:
CJNE A,#6,HEX7
MOV A,#36H ;"6"
RET
HEX7:
CJNE A,#7,HEX8
MOV A,#35H ;"5"
RET
HEX8:
CJNE A,#8,HEX9
MOV A,#34H ;"4"
RET
HEX9:
CJNE A,#9,HEX10
MOV A,#33H ;"3"
RET
HEX10:
CJNE A,#0AH,HEX11
MOV A,#32H ;"2"
RET
HEX11:
CJNE A,#0BH,HEX12
MOV A,#31H ;"1"
RET
HEX12:
RET
;*************************************
LCD_INTIAL:
;Power On
ACALL DELAY20
MOV A,#30H
ACALL WRINS_NOCHK
ACALL DELAY20
MOV A,#30H
ACALL WRINS_NOCHK
ACALL DELAY5
MOV A,#30H
ACALL WRINS_NOCHK
ACALL DELAY1
;LCD Intial
MOV A,#38H ;Function
ACALL WRINS
MOV A,#08H ;Display OFF
ACALL WRINS
MOV A,#01H ;Clean Screen
ACALL WRINS
MOV A,#06H ;Input Mode
ACALL WRINS
MOV A,#0CH ;Display Mode
ACALL WRINS
;
RET
;********************************
WRINS:
;RS=0,R/W=0,E=0
ACALL CHK_BUSY
WRINS_NOCHK:
CLR RS
CLR RW
CLR ENABLE
NOP
WRINS0:
SETB ENABLE ;E=1
MOV P0,A
CLR ENABLE ;E=0
ORL P0,#0FFH ;For Check Busy Flag
ACALL DELAY5
RET
;
;*************************************
CHK_BUSY:
CLR RS
SETB RW
SETB ENABLE
JB P0.7,$
CLR ENABLE
RET
;*************************************
WRDATA:
;RS=1,R/W=0,E=0
SETB RS
CLR RW
CLR ENABLE
NOP
WRDATA1A:
SETB ENABLE ;E=1
MOV P0,A
ACALL DELAY200
CLR ENABLE ;E=0
CLR RS
CLR WR
RET
;
RDATA:
;RS=0,R/W=1,E=0
ORL P0,#11111111B ;Input Mode
SETB RS
SETB RW
CLR ENABLE
NOP
RDATA1A:
SETB ENABLE ;E=1
ACALL DELAY200
MOV A,P0
CLR ENABLE ;E=0
CLR RS
CLR WR
RET
;*************************************
DELAY5: ;Delay 5mS
MOV R6,#25
DEL5A:
MOV R7,#100
DJNZ R7,$
DJNZ R6,DEL5A
RET
;*********************************
DELAY1: ;Delay 1mS
MOV R6,#5
DEL1A:
MOV R7,#100
DJNZ R7,$
DJNZ R6,DEL1A
RET
;*********************************
DELAY200: ;Delay 300uS
MOV R7,#150
DJNZ R7,$
RET
;*********************************
CLR_RAM:
MOV R0,#10H
CLN:
MOV @R0,#0FFH
INC R0
CJNE R0,#0H,CLN
RET
;**************************************
DELAY20: ;Delay20mS
MOV R6,#179
DEL20A:
MOV R7,#50
DJNZ R7,$
DJNZ R6,DEL20A
RET
;**************************************
LOGO:
DB "    KeyScan     "
DB 10H
;
;**************************************

                END

沒有留言:

張貼留言