65435fae6ecf88a66097b9b85ebb2203b0887e2f
Stefan Schuermans implemented LCD peripheral

Stefan Schuermans authored 12 years ago

1) #include "cyc_cnt.h"
2) #include "lcd.h"
3) 
Stefan Schuermans converted code to use const...

Stefan Schuermans authored 12 years ago

4) static volatile unsigned char *const lcd_ptr =
5)   (volatile unsigned char *)0x80000100;
6) 
Stefan Schuermans implemented LCD peripheral

Stefan Schuermans authored 12 years ago

7) /**
8)  * @brief set data to LCD
9)  * @param[in] data data to LCD
10)  */
11) void lcd_set_data(unsigned char data)
12) {
Stefan Schuermans converted code to use const...

Stefan Schuermans authored 12 years ago

13)   lcd_ptr[0] = data;
Stefan Schuermans implemented LCD peripheral

Stefan Schuermans authored 12 years ago

14) }
15) 
16) /**
17)  * @brief set enable signal to LCD
18)  * @param[in] state state for enable signal (0 or 1)
19)  */
20) void lcd_set_e(unsigned char state)
21) {
Stefan Schuermans converted code to use const...

Stefan Schuermans authored 12 years ago

22)   lcd_ptr[1] = state;
Stefan Schuermans implemented LCD peripheral

Stefan Schuermans authored 12 years ago

23) }
24) 
25) /**
26)  * @brief set register select signal to LCD
27)  * @param[in] state state for register select signal (0 or 1)
28)  */
29) void lcd_set_rs(unsigned char state)
30) {
Stefan Schuermans converted code to use const...

Stefan Schuermans authored 12 years ago

31)   lcd_ptr[2] = state;
Stefan Schuermans implemented LCD peripheral

Stefan Schuermans authored 12 years ago

32) }
33) 
34) /**
35)  * @brief set read/write signal to LCD
36)  * @param[in] state state for read/write signal (0 or 1)
37)  */
38) void lcd_set_rw(unsigned char state)
39) {
Stefan Schuermans converted code to use const...

Stefan Schuermans authored 12 years ago

40)   lcd_ptr[3] = state;
Stefan Schuermans implemented LCD peripheral

Stefan Schuermans authored 12 years ago

41) }
42) 
43) /** set LCD to 4 bit mode */
44) void lcd_set4bit(void)
45) {
46)   lcd_set_data(0x0F);
47)   lcd_set_e(0);
48)   lcd_set_rs(0);
49)   lcd_set_rw(0);
50)   cyc_cnt_delay_ms(15);
51)   lcd_set_data(0x3F);
52)   lcd_set_e(1);
53)   cyc_cnt_delay(12);
54)   lcd_set_e(0);
55)   cyc_cnt_delay_us(4100);
56)   lcd_set_e(1);
57)   cyc_cnt_delay(12);
58)   lcd_set_e(0);
59)   cyc_cnt_delay_us(100);
60)   lcd_set_e(1);
61)   cyc_cnt_delay(12);
62)   lcd_set_e(0);
63)   cyc_cnt_delay_us(40);
64)   lcd_set_data(0x2F);
65)   lcd_set_e(1);
66)   cyc_cnt_delay(12);
67)   lcd_set_e(0);
68)   cyc_cnt_delay_us(40);
69) }
70) 
71) /**
72)  * @brief output a byte to LCD
73)  * @param[in] data if the byte is a data byte (command otherwise)
74)  * @param[in] byte byte to write
75)  */
76) void lcd_byte(unsigned char data, unsigned char byte)
77) {
78)   lcd_set_e(0);
79)   lcd_set_rs(data ? 1: 0);
80)   lcd_set_rw(0);
81)   lcd_set_data(byte | 0x0F);
82)   lcd_set_e(1);
83)   cyc_cnt_delay(12);
84)   lcd_set_e(0);
85)   cyc_cnt_delay_us(1);
86)   lcd_set_data(byte << 4 | 0x0F);
87)   lcd_set_e(1);
88)   cyc_cnt_delay(12);
89)   lcd_set_e(0);
90)   cyc_cnt_delay_us(40);
91) }
92) 
93) /** initialize LCD */
94) void lcd_init(void)
95) {
96)   lcd_set4bit();
97)   lcd_byte(0, 0x28);
98)   lcd_byte(0, 0x06);
99)   lcd_byte(0, 0x0C);
100)   lcd_byte(0, 0x01);
101)   cyc_cnt_delay_us(1640);
Stefan Schuermans output character/string to LCD

Stefan Schuermans authored 12 years ago

102) }
103) 
104) /**
105)  * @brief show character
106)  * @param[in] line number of line (0..1)
107)  * @param[in] pos position in line (0..15)
108)  * @param[in] chr character to set
109)  */
110) void lcd_chr(unsigned int line, unsigned int pos, char chr)
111) {
112)   if (line > 1 || pos > 15)
113)     return;
114)   lcd_byte(0, 0x80 | line << 6 | pos);
115)   lcd_byte(1, chr);
116) }
117) 
118) /**
119)  * @brief show string
120)  * @param[in] line number of line (0..1)
121)  * @param[in] str string to show
122)  */
123) void lcd_str(unsigned int line, const char *str)
124) {
125)   if (line > 1)
126)     return;
127)   lcd_byte(0, 0x80 | line << 6);
128)   unsigned int cnt;
129)   for (cnt = 0; cnt < 16 && str[cnt] != 0; ++cnt)
130)     lcd_byte(1, str[cnt]);
131)   for (; cnt < 16; ++cnt)
132)     lcd_byte(1, ' ');