please dont rip this site

Microchip Dotlcd.src

;  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,
TOP NEW HELP FIND: 
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?
Please DO link to this page! Digg it! / MAKE!

<A HREF="http://sxlist.com/techref/microchip/dotlcd.src"> microchip dotlcd</A>

Did you find what you needed?

 

Welcome to sxlist.com!


Site supported by
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.
 
Quick, Easy and CHEAP! RCL-1 RS232 Level Converter in a DB9 backshell
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!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  .