LCD單行簡易跑馬燈

使用查表方式做簡易單行橫向跑馬燈...

今天做了一個簡易單行的跑馬燈,只不過蠻單調的...只會橫向跑而已...

改天在做個人機介面就可以改字了...呵呵,原始碼如下

;-----------------------------------------------
 ORG  0x00
 goto main
;-----------------------------------------------
text_DT1: addwf PCL
 DT "                www.xuan.idv.tw                                                                           "

;-----------------------------------------------
main:
 BANKSEL TRISA
 MOVLW 11111000B
 MOVWF TRISA
 MOVLW 00000000B
 MOVWF TRISB
 BANKSEL PORTA

TT:
 movlw .0
 movwf TEXT3
 MOVLW .16
 MOVWF TEXT2
 MOVLW .0
 MOVWF TEXT1
 CALL INIT_LCD
 movlw 11000000B  ;選擇顯示位置0x40 
 call WRITE_IR
STRING1:
 MOVF TEXT1,W
 CALL text_DT1
 CALL WRITE_DR
 INCF TEXT1,F
 DECFSZ TEXT2,F
 GOTO STRING1
 movlw 11000000B  ;選擇顯示位置0x40 
 call WRITE_IR
 MOVLW .16
 MOVWF TEXT2
 MOVLW .10
 movwf DLY1
 call DELAY250
 movf TEXT3,W
 sublw .32
 btfsc STATUS,Z
 goto TT
 incf TEXT3,F
 movf TEXT3,W
 movwf TEXT1
 GOTO STRING1
;----------------------------------------
INIT_LCD:
 MOVLW 00101000B
 MOVWF STACK
 CALL WRITE_IR
 MOVLW 00001110B
 MOVWF STACK
 CALL WRITE_IR
 MOVLW 00000110B
 MOVWF STACK
 CALL WRITE_IR
 RETURN
;-----------------------------------------------
CHK_BUSY:
 CALL READ_IR
 BTFSC TEMP1,7
 GOTO CHK_BUSY
 RETURN
;------------------------------------------------
READ_IR:
 BSF  STATUS,RP0          ;SELECT BANK 1
 MOVLW  11111111B           ;SET PORTB INPUT MODE
 MOVWF TRISB
 BCF   STATUS,RP0          ;RETURN TO BANK 0
    BCF  PORTA,RS            ;SELECT INSTRUCTION REGISTER
    NOP
    BSF  PORTA,RD_WR         ;READ MODE
    NOP
    BSF  PORTA,EN            ;SET ENABLE LINE
    MOVF  PORTB,W             ;READ DATA IN W REGISTER
    BCF  PORTA,EN            ;CLEAR ENABLE LINE
    ANDLW  11110000B
    MOVWF  TEMP1
;
    BSF    PORTA,EN            ;SET ENABLE LINE
    MOVF    PORTB,W             ;READ DATA IN W REGISTER
    BCF    PORTA,EN            ;SET ENABLE LINE
    ANDLW   11110000B
    SWAPF  TEMP1
    IORWF   TEMP1
    SWAPF  TEMP1
    RETURN
;-----------------------------------------------
WRITE_IR:
 MOVWF STACK
 CALL CHK_BUSY
 BSF  STATUS,RP0          ;SELECT BANK 1
 MOVLW 00001111B           ;SET PORTB OUTPUT MODE
 MOVWF TRISB
 BCF   STATUS,RP0          ;RETURN TO BANK 0
 BCF   PORTA,RS            ;SELECT INSTRUCTION REGISTER
 NOP
 BCF  PORTA,RD_WR         ;WRITE MODE
 NOP
 BSF  PORTA,EN            ;SET ENABLE LINE
 MOVF STACK,W             ;WRITE HIGH NIBBLE
 MOVWF PORTB               ;WRITE DATA TO INS. REGISTER
 BCF  PORTA,EN            ;CLEAR ENABLE LINE
 NOP
 BSF  PORTA,EN            ;SET ENABLE LINE
 SWAPF STACK,W             ;WRITE LOW NIBBLE
 MOVWF PORTB               ;WRITE DATA TO INS. REGISTER
 BCF  PORTA,EN            ;CLEAR ENABLE LINE
 RETURN
;-----------------------------------------------
WRITE_DR:
 MOVWF STACK
 CALL CHK_BUSY
 BSF  STATUS,RP0          ;SELECT BANK 1
 MOVLW 00001111B           ;SET PORTB OUTPUT MODE
 MOVWF TRISB
 BCF  STATUS,RP0          ;RETURN TO BANK 0
 BSF  PORTA,RS            ;SELECT DATA REGISTER
 NOP
 BCF   PORTA,RD_WR         ;WRITE MODE
 NOP
 BSF   PORTA,EN            ;SET ENABLE LINE
 MOVF   STACK,W             ;WRITE HIGH NIBBLE
 MOVWF  PORTB               ;WRITE DATA TO INS. REGISTER
 BCF   PORTA,EN            ;CLEAR ENABLE LINE
 NOP
 ;
 BSF  PORTA,EN            ;SET ENABLE LINE
 SWAPF  STACK,W             ;WRITE LOW NIBBLE
 MOVWF PORTB               ;WRITE DATA TO INS. REGISTER
 BCF  PORTA,EN            ;CLEAR ENABLE LINE
 RETURN
;-----------------------------------------------
DELAY:
 DECFSZ DLY1   ;DLY*1MC
 GOTO DELAY   ;DLY*2MC
 RETURN
;-----------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;CALL DELAY TIMES=20ms*DLY3
;OSC:4MHz
;1MC=(1/(4000000/4))=0.000001=1us
;0EH is 50=B'00110010' = 1s
;    is 25=B'00011001' = 0.5s
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY250
 MOVLW 250
 MOVWF DLY2
INNER2
 MOVLW 25
 MOVWF DLY3
INNER1
 DECFSZ DLY3
 GOTO INNER1
 DECFSZ DLY2
 GOTO INNER2
 DECFSZ DLY1
 GOTO DELAY250
 RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 END

 

此查表我是用累加指標的方式,每次指標多1,一次顯示16字元,以推的方式前進,就造成視覺上有橫向移動的效果

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料