1 | ; Notes:
|
2 | ; Pin Connections
|
3 | ; RB0-RB7 Data Port
|
4 | ; RA0 RS
|
5 | ; RA1 R/W
|
6 | ; RA2 E
|
7 | ; *
|
8 | ; *
|
9 | ;**********************************************************************
|
10 |
|
11 | list p=16F628A
|
12 | #include <p16F628A.inc>
|
13 |
|
14 | errorlevel -302 ; suppress message 302 from list file
|
15 |
|
16 | __CONFIG _CP_OFF & DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _XT_OSC
|
17 |
|
18 | ;**********************************************************************
|
19 | ; VARIABLE DEFINITIONS
|
20 | ;**********************************************************************
|
21 |
|
22 | VAR UDATA 0x22
|
23 | loops RES 1
|
24 | loops1 RES 1
|
25 | Temp RES 1
|
26 | Lcd_Data RES 1
|
27 | Lcd_Status RES 1
|
28 |
|
29 | ;**********************************************************************
|
30 | ; EQU Befehle
|
31 | ;**********************************************************************
|
32 | Lcd_RS equ RA0
|
33 | Lcd_RW equ RA1
|
34 | Lcd_E equ RA2
|
35 | Lcd_Line equ PORTB
|
36 | Lcd_Cont equ PORTA
|
37 |
|
38 | ;**********************************************************************
|
39 | ; MAIN PROGRAM
|
40 | ;**********************************************************************
|
41 |
|
42 | MAIN_PROG CODE
|
43 |
|
44 | START
|
45 | bcf STATUS, C
|
46 | clrf PORTA
|
47 | clrf PORTB
|
48 | call IniReg
|
49 | call IniLcd
|
50 |
|
51 |
|
52 |
|
53 | Main
|
54 | goto Main
|
55 |
|
56 |
|
57 |
|
58 | ;**********************************************************************
|
59 | ; SUBROUTINES
|
60 | ;**********************************************************************
|
61 | ;Zeitverzögerung um loops * 1 ms
|
62 | ; 4MHz externer Takt bedeutet 1MHz interner Takt
|
63 | ; also dauert 1 ms genau 1000 Befehle
|
64 | ; 110 Schleifen a 9 Befehle sind 990 Befehle = 0.99 ms
|
65 | ; die restlichen 10 Befehle für Einsprung und Rücksprung
|
66 | Wait
|
67 | top movlw .110 ; timing adjustment variable (1ms)
|
68 | movwf loops1
|
69 | top2 nop ; sit and wait
|
70 | nop
|
71 | nop
|
72 | nop
|
73 | nop
|
74 | nop
|
75 | decfsz loops1, F ; inner loops complete?
|
76 | goto top2 ; no, go again
|
77 | ;
|
78 | decfsz loops, F ; outer loops complete?
|
79 | goto top ; no, go again
|
80 | return ; yes, return from subWAIT
|
81 | ;**********************************************************************
|
82 | ;Steuerbyte 8-bittig übertragen
|
83 | Lcd_ContSend
|
84 | movwf Lcd_Data
|
85 | call LcdBusy
|
86 | movf Lcd_Data,w
|
87 | movwf Lcd_Line
|
88 | bcf Lcd_Cont, Lcd_RW
|
89 | bcf Lcd_Cont, Lcd_RS
|
90 | bsf Lcd_Cont, Lcd_E
|
91 | nop
|
92 | bcf Lcd_Cont, Lcd_E
|
93 | movlw D'50'
|
94 | movwf loops
|
95 | call Wait
|
96 | return
|
97 | ;**********************************************************************
|
98 | ;Datenbyte 8-bittig übertragen
|
99 | Lcd_DataSend
|
100 | movwf Lcd_Data
|
101 | call LcdBusy
|
102 | movf Lcd_Data,w
|
103 | movwf Lcd_Line
|
104 | bcf Lcd_Cont, Lcd_RW
|
105 | bsf Lcd_Cont, Lcd_RS
|
106 | bsf Lcd_Cont, Lcd_E
|
107 | nop
|
108 | bcf Lcd_Cont, Lcd_E
|
109 | movlw D'50'
|
110 | movwf loops
|
111 | call Wait
|
112 | return
|
113 | ;**********************************************************************
|
114 | ; darauf warten, daß das Display bereit zur Datenannahme ist
|
115 | LcdBusy
|
116 | banksel TRISB
|
117 | movlw B'11111111'
|
118 | movwf TRISB
|
119 | banksel PORTB
|
120 | BusyLoop
|
121 | bcf Lcd_Cont, Lcd_RS
|
122 | bsf Lcd_Cont, Lcd_RW ; Lesen
|
123 | bsf Lcd_Cont, Lcd_E
|
124 | nop
|
125 | movf Lcd_Line, w
|
126 | movwf Lcd_Status
|
127 | bcf Lcd_Cont, Lcd_E
|
128 | nop
|
129 | bsf Lcd_Cont, Lcd_E ; Enable
|
130 | nop
|
131 | bcf Lcd_Cont, Lcd_E
|
132 | btfsc Lcd_Status, 7 ; teste bit 7
|
133 | goto BusyLoop
|
134 | bcf Lcd_Cont, Lcd_RW
|
135 | banksel TRISB
|
136 | movlw B'00000000'
|
137 | movwf TRISB
|
138 | banksel PORTB
|
139 | return
|
140 | ;**********************************************************************
|
141 | ;Iinitialisierung der Resgister
|
142 | IniReg
|
143 | bcf STATUS,C
|
144 | banksel OPTION_REG ;Bank1
|
145 | movlw B'00000010' ; pull-up enalbled
|
146 | movwf OPTION_REG
|
147 | movlw B'00000000' ;PortA RA0-RA2 Output
|
148 | movwf TRISA
|
149 | movlw B'00000000' ;PortB Outputs
|
150 | movwf TRISB
|
151 | movlw B'00000000' ;
|
152 | movwf PIE1
|
153 | movlw B'00000011' ;
|
154 | movwf PCON
|
155 | movlw B'00000010' ;
|
156 | movwf TXSTA
|
157 | movlw B'00000000' ;
|
158 | movwf EECON1
|
159 | movlw B'00000000' ;
|
160 | movwf VRCON
|
161 | banksel TMR0 ;Bank 0
|
162 | movlw B'00000000'
|
163 | movwf PORTA
|
164 | movlw B'00000000'
|
165 | movwf PORTB
|
166 | movlw B'00000000' ;
|
167 | movwf INTCON
|
168 | movlw B'00010000' ;
|
169 | movwf PIR1
|
170 | movlw B'00000000' ;
|
171 | movwf T1CON
|
172 | movlw B'00000000' ;
|
173 | movwf T2CON
|
174 | movlw B'00000000' ;
|
175 | movwf CCP1CON
|
176 | movlw B'00000000' ;
|
177 | movwf RCSTA
|
178 | movlw B'00000111' ;
|
179 | movwf CMCON
|
180 | return
|
181 | ;**********************************************************
|
182 | ; Initialisierung des LCD-Displays
|
183 |
|
184 | IniLcd
|
185 | movlw D'250' ; 250 ms Pause nach dem Einschalten
|
186 | movwf loops
|
187 | call Wait
|
188 |
|
189 | movlw B'00110000' ; 1
|
190 | movwf Lcd_Line
|
191 | bsf Lcd_Cont, Lcd_E
|
192 | nop
|
193 | bcf Lcd_Cont, Lcd_E
|
194 |
|
195 | movlw D'100' ; 100 ms Pause
|
196 | movwf loops
|
197 | call Wait
|
198 |
|
199 | movlw B'00110000' ; 2
|
200 | call Lcd_ContSend
|
201 | movlw B'00110000' ; 3
|
202 | call Lcd_ContSend
|
203 |
|
204 | movlw B'00000001' ; löschen und cusor home
|
205 | call Lcd_ContSend
|
206 | movlw B'00111000' ; 5 function set, 8-bit 2-zeilig, 5x7
|
207 | call Lcd_ContSend
|
208 | movlw B'00001000' ; 6 display off
|
209 | call Lcd_ContSend
|
210 | movlw B'00000110' ; 7 entry mode, increment, disable display-shift
|
211 | call Lcd_ContSend
|
212 | movlw B'00000011' ; 8 cursor home, cursor home
|
213 | call Lcd_ContSend
|
214 | movlw B'00001111' ; 9 display on
|
215 | call Lcd_ContSend
|
216 | return
|
217 |
|
218 |
|
219 | ;**********************************************************************
|
220 | ; END OF PROGRAM
|
221 | ;**********************************************************************
|
222 |
|
223 | END
|