; ; ; File: SERDISP.ASM ; ; ; ;--------------------------------------------------------------------; ;PIC16F627 jako prevodnik serioveho toku 9600bps 8N1 na LCD display ; ;--------------------------------------------------------------------; ;Autor: Jiri Bezstarosti ; ;e-mail: jiri@bezstarosti.cz ; ;web: http://www.bezstarosti.cz ; ;--------------------------------------------------------------------; list p=16F627, r=DEC #include P16F627.INC __CONFIG _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _BODEN_ON & _WDT_OFF & _HS_OSC & _LVP_OFF & _MCLRE_OFF ;Zapojeni: ; HSosc 4MHz ; ; RB0 RS ; RB1 RX ; RB2 TX ; RB3 E ; RB4 DB4 ; RB5 DB5 ; RB6 DB6 ; RB7 DB7 ; ; RA0-4 OUT - osetreno tim ze je to vystup ; RA5 IN - vstup privazan k Vss ; ; ; ; GND +5V ; o o LCD with HD44780 ; | | +-----------+ ; | | | 100n | | | ; +-----------| |-----------------------+ +--o R/W | ; | | | | | | | ; | | | | | ; +----------------------+-------+------)--+--o Vss | ; | PIC16F627 |27p |27p | | | | ; | +---+-+---+ -+- -+- | | | | ; | | |_| | -+- -+- | +--o Vo | ; | X-o1 18o-X | _ | | | | ; | | | | || || | | | | ; | X-o2 17o-X +-|| ||-+ | | | ; | | | | ||_|| | | | | ; | X-o3 16o----+ 4MHz | | | | ; | | | | | | | ; +-------o4 15o------------+ | | | ; | | | | | | ; +-------o5 14o-------------------+-----o Vdd | ; | | | | ; +-------o6 13o-------------------------o DB7 DB0 o-X ; RXD | | | | | ; ---> o-------)-------o7 12o-------------------------o DB6 DB1 o-X ; TXD | | | | | ; <--- o-------)-------o8 11o-------------------------o DB5 DB2 o-X ; | | | | | ; | +---o9 10o-------------------------o DB4 DB3 o-X ; | | | | | | ; | | +---------+ | | ; | | | | ; | +---------------------------------------o E | ; | | | ; +-------------------------------------------o RS | ; | | ; +-----------+ ; ; ;Example: ; ;Send CLS : 0xFE,0x01,0x06 ;Set line 0: 0xFE,0x80 ;Set line 1: 0xFE,0xC0 ;Write text: 0xFF,'H','e','l','l','o' #define e PORTB,3 #define rs PORTB,0 CBLOCK 0x20 ;promenne TMP1 TMP2 TMP3 MODE ENDC ORG 0x0 goto start ;odskok na zacatek programu ORG 0x4 RETFIE start movlw 0x07 movwf CMCON clrf PORTB ;portb do 0 clrf PORTA ;porta do 0 bsf STATUS,RP0 movlw b'11011111' MOVWF OPTION_REG movlw b'00000010' movwf TRISB movlw b'11100000' movwf TRISA movlw .25 ;9600 BPS PRI 4MHZ XTAL A BRGH=1 movwf SPBRG bsf TXSTA,BRGH bsf TXSTA,TXEN bcf STATUS,RP0 bsf RCSTA,CREN bsf RCSTA,SPEN call lcd_init ;inicializace LCD movlw 0x80 ;na prvni pozici radku 0 call lcd_write_rs0 bcf MODE,0 loop ;pockame na bajt ze seriaku btfss RCSTA,OERR goto hop_0 bcf RCSTA,CREN ;sem, pokud by nekdy pretekl seriak bsf RCSTA,CREN hop_0 btfss PIR1,RCIF goto loop movf RCREG,W movwf TMP1 incfsz TMP1,f goto nomode1 bsf MODE,0 ;prijato 255, tak jen nastav, ze vsechno dalsi bude s RS=1 goto loop nomode1 incfsz TMP1,f goto nomode0 bcf MODE,0 ;prijato 254, tak jen nastav, ze vsechno dalsi bude s RS=0 goto loop nomode0 btfsc MODE,0 goto TORS1 call lcd_write_rs0 goto loop TORS1 call lcd_write_rs1 goto loop lcd_init clrf PORTB ;wait for 15ms movlw 150 call wait movlw 0x30 movwf PORTB call lcd_puls movlw 41 call wait call lcd_puls movlw 1 call wait movlw 0x20 movwf PORTB call lcd_puls movlw 1 call wait movlw 0x20 movwf PORTB call lcd_puls movlw 1 call wait movlw 0x80 movwf PORTB call lcd_puls movlw 1 call wait movlw 0x0 movwf PORTB call lcd_puls movlw 1 call wait movlw 0x80 movwf PORTB call lcd_puls movlw 1 call wait movlw 0x0 movwf PORTB call lcd_puls movlw 1 call wait movlw 0xE0 movwf PORTB call lcd_puls movlw 1 call wait movlw 0x0 movwf PORTB call lcd_puls movlw 1 call wait movlw 0x60 movwf PORTB call lcd_puls movlw 1 call wait call lcd_cls retlw 0 lcd_puls ;vyrobi puls na pin E displaye bsf e nop nop nop bcf e retlw 0 lcd_cls ;vymaze display movlw 0x0 movwf PORTB call lcd_puls movlw 1 call wait movlw 0x10 movwf PORTB call lcd_puls movlw 50 call wait movlw 0x0 movwf PORTB call lcd_puls movlw 1 call wait movlw 0x60 movwf PORTB call lcd_puls movlw 1 call wait movlw 0x0 movwf PORTB call lcd_puls movlw 1 call wait movlw 0xC0 movwf PORTB call lcd_puls movlw 1 call wait retlw 0 lcd_write_rs0 ;zapise W do LCD displaye s RS=0. movwf TMP1 ;uchovat W v TMP1 movlw 0xf0 andwf TMP1,w movwf PORTB call lcd_puls movlw 1 call wait swapf TMP1,w andlw 0xf0 movwf PORTB call lcd_puls movlw 1 call wait return lcd_write_rs1 ;zapise W do LCD displaye s RS=1. movwf TMP1 ;uchovat W v TMP1 movlw 0xf0 andwf TMP1,w iorlw 1 ;rs=1 movwf PORTB call lcd_puls movlw 1 call wait swapf TMP1,w andlw 0xf0 iorlw 1 ;rs=1 movwf PORTB call lcd_puls movlw 1 call wait return wait ;cekej 100*w microsec vcetne call a retlw movwf TMP3 wasm movlw .30 movwf TMP2 wasm2 decfsz TMP2,f goto wasm2 nop decfsz TMP3,f goto wasmdor nop retlw 0 wasmdor nop goto $+1 goto wasm end