2013年9月21日 星期六

KEYSCAN_LCD_STEP.asm

;*******************************************************
; KeyScan with LCD Display
; Stepping Motor
;
;CPU: STC90C54RD+
;XTAL: 11.0592MHz
;PCB: HC6800E
;File: KEYSCAN_LCD_STEP.asm
;Date: 13_July_2011
;*******************************************************
WDT_CONTR EQU 0E1H
;MOV WDT_CONTR,#00111101B
;
OUT_A BIT P1.0
OUT_B BIT P1.1
OUT_BAR_A BIT P1.2
OUT_BAR_B BIT P1.3
;
CW_CNTR EQU 30H
CCW_CNTR EQU 31H
PHASE EQU 32H
CNTR EQU 33H
;
;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
ACALL CLR_RAM
MOV P3,#0FFH ;Input Mode
MOV P1,#0 ;Stop Motor
ACALL LCD_INTIAL
MOV A,#80H
ACALL WRINS
MOV DPTR,#LOGO
ACALL PRT_LOGO
MOV SP,#15
MOV A,#0C0H
ACALL WRINS
MOV PHASE,#10001000B
MOV CW_CNTR,#0
MOV CCW_CNTR,#0
MOV WDT_CONTR,#00111101B
CLR 28H.0
;
STATUS:
MOV WDT_CONTR,#00111101B
MOV DPTR,#LOGO_BLANK
MOV A,#0C0H
ACALL WRINS
ACALL PRT_LOGO
ACALL DELAY20
MOV A,#0C2H
ACALL WRINS
STATUS1:
JB 28H.0,STATUS2
MOV DPTR,#LOGO_CW
AJMP STATUS3
STATUS2:
MOV DPTR,#LOGO_CCW
STATUS3:
ACALL PRT_LOGO
MOV DQBUF,#0FFH
MOV DQBUF+1,#0FFH
MOV DQBUF+2,#0FFH
STA1:
MOV DQBUF,#0FFH ;Get Data Again
ACALL GET_DA
MOV A,DQBUF
ACALL DECODE
MOV DQBUF,A
CJNE A,#0FFH,STA1A
AJMP STA1
STA1A:
CJNE A,#"#",STA1B
AJMP CHECK_CNTR
STA1B:
CJNE A,#"*",STA1C
AJMP STA1
STA1C:
JB 28H.0,STA1D
MOV A,#0C5H
AJMP STA1E
STA1D:
MOV A,#0C6H
STA1E:
ACALL WRINS
MOV A,DQBUF
ACALL WRDATA
MOV DQBUF+1,A
;Next
STA2:
MOV WDT_CONTR,#00111101B
MOV DQBUF,#0FFH
ACALL GET_DA
MOV A,DQBUF
ACALL DECODE
MOV DQBUF,A
CJNE A,#0FFH,STA2A
AJMP STA2
STA2A:
CJNE A,#"#",STA2B
AJMP CHECK_CNTR
STA2B:
CJNE A,#"*",STA2C
AJMP STA2
STA2C:
JB 28H.0,STA2D
MOV A,#0C6H
AJMP STA2E
STA2D:
MOV A,#0C7H
STA2E:
ACALL WRINS
MOV A,DQBUF
ACALL WRDATA
MOV DQBUF+2,A

AJMP STA1

