微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > PIC单片机的LCD例程1

PIC单片机的LCD例程1

时间:02-24 来源:互联网 点击:

MOVLW 0DH ; go to second line
CALL _LCD_CHAR
MOVLW 0AH
CALL _LCD_CHAR

MOVF 40H, W ; display location 40H as a char
CALL _LCD_CHAR

MOVLW 0DH ; go to third line
CALL _LCD_CHAR
MOVLW 0AH
CALL _LCD_CHAR

MOVLW 10H ; initialize pointer to RAM location 10
MOVWF FSR

MOVLW .4 ; four values on line
MOVWF _N1
_DEBUG_1:
MOVF INDF, W
CALL _LCD_VAL ; display values in loc 10, 11, 12, 13
INCF FSR, F
MOVLW " "
CALL _LCD_CHAR
DECFSZ _N1, F
GOTO _DEBUG_1

MOVLW 0DH ; go to 4th line
CALL _LCD_CHAR
MOVLW 0AH
CALL _LCD_CHAR

MOVLW .4 ; same for 14, 15, 16 and 17
MOVWF _N1
_DEBUG_2:
MOVF INDF, W
CALL _LCD_VAL
MOVLW " "
CALL _LCD_CHAR
INCF FSR, F
DECFSZ _N1, F
GOTO _DEBUG_2

MOVLW .250
MOVWF _N_MSEC

CALL _DELAY_N ; 250 msecs
CALL _DELAY_N

CALL _DELAY_N
CALL _DELAY_N

GOTO _RETURN

LCD_VAL: ; converts byte in W to two characters and outputs
MOVWF _SAVE_W ; save W and STATUS
SWAPF STATUS, W
MOVWF _SAVE_STAT
SWAPF _SAVE_STAT, F ; save it in true form

MOVF _SAVE_W, W ; get back W
_LCD_VAL:
MOVWF _TEMP1 ; save a copy of W
MOVF PCLATH, W
MOVWF _TEMP2 ; save PCLATH

MOVLW .3 ; page 3
MOVWF PCLATH

SWAPF _TEMP1, W ; high nibble now in lo nibble of W
ANDLW 0FH ;
CALL _HEX_LOOK
CALL _SEROUT

MOVF _TEMP1, W
ANDLW 0FH
CALL _HEX_LOOK
CALL _SEROUT

MOVF _TEMP2, W
MOVWF PCLATH ; previous value of PCLATH
GOTO _RETURN

_HEX_LOOK:
ADDWF PCL, F
DT "0", "1", "2", "3", "4", "5", "6", "7"
DT "8", "9", "A", "B", "C", "D", "E", "F"

LCD_CHAR: ; outputs character in W to LCD
MOVWF _SAVE_W ; save W and STATUS
SWAPF STATUS, W
MOVWF _SAVE_STAT
SWAPF _SAVE_STAT, F ; save in true form

MOVF _SAVE_W, W ; get back W
_LCD_CHAR:
CALL _SEROUT
MOVLW .10
MOVWF _N_MSEC
CALL _DELAY_N
GOTO _RETURN

_SEROUT: ; transmits content of W at 9600 Baud

MOVWF _SER_DATA

BSF STATUS, RP0 ; make TX bit an output
BCF TRISA, TX ;
BCF STATUS, RP0
BCF PORTA, TX ; set to stop bit

MOVLW .255
MOVWF _SER_TIME ; be sure stop bit has been high present
_SEROUT1: ; for some time
DECFSZ _SER_TIME, F
GOTO _SEROUT1

MOVLW .9
MOVWF _SER_LOOP

BCF STATUS, C ; set C to 0, start bit

_SEROUT2:
BTFSC STATUS, C
BCF PORTA, TX ; send a one
BTFSS STATUS, C
BSF PORTA, TX ; or a zero

MOVLW .31
MOVWF _SER_TIME ; one bit delay. 104 usecs at 9600 baud
_SEROUT3:
DECFSZ _SER_TIME, F
GOTO _SEROUT3

;NOP ; CHANGE

RRF _SER_DATA, F ; least sign bit now in C
DECFSZ _SER_LOOP, F ; does not affect status
GOTO _SEROUT2 ; next character

BCF PORTA, TX ; send stop bit

RETURN

_DELAY_N: ; delays number of msecs specified in _N_MSEC
MOVF _N_MSEC, W
MOVWF _LOOP1
_DELAY_1:
MOVLW .247 ; close to 1.0 msec delay when set to .247
MOVWF _LOOP2
_DELAY_2:

CLRWDT
DECFSZ _LOOP2, F ; decrement and leave result in LOOP2
; skip next statement if zero
GOTO _DELAY_2
DECFSZ _LOOP1, F
GOTO _DELAY_1
RETURN

_RETURN:
SWAPF _SAVE_STAT, W
MOVWF _TEMP2
SWAPF _TEMP2, W
MOVWF STATUS
SWAPF _SAVE_W, W ; get back W without altering STATUS
MOVWF _TEMP2
SWAPF _TEMP2, W

RETURN


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top