; WRITTEN BY PETER BIRNIE ; COPYRIGHT P. B. MICRO DESIGNS - 01494 531709 ; DATE 11.8.95 ; ITERATION 1.0 ; FILE SAVED AS DOTLCD.ASM ; FOR PIC16C74-04/P WDT=off CP=off ; CLOCK 4.00 MHz RESONATOR ; INSTRUCTION CLOCK 1.00 MHz T= 1us TITLE "DOTLCD.asm - LCD dot matrix driver and string handler" LIST P=16C74 ;---------------------------------------------------------------------------- ; Program handle all aspects of setup and display on a dot matrix lcd ; display. Routines are provided to allow display of strings or ; characters, place the cursor and clear the display. ;---------------------------------------------------------------------------- ; Register File Assignment ;---------------------------------------------------------------------------- INCLUDE "P16Cxx.INC" ;---------------------------------------------------------------------------- ; Physical Port Assignment ;---------------------------------------------------------------------------- LCDPORT EQU PORTA ; Port A - LCD ;---------------------------------------------------------------------------- ; Physical Bit Assignment ;---------------------------------------------------------------------------- ; A port assignment LCDRS EQU 4 ; Lcd register select output LCDEN EQU 5 ; Lcd enable output ;---------------------------------------------------------------------------- ; Constant Assignment ;---------------------------------------------------------------------------- MEMBAS EQU 20h ; Base address of user file registers CLKR EQU 100h ; Roll over value for rtc - subtract count ; value from this to preset count down time. DIV256 EQU b'00000111' ; 256us prescale setting ; LCD commands LCDCLER EQU b'00000001' ; Clears display, resets curcor LCDCM EQU b'10000000' ; Sets cursor using bits 0 - 6 ; Line 1 range - 0 to .15 ; Line 2 range - .40 to .55 ; NOTE that subroutine LCDCUR2 take the ; value in W in range 0 - 15 and adjusts for ; line 2 offset. ;---------------------------------------------------------------------------- ; Variable Assignment ;---------------------------------------------------------------------------- GP1 EQU MEMBAS ; General purpose register ; LCD variables here STRNUM EQU GP1+1 CHPT EQU STRNUM+1 ; Character string pointer in string. LCDCH EQU CHPT+1 ; Saves byte to be sent to lcd while ; it is processed. TABOFF EQU LCDCH+1 ; Table ofset pointer in lcd string lookup ;-------------------------------------------------------------------------- ; Macros ;-------------------------------------------------------------------------- ;****** ; CLKLCD clocks data/command to the lcd by making the EN line ; high then low. CLKLCD MACRO BSF LCDPORT,LCDEN ; Lcd enable LOW BCF LCDPORT,LCDEN ; Lcd enable HIGH ENDM ;****** ; TABSET sets up the lcd table offset pointer before string output ; starts TABSET MACRO MOVLW b'11111111' ; Offset is incremented on each call to ; table - first call must generate zero value ; offset. MOVWF TABOFF ENDM ;****** ; POINT increments the string pointer offset and adds it to the ; PLC ready for string lookup POINT MACRO INCF TABOFF MOVFW TABOFF ADDWF PCL ENDM ;****** ; POINT8 increments the string pointer offset and adds it to the ; PLC ready for string lookup. Sets PCLATH to 8 POINT8 MACRO MOVLW .8 MOVWF PCLATH INCF TABOFF MOVFW TABOFF ADDWF PCL ENDM ;****** ; POINT9 increments the string pointer offset and adds it to the ; PLC ready for string lookup. Sets PCLATH to 9 POINT9 MACRO MOVLW .9 MOVWF PCLATH INCF TABOFF MOVFW TABOFF ADDWF PCL ENDM ;****** ; TSTRTC moves TIMER0 to W reg and sets ZERO status TSTRTC MACRO MOVFW TMR0 ; Test for timeout ENDM ;****** ; BANK0 selects register file bank 0 BANK0 MACRO BCF STATUS,RP0 ; Select BANK 0 ENDM ;****** ; BANK1 selects register file bank 1 BANK1 MACRO BSF STATUS,RP0 ; Select BANK 1 ENDM ;****** ; PAGE0 selects rom page 0 PAGE0 MACRO BCF PCLATH,3 ; Select rom page 0 ENDM ;****** ; PAGE1 selects rom page 1 PAGE1 MACRO BSF PCLATH,3 ; Select rom page 1 ENDM ;-------------------------------------------------------------------------- ; Vectors ;-------------------------------------------------------------------------- ;****** ; Reset vector ORG 000 GOTO INIT ; Do a cold start on power up ;****** ; Interrupt vector - timer, keypad ORG 004 GOTO INIT ; No interrupt so reset ;-------------------------------------------------------------------------- ; Subroutines ;-------------------------------------------------------------------------- ;****** ; STRING sends the string with number in W register - to the lcd STRING MOVWF STRNUM TABSET ; Xero the offset PAGE1 CALL DOSTR ; Character from string PAGE0 ; Restore rom page RETURN ;****** ; BCDLCD sends the bcd character in W to lcd BCDLCD IORLW '00110000' ; Convert to ascii ;****** ; PUTLCD sends the ASCII character in W to lcd PUTLCD MOVWF LCDCH PAGE1 CALL CHALCD ; Character to lcd PAGE0 ; Restore rom page RETURN ;****** ; CUR1 and CUR2 are indirect subroutine calls to LCDCUR1/2 ; Enter with character placement in W in range 0 - 15 CUR1 PAGE1 CALL LCDCUR1 ; Line 1 please PAGE0 RETURN CUR2 PAGE1 CALL LCDCUR2 ; Line 2 please PAGE0 RETURN ;****** ; LCDCLR is an indirect call to LCDCLR1 on page 1 LCDCLR PAGE1 CALL LCDCLR1 PAGE0 RETURN ;****** ; WAITGP waits for the number of ms in GP1 WAITGP MOVLW CLKR-4 ; 1ms timeout in TIMER0 MOVWF TMR0 WAITGPA TSTRTC BNZ WAITGPA ; Wait for rtc to time out DECF GP1 BNZ WAITGP ; Loop until delay is complete RETURN ; Exit from WAITGP ;-------------------------------------------------------------------------- ; Setup ;-------------------------------------------------------------------------- INIT CLRF PCLATH ;****** ; ; Set up peripheral control registers. ; Set port data directions: unused port pins set to outputs. ; A port setup ; Outputs ; RA0 - 3 lcd data ; RA4 lcd register select ; RA5 lcd enable CLRF LCDPORT BANK1 MOVLW b'00000111' ; Select port A as digital MOVWF ADCON1 MOVLW b'00000000' ; Set port data directions MOVWF TRISA BANK0 ;****** ; Set up timer options ; Timer0 is set for internal, 1/4 ms pre scale MOVLW DIV256 ; Set RTC0 for 1/4 ms tick BANK1 MOVWF OPTION_REG BANK0 ;****** ; Reset the lcd INITA MOVLW .20 ; Delay for 20 ms to let lcd settle MOVWF GP1 CALL WAITGP ; Wait for lcd MOVLW b'00000011' ; Reset MOVWF LCDPORT ; Command to lcd port CLKLCD ; Clock the nibble to the lcd MOVLW .6 ; Delay to let lcd settle MOVWF GP1 CALL WAITGP ; Wait for lcd MOVLW b'00000011' ; Reset MOVWF LCDPORT ; Command to lcd port CLKLCD ; Clock the nibble to the lcd MOVLW .5 ; Delay for 5 ms to let lcd settle MOVWF GP1 CALL WAITGP ; Wait for lcd MOVLW b'00000011' ; Reset MOVWF LCDPORT ; Command to lcd port CLKLCD ; Clock the nibble to the lcd MOVLW .5 ; Delay for 5 ms to let lcd settle MOVWF GP1 CALL WAITGP ; Wait for lcd MOVLW b'00000010' ; 4 bit interface MOVWF LCDPORT ; Command to lcd port CLKLCD ; Clock the nibble to the lcd MOVLW .5 ; Delay for 5 ms to let lcd settle MOVWF GP1 CALL WAITGP ; Wait for lcd MOVLW b'00000010' ; 4 bit interface MOVWF LCDPORT ; Command to lcd port CLKLCD ; Clock the nibble to the lcd MOVLW b'00001000' ; 2 LINES, 5*7 MOVWF LCDPORT ; Command to lcd port CLKLCD ; Clock the nibble to the lcd MOVLW .5 ; Delay for 5 ms to let lcd settle MOVWF GP1 CALL WAITGP ; Wait for lcd MOVLW b'00000000' ; Display OFF MOVWF LCDPORT ; Command to lcd port CLKLCD ; Clock the nibble to the lcd MOVLW b'00001000' ; MOVWF LCDPORT ; Command to lcd port CLKLCD ; Clock the nibble to the lcd MOVLW .5 ; Delay for 5 ms to let lcd settle MOVWF GP1 CALL WAITGP ; Wait for lcd MOVLW b'00000000' ; Display clear MOVWF LCDPORT ; Command to lcd port CLKLCD ; Clock the nibble to the lcd MOVLW b'00000001' ; MOVWF LCDPORT ; Command to lcd port CLKLCD ; Clock the nibble to the lcd MOVLW .5 ; Delay for 5 ms to let lcd settle MOVWF GP1 CALL WAITGP ; Wait for lcd MOVLW b'00000000' ; Entry mode set MOVWF LCDPORT ; Command to lcd port CLKLCD ; Clock the nibble to the lcd MOVLW b'00000110' ; MOVWF LCDPORT ; Command to lcd port CLKLCD ; Clock the nibble to the lcd MOVLW .5 ; Delay for 5 ms to let lcd settle MOVWF GP1 CALL WAITGP ; Wait for lcd MOVLW b'00000000' ; Display on MOVWF LCDPORT ; Command to lcd port CLKLCD ; Clock the nibble to the lcd MOVLW b'00001100' ; MOVWF LCDPORT ; Command to lcd port CLKLCD ; Clock the nibble to the lcd MOVLW .5 ; Delay for 5 ms to let lcd settle MOVWF GP1 CALL WAITGP ; Wait for lcd ;-------------------------------------------------------------------------- ; Program start ;-------------------------------------------------------------------------- ; Display demonstration banner IDLE CALL LCDCLR ; Not really required here as display has ; just been set up! MOVLW .3 CALL CUR1 ; Position text on line 1 MOVLW .1 ; 'Microchip' - NOTE that the string is on ; second page of ROM at 0X800. CALL STRING ; Move cursor for line 2 of banner MOVLW .0 CALL CUR2 ; Position text on line 2 MOVLW .3 ; '16C74 drives lcd' - NOTE that the string ; is on second page of ROM at 0x900. CALL STRING IDLE1 GOTO IDLE1 ; Just loop here please ;-------------------------------------------------------------------------- ; Second page of ROM ;-------------------------------------------------------------------------- ; Text strings and control subroutines must be stored on the correct ; page or this pcogram WILL NOT FUNCTION CORRECTLY. ; Only move code around if you are absoluteley clear as to what you ; are doing! ORG 0x800 LAST EQU b'10000000' ; Value to add to last character in a string ;****** ; DOSTR uses CALLSTR table to direct flow to the correct lookup table ; for lcd strings. Gets string characters and outputs to lcd DOSTR MOVLW .8 MOVWF PCLATH ; Keep the pageing ok MOVFW STRNUM ; Get the string number CALL CALLSTR MOVWF LCDCH CALL CHALCD ; Character to lcd BTFSS LCDCH,7 ; Test if end of string flagged - bit 7 set GOTO DOSTR ; Loop until all sent RETURN ;****** ; CALLSTR is the dispatch table for lcd string lookup CALLSTR ADDWF PCL NOP GOTO MSG1 ; 'Microchip' GOTO MSG2 ; 'On page 9' ; more jumps can be added here GOTO MSG3 ; '16C74 drives lcd' ;****** ; THE TEXT STRINGS! MSG1 POINT8 ; Use macro POINT8 when the string is in 0x800 ; address area RETLW 'M' RETLW 'i' RETLW 'c' RETLW 'r' RETLW 'o' RETLW 'c' RETLW 'h' RETLW 'i' RETLW 'p'+LAST MSG2 POINT8 RETLW 'O' RETLW 'n' RETLW ' ' RETLW 'P' RETLW 'a' RETLW 'g' RETLW 'e' RETLW ' ' RETLW '8'+LAST ORG 0x900 MSG3 POINT9 ; Use macro POINT9 when the string is in 0x900 ; address area RETLW '1' RETLW '6' RETLW 'C' RETLW '7' RETLW '4' RETLW ' ' RETLW 'd' RETLW 'r' RETLW 'i' RETLW 'v' RETLW 'e' RETLW 's' RETLW ' ' RETLW 'l' RETLW 'c' RETLW 'd''+LAST ;-------------------------------------------------------------------------- ; Subroutines to handle the lcd ;-------------------------------------------------------------------------- ; NOTE: these must be on page 1 of rom ; ------------------------------------ ;***** ; CHALCD writes the character in W register to the lcd. ; On entry, the display character is in LCDCH. CHALCD ; Get the upper nibble and load to the lcd port SWAPF LCDCH,W ; Get the ms nibble to ls position ANDLW 07H ; Strip to ms nibble in ls position, ; and mask top bit in case this is the lset ; character in a string MOVWF LCDPORT ; Data to lcd port BSF LCDPORT,LCDRS ; Select lcd data ; Clock the ms nibble to the lcd CLKLCD ; Get the lower nibble and load to the lcd port MOVFW LCDCH ; Get back the character ANDLW 0FH ; Strip to ms nibble in ls position MOVWF LCDPORT ; Data to lcd port BSF LCDPORT,LCDRS ; Select lcd data ; Clock the ls nibble to the lcd. CLKLCD BCF LCDPORT,LCDRS GOTO LCD64 ; Delay then exit from CHALCD ;***** ; COMLCD writes the command in W register to the lcd ; On entry, the command character is in LCDCH. COMLCD ; Get the upper nibble and load to the lcd port SWAPF LCDCH,W ; Get the ms nibble to ls position ANDLW 0FH ; Strip to ms nibble in ls position MOVWF LCDPORT ; Command to lcd port ; Clock the ms nibble to the lcd CLKLCD ; Get the lower nibble and load to the lcd port MOVFW LCDCH ; Get back the character ANDLW 0FH ; Strip to ms nibble in ls position MOVWF LCDPORT ; Command to lcd port ; Clock the ls nibble to the lcd. CLKLCD GOTO LCD2 ; Delay then exit from COMLCD ;****** ; LCDCL1R clears the display and resets the cursor LCDCLR1 MOVLW LCDCLER ; LCD clear command MOVWF LCDCH GOTO COMLCD ;****** ; LCDCUR1 sets cursor to position on line 1 using value in W register LCDCUR1 IORLW LCDCM ; Cursor move command MOVWF LCDCH GOTO COMLCD ;****** ; LCDCUR2 sets cursor to position on line 2 using value in W register LCDCUR2 IORLW LCDCM ; Cursor move command MOVWF LCDCH BSF LCDCH,6 ; This bit set for line 2 GOTO COMLCD ;****** ; LCD64/2 gives a delay of 64us or 1.6ms while the lcd accepts the ; data or command. ; Uses TMR0 - prescale is set to 16us in OPTION. LCD64 MOVLW CLKR-.3 ; Gives 48/64 us delay GOTO LCDEL LCD2 MOVLW CLKR-.100 ; Gives 1.6ms delay LCDEL MOVWF TMR0 ; Set TMR0 prescalar LCDELA TSTRTC BNZ LCDELA ; Wait for TMR0 to time out RETLW .0 ; Exit from CHA/COMLCD routines END
file: /Techref/microchip/dotlcd.src, 14KB, , updated: 1999/6/21 08:23, local time: 2024/11/17 11:17,
3.22.181.148:LOG IN
|
©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions? <A HREF="http://sxlist.com/techref/microchip/dotlcd.src"> microchip dotlcd</A> |
Did you find what you needed? |
Welcome to sxlist.com!sales, advertizing, & kind contributors just like you! Please don't rip/copy (here's why Copies of the site on CD are available at minimal cost. |
Ashley Roll has put together a really nice little unit here. Leave off the MAX232 and keep these handy for the few times you need true RS232! |
.