7 set LCD_STATUSREG 0xa0004
9 set LCD_DATAREG 0xa0000
12 # 9 pins. 8 for data pins 0-7, and 1 for strobe pin
13 for { set j 0 } { $j < $NUM_OPLINES } {incr j} {
14 set lcd_ippin($j) [sid::pin::new]
17 # array to store pin values. Represent ASCII characters
18 for { set j 0 } { $j < [expr $NUM_OPLINES - 1] } { incr j } {
23 proc find_pin {name} {
25 if { [string compare $name "pin0_lcdcontr"] == 0 } { return $lcd_ippin(0) }
26 if { [string compare $name "pin1_lcdcontr"] == 0 } { return $lcd_ippin(1) }
27 if { [string compare $name "pin2_lcdcontr"] == 0 } { return $lcd_ippin(2) }
28 if { [string compare $name "pin3_lcdcontr"] == 0 } { return $lcd_ippin(3) }
29 if { [string compare $name "pin4_lcdcontr"] == 0 } { return $lcd_ippin(4) }
30 if { [string compare $name "pin5_lcdcontr"] == 0 } { return $lcd_ippin(5) }
31 if { [string compare $name "pin6_lcdcontr"] == 0 } { return $lcd_ippin(6) }
32 if { [string compare $name "pin7_lcdcontr"] == 0 } { return $lcd_ippin(7) }
33 if { [string compare $name "pin8_lcdcontr"] == 0 } { return $lcd_ippin(8) }
37 # driven method for 8 data pins and one strobe pin
38 proc driven_h4 { pin value } {
39 global lcd_ippin ack_access val_arr
41 if { [string compare $pin $lcd_ippin(8)] == 0} {
43 # #strobe signal is low thus data is ready
45 sid::pin::driven_h4 $ack_access 0
48 for { set i 0} { $i < [expr $NUM_OPLINES - 1] } { incr i } {
49 if { [string compare $pin $lcd_ippin($i)] == 0 } {
50 set val_arr($i) $value
57 # connect bus with mapper
58 proc connect_accessor {name bus} {
60 if { [string compare $name "input_lcdbus"] == 0} {
61 set lcdbus_access $bus
64 puts " Bus name doesn't match "
69 proc connect_pin {name pin} {
71 if { [string compare $name "outputack"] == 0 } {
75 puts " ack pin name not found "
80 proc send_lcddata {} {
81 global lcdinit_done lcdbus_access NUM_OPLINES
82 global LCD_CMDREG LCD_STATUSREG LCD_DATAREG STATUS_CRW
83 global val_arr STATUS_AUTOW
86 # reading input array for finding ascii value
87 for { set k 0 } { $k < [expr $NUM_OPLINES - 1] } {incr k} {
88 if { $val_arr($k) > 0 } {
89 set res [expr $res + [expr int([expr pow(2,$k)])]]
92 # subtract 32 from ascii value to make it lcd equivalent char.
93 set res [expr $res - 32]
95 if { $lcdinit_done == 0 } {
96 # lcd hasn't initialized
97 puts " Needs Initilization "
100 # need to think about clearing memory area
101 # number of rows will always be 16.
104 # send and display data
105 # currently, I am going with write byte, move pointer ahead
106 # need to talk with R. Unrau
107 check_status $STATUS_CRW
108 sid::bus::write_h4_b1 $lcdbus_access $LCD_DATAREG $res
109 check_status $STATUS_CRW
110 sid::bus::write_h4_b1 $lcdbus_access $LCD_CMDREG 0xC0
111 # how long we will move this pointer once hit the end bring back.
114 #setting address ptr to text home address
115 proc reset_addptr {} {
116 global lcdbus_access STATUS_CRW LCD_DATAREG LCD_CMDREG
117 check_status $STATUS_CRW
118 sid::bus::write_h4_b1 $lcdbus_access $LCD_DATAREG 0
119 check_status $STATUS_CRW
120 sid::bus::write_h4_b1 $lcdbus_access $LCD_DATAREG 0
121 check_status $STATUS_CRW
122 sid::bus::write_h4_b1 $lcdbus_access $LCD_CMDREG 0x24
126 proc Initialize_lcd {} {
128 global lcdinit_done LCD_STATUSREG LCD_CMDREG LCD_DATAREG
132 # setting text home address at top 0x0000
134 check_status $STATUS_CRW
135 # writing lower byte 0x00
136 sid::bus::write_h4_b1 $lcdbus_access $LCD_DATAREG 0x00
137 check_status $STATUS_CRW
138 #writing higher byte 0x00
139 sid::bus::write_h4_b1 $lcdbus_access $LCD_DATAREG 0x00
140 check_status $STATUS_CRW
141 # writing command 0x40
142 sid::bus::write_h4_b1 $lcdbus_access $LCD_CMDREG 0x40
144 # Setting text area set 0x0020
146 check_status $STATUS_CRW
147 # writing lower byte 0x14 20 columns
148 sid::bus::write_h4_b1 $lcdbus_access $LCD_DATAREG 0x14
149 check_status $STATUS_CRW
150 # writing higher byte 00
151 sid::bus::write_h4_b1 $lcdbus_access $LCD_DATAREG 0x00
152 check_status $STATUS_CRW
153 # wrting command 0x41
154 sid::bus::write_h4_b1 $lcdbus_access $LCD_CMDREG 0x41
156 # setting graphic home address 0x0200
158 check_status $STATUS_CRW
160 sid::bus::write_h4_b1 $lcdbus_access $LCD_DATAREG 0x00
161 check_status $STATUS_CRW
163 sid::bus::write_h4_b1 $lcdbus_access $LCD_DATAREG 0x02
165 check_status $STATUS_CRW
167 sid::bus::write_h4_b1 $lcdbus_access $LCD_CMDREG 0x42
170 # Setting graphic area set 0014
172 check_status $STATUS_CRW
173 # lower byte data 0x20
174 sid::bus::write_h4_b1 $lcdbus_access $LCD_DATAREG 0x14
175 check_status $STATUS_CRW
177 sid::bus::write_h4_b1 $lcdbus_access $LCD_DATAREG 0x00
178 check_status $STATUS_CRW
180 sid::bus::write_h4_b1 $lcdbus_access $LCD_CMDREG 0x43
184 check_status $STATUS_CRW
186 sid::bus::write_h4_b1 $lcdbus_access $LCD_CMDREG 0x80
188 # display mode text, graphic, and cursor off
190 check_status $STATUS_CRW
192 sid::bus::write_h4_b1 $lcdbus_access $LCD_CMDREG 0x9C
194 puts " Initilialization routine completed "
198 # check status register bits 0 & 1
199 proc check_status {stat_val} {
200 global lcdbus_access LCD_STATUSREG
201 set stat [sid::bus::read_h4_b1 $lcdbus_access $LCD_STATUSREG]
202 if { [lindex $stat 0] == "ok" } {
203 if { [expr [lindex $stat 1] & $stat_val] != $stat_val } {
204 puts " Error status NOE $stat_val"
206 } else { puts "Error Init not ok" }