-
Notifications
You must be signed in to change notification settings - Fork 4
/
lcd.go
102 lines (81 loc) · 1.65 KB
/
lcd.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package lcd
import (
"github.com/davecheney/gpio"
"time"
)
const (
NEWLINE = 0xC0
)
type LCDPanel struct {
rsPin gpio.Pin // the pin for 'rs'
enPin gpio.Pin // the pin for 'en'
dataPins []gpio.Pin // array for data pins
}
/* high level functions */
func (l *LCDPanel) Message(str string) {
for _, c := range str {
if c == '\n' {
l.CommandByte(NEWLINE)
} else {
l.MessageByte(byte(c))
}
}
}
/* mid level functions */
func (l *LCDPanel) CommandByte(val byte) {
l.send(val, 0)
}
func (l *LCDPanel) MessageByte(val byte) {
l.send(val, 1)
}
func (l *LCDPanel) SetRsPin(pin gpio.Pin) {
l.rsPin = pin
}
func (l *LCDPanel) SetEnablePin(pin gpio.Pin) {
l.enPin = pin
}
func (l *LCDPanel) AddDataPin(pin gpio.Pin) {
l.dataPins = append(l.dataPins, pin)
}
/* low level bit writes */
func (l *LCDPanel) send(val byte, mode int) {
// set pin mode
if mode > 0 {
l.rsPin.Set()
} else {
l.rsPin.Clear()
}
// write the 4 bits sequentially
l.Write4Bits(val >> 4)
l.Write4Bits(val)
}
func (l *LCDPanel) Write4Bits(val byte) {
DelayMicroseconds(1000)
// pulse enable at end of function
defer l.pulseEnable()
// clear all data pins
for _, pin := range l.dataPins {
pin.Clear()
}
var mask uint8 = 1 << 3
for i := 0; i < 4; i++ {
if val&mask >= 1 {
l.dataPins[i].Set()
}
mask >>= 1
}
}
func (l *LCDPanel) pulseEnable() {
l.enPin.Clear()
DelayMicroseconds(10)
l.enPin.Set()
DelayMicroseconds(10)
l.enPin.Clear()
DelayMicroseconds(10)
}
func Delay(duration int) {
time.Sleep(time.Duration(duration) * time.Millisecond)
}
func DelayMicroseconds(duration int) {
time.Sleep(time.Duration(duration) * time.Microsecond)
}