;
CHECK_CNTR:
CHECK_CNTR_CW:
MOV A,DQBUF+1
CJNE A,#0FFH,CHK_CW1
AJMP STA1
CHK_CW1:
MOV A,DQBUF+2
CJNE A,#0FFH,CHK_CW2
AJMP STA2
CHK_CW2:
ACALL COMBINE_DQ
JB 28H.0,CHK_CW3
ACALL CW
AJMP CHK_CW4
CHK_CW3:
ACALL CCW
CHK_CW4:
CPL 28H.0
AJMP STATUS
;
;**************************************
COMBINE_DQ:
MOV A,DQBUF+1
ANL A,#0FH
SWAP A
MOV B,A
MOV A,DQBUF+2
ANL A,#0FH
ORL A,B
MOV R2,A
ACALL BCD_HEX
MOV CNTR,R2
RET
;**************************************
GET_DA:
MOV WDT_CONTR,#00111101B
CLR PSW.5 ;Reset the press key flag
ACALL KSCAN
MOV A,20H
CJNE A,#0FH,S2A
AJMP GET_DA ;Return
S2A:
JNB PSW.5,S2B
MOV DQBUF,20H
ACALL DELAY20
S2B:
CLR PSW.5
ACALL KSCAN
JB PSW.5,S2B
ACALL DELAY20
RET
;
;***************************************
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: ;¤ÀªR¿é¤J¼Æ¾Ú
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
;
;*************************************
CW:
MOV A,CNTR
JNZ CW1
RET
CW1:
MOV CW_CNTR,CNTR
MOV A,PHASE
CW_LOOP:
ACALL DISPLAY_CNTR
MOV R1,#48 ;1 Cycle    7.5Deg/Pulse
CW_LOOP1:
RL A
MOV P1,A
ACALL DELAY12MS ;80pps
MOV WDT_CONTR,#00111101B
DJNZ R1,CW_LOOP1
DJNZ CW_CNTR,CW_LOOP
ACALL DISPLAY_CNTR
MOV P1,#0 ;Motor OFF
RET
;
CCW:
MOV A,CNTR
JNZ CCW1
RET
CCW1:
MOV CCW_CNTR,CNTR
MOV A,PHASE
CCW_LOOP:
ACALL DISPLAY_CNTR
MOV R1,#48
CCW_LOOP1:
RR A
MOV P1,A
ACALL DELAY12MS
MOV WDT_CONTR,#00111101B
DJNZ R1,CCW_LOOP1
DJNZ CCW_CNTR,CCW_LOOP
ACALL DISPLAY_CNTR
MOV P1,#0 ;Motor OFF
RET
;
;**************************************
DISPLAY_CNTR:
PUSH ACC
MOV A,#0CCH
ACALL WRINS
JB 28H.0,DSP_CNTR1
MOV A,CW_CNTR
AJMP DSP_CNTR2
DSP_CNTR1:
MOV A,CCW_CNTR
DSP_CNTR2:
MOV R2,A
ACALL HEX_BCD
MOV A,R5
MOV B,A
SWAP A
ANL A,#0FH
ADD A,#30H
ACALL WRDATA
MOV A,B
ANL A,#0FH
ADD A,#30H
ACALL WRDATA
MOV A,#20H
ACALL WRDATA
MOV A,#20H
ACALL WRDATA
POP ACC
RET
;**************************************
PRT_LOGO:
PRT_LOGO1:
CLR A
MOVC A,@A+DPTR
CJNE A,#10H,PRT_LOGO2
RET
PRT_LOGO2:
ACALL WRDATA
INC DPTR
AJMP PRT_LOGO1
;
;*************************************
DECODE:
CJNE A,#0,DEC1
MOV A,#23H ;"#"
RET
DEC1:
CJNE A,#1,DEC2
MOV A,#30H ;"0"
RET
DEC2:
CJNE A,#2,DEC3
MOV A,#2AH ;"*"
RET
DEC3:
CJNE A,#3,DEC4
MOV A,#39H ;"9"
RET
DEC4:
CJNE A,#4,DEC5
MOV A,#38H ;"8"
RET
DEC5:
CJNE A,#5,DEC6
MOV A,#37H ;"7"
RET
DEC6:
CJNE A,#6,DEC7
MOV A,#36H ;"6"
RET
DEC7:
CJNE A,#7,DEC8
MOV A,#35H ;"5"
RET
DEC8:
CJNE A,#8,DEC9
MOV A,#34H ;"4"
RET
DEC9:
CJNE A,#9,DEC10
MOV A,#33H ;"3"
RET
DEC10:
CJNE A,#0AH,DEC11
MOV A,#32H ;"2"
RET
DEC11:
CJNE A,#0BH,DEC12
MOV A,#31H ;"1"
RET
DEC12:
RET
;*************************************
;ASCII_HEX:
; MOV A,R2
; CLR C
; SUBB A,#30H
; MOV R2,A
; SUBB A,#0AH
; JC ASCII_HEX1
; MOV A,R2
; SUBB A,#07H
; MOV R2,A
;ASCII_HEX1:
; RET
;*************************************
BCD_HEX:
MOV A,R2
ANL A,#0F0H
SWAP A
MOV B,#0AH
MUL AB
MOV R3,A
MOV A,R2
ANL A,#0FH
ADD A,R3
MOV R2,A
RET
;
;*************************************
;HEX_ASCII:
; MOV A,R2
; ADD A,#90H
; DA A
; ADDC A,#40H
; DA A
; MOV R2,A
; RET
;*************************************
HEX_BCD:
MOV A,R2
MOV B,#64H
DIV AB
MOV R6,A
MOV A,#0AH
XCH A,B
DIV AB
SWAP A
ADD A,B
MOV R5,A
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
;**************************************
DELAY12MS: ;12.5mS
MOV R3,#25
DL1:
MOV R4,#229
DJNZ R4,$
DJNZ R3,DL1
RET
;**************************************
LOGO:
DB " Stepping Motor "
DB 10H
LOGO_CW:
DB "CW:"
DB 10H
LOGO_CCW:
DB "CCW:"
DB 10H
LOGO_BLANK:
DB "                "
DB 10H
;
;**************************************

                END

沒有留言:

張貼留言