lcd/progs: progamm ein wenig verbessert :)
[calu.git] / progs / lcd.s
1 #include "dt_inc.s"
2 .text
3 .org 0x0
4 start:
5         br+ main
6         br+ main
7         ret
8 main:
9         call+ u_init
10         call+ u_recv_byte
11         call u_send_newline
12
13         ldis r1, 0x41 ; 'A'
14         call u_send_byte
15
16         call lcd_init
17         ldis r1, 0x42 ; 'B'
18         call u_send_byte
19
20         call lcd_clear
21         ldis r1, 0x43 ; 'C'
22         call u_send_byte
23
24         call lcd_home
25         ldis r1, 0x44 ; 'D'
26         call u_send_byte
27         call+ u_send_newline
28
29         ldis r0, 0x00 ; init line var (we begin at line 0 ofc)
30         push r0
31
32 loop:
33         call+ u_recv_byte ; print received Char on LCD
34         cmpi r0, 0x0d ; change line on '\r'
35         breq l_nl
36         addi r1, r0, 0
37         call+ lcd_data
38         br loop
39
40 l_nl:
41         pop r1
42         cmpi r1, 0
43         brnq l_ln1
44 l_ln0:
45         ldis r1, 1
46         push r1
47         ldis r1, 0xc0 ; jump to second line
48         call+ lcd_command
49         call delay5ms
50         br+ loop
51
52 l_ln1:
53         ldis r1, 0
54         push r1
55         ldis r1, 0x80 ; jump to first line
56         call+ lcd_command
57         br+ loop
58
59 hang: br+ hang
60
61         .define LCD_BASE, 0x2050
62         ; http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD#Routinen_zur_LCD-Ansteuerung
63 lcd_data:
64         lrs r2, r1, 4
65         andx r2, 0xf
66         orx r2, 0x10
67         stw r2, 0(r12)
68         call+ lcd_enable
69
70         andx r1, 0xf
71         orx r1, 0x10
72         stw r1, 0(r12)
73         call+ lcd_enable
74
75         call+ delay50us
76         ret
77
78 lcd_command:
79         lrs r2, r1, 4
80         andx r2, 0xf
81         stw r2, 0(r12)
82         call+ lcd_enable
83
84         andx r1, 0xf
85         stw r1, 0(r12)
86         call+ lcd_enable
87
88         call+ delay50us
89         ret
90
91 lcd_enable:
92         addinv r0, r0, 0
93         addinv r0, r0, 0
94         addinv r0, r0, 0
95         ldw r0, 0(r12)
96         orx r0, 0x20
97         stw r0, 0(r12)
98         addinv r0, r0, 0
99         addinv r0, r0, 0
100         addinv r0, r0, 0
101         addinv r0, r0, 0
102         addinv r0, r0, 0
103         ldw r0, 0(r12)
104         ldis r5, 0xffdf
105         and r0, r0, r5
106         stw r0, 0(r12)
107         ret
108
109 delay50us: ; @ 50 MHz
110         ldis r0, 2500/2
111         ;ldis r0, 4000/2
112 delay50us_:
113         subi r0, r0, 1
114         brnz+ delay50us_ ; not zero
115         ret
116
117 delay5ms: ; @ 50 MHz
118         ldis r0, 5
119         ;ldis r0, 7
120 delay5ms_1:
121         ldis r1, 50000/2
122 delay5ms_2:
123         subi r1, r1, 1
124         brnz+ delay5ms_2 ; not zero
125         subi r0, r0, 1
126         brnz+ delay5ms_1 ; not zero
127         ret
128
129 lcd_init:
130         ldis r12, LCD_BASE@lo
131         ldih r12, LCD_BASE@hi
132         ldis r3, 50
133 powerupwait:
134         call+ delay5ms
135         subi r3, r3, 1
136         brnz+ powerupwait
137
138         ldis r3, 0x3
139         stw r3, 0(r12)
140         call+ lcd_enable
141         call+ delay5ms
142         call+ lcd_enable
143         call+ delay5ms
144         call+ lcd_enable
145         call+ delay5ms
146
147         ldis r3, 0x2
148         stw r3, 0(r12)
149         call+ lcd_enable
150         call+ delay5ms
151
152         ; ldis r1, 0x24
153         ldis r1, 0x2c ; 4bit interface, 2/4zeiliges display, 5x10 font
154         call+ lcd_command
155         ldis r1, 0xf ; display an, cursor an, cursor blinkt
156         call+ lcd_command
157         ldis r1, 0x4 ; display fest
158         call+ lcd_command
159         ret
160
161 lcd_clear:
162         ldis r1, 0x1
163         call lcd_command
164         call delay5ms
165         ret
166
167 lcd_home:
168         ldis r1, 0x2
169         call lcd_command
170         call delay5ms
171         ret