Elsőként a korábban bemutatott R betűt fogjuk kiírni programból. A programot assembly nyelven írtam, így minden egyes lépést végigkövethetünk.
A program fő működtetőeleme 2 db szubrutin. Az egyik az LCD-nek adott parancsokat, a másik az LCD-nek küldött adatokat vezérli, de nézzük a teljes kódot:
</div>
<div>
<p style="margin-left: 30px;">LIST p=16F628A
include "P16F628A.inc"
ERRORLEVEL 0, -302
__config 0x3D18
<p style="margin-left: 30px;">
cblock 0x20
count
count1
counta
countb
count2
lcdadat
endc
Initialise
org 0x0000
<p style="margin-left: 30px;">movlw 0x07
movwf CMCON ; komparátor ki
clrf count
SetPorts
<p style="margin-left: 30px;">bsf STATUS,RP0 ; bank 1
clrf TRISA
clrf TRISB
bcf STATUS,RP0 ; bank 0
clrf PORTA
clrf PORTB
call Delay255
bsf PORTA,7 ; lcd reset
call Delay255
LCD_init
<p style="margin-left: 30px;">bcf PORTA,1 ;mindkét chip kiválasztása
bcf PORTA,0
<p style="margin-left: 30px;">movlw 0x3F ; lcd on
movwf lcdadat
call LCD_com
call Delay255
movlw b'01000000' ; Y kezdőcím: 0
movwf lcdadat
call LCD_com
movlw b'10111000' ; X kezdőcím: 0
movwf lcdadat
call LCD_com
movlw b'11000000' ; Z kezdőcím: 0
movwf lcdadat
call LCD_com
call Delay255
LCD_adat
<p style="margin-left: 30px;">
bsf PORTA,1 ; 1-es, chip kiválasztása
bcf PORTA,0
movlw b'00000000' ; R betű
movwf lcdadat
call LCD_write
movlw b'01111111'
movwf lcdadat
call LCD_write
movlw b'00001001'
movwf lcdadat
call LCD_write
movlw b'00011001'
movwf lcdadat
call LCD_write
movlw b'00101001'
movwf lcdadat
call LCD_write
movlw b'01000110'
movwf lcdadat
call LCD_write
movlw b'00000000'
movwf lcdadat
call LCD_write
goto $
;Subroutines and text tables
;LCD routines
;Initialise LCD
LCD_com ;a parancsok rutinja
<p style="margin-left: 30px;">bcf PORTA,2
movfw lcdadat
movwf PORTB
bsf PORTA,3
call Delay5
bcf PORTA,3
call Delay5
retlw 0x00
LCD_write ;az adatok rutinja
<p style="margin-left: 30px;">bsf PORTA,2
movfw lcdadat
movwf PORTB
bsf PORTA,3
call Delay5
bcf PORTA,3
call Delay5
retlw 0x00
Delay255
movlw 0xff ;delay 255 mS
goto k0
Delay100
movlw d'100' ;delay 100mS
goto k0
Delay50
movlw d'50' ;delay 50mS
goto k0
Delay20
movlw d'20' ;delay 20mS
goto k0
Delay5
movlw 0x05 ;delay 5.000 ms (4 MHz clock)
k0 movwf count1
k1 movlw 0xC7 ;delay 1mS
movwf counta
movlw 0x01
movwf countb
Delay_0
decfsz counta, f
goto $+2
decfsz countb, f
goto Delay_0
decfsz count1 ,f
goto k1
retlw 0x00
;end of LCD routines
end
</div>
<div>
Mint látható a két rutin csak a PORTA,2 állapotában tér el, parancs vagy adat küldés.
A lefordított programot (hex)
innen letölthetitek.
A cikk még nem ért véget, lapozz!
Értékeléshez bejelentkezés szükséges!