Rev Author Line No. Line
1089 mija 1 /* mija 2008
2  
3 source file for lcd HITACHI 16x2,8x2,...
4  
5 !!! must be set PINs,PORTs,DDR in lcd.h
6  
7 ver.: 0.0 TESTED
8 (source from lcd.c from (c)miho 2005)
9 */
10  
11  
12 #include <avr/io.h>
13 #include <util/delay.h>
14 #include <avr/pgmspace.h>
15 #include "lcd.h"
16  
17 #include <stdio.h>
18  
19 //*************************************************************
20  
21 #define H_D0 PORT_D0 |=_BV(PIN_D0)
22 #define L_D0 PORT_D0 &= ~(_BV(PIN_D0))
23  
24 #define H_D1 PORT_D1 |=_BV(PIN_D1)
25 #define L_D1 PORT_D1 &= ~(_BV(PIN_D1))
26  
27 #define H_D2 PORT_D2 |=_BV(PIN_D2)
28 #define L_D2 PORT_D2 &= ~(_BV(PIN_D2))
29  
30 #define H_D3 PORT_D3 |=_BV(PIN_D3)
31 #define L_D3 PORT_D3 &= ~(_BV(PIN_D3))
32  
33 #define H_E PORT_E |=_BV(PIN_E)
34 #define L_E PORT_E &= ~(_BV(PIN_E))
35  
36 #define H_RS PORT_RS |=_BV(PIN_RS)
37 #define L_RS PORT_RS &= ~(_BV(PIN_RS))
38  
39 //*************************************************************
40  
41 // Definice konstant pro LCD display
42 //
43 #define LCD_CURSOR_ON_ 0x0E // kurzor jako blikajici radka pod znakem
44 #define LCD_CURSOR_OFF_ 0x0C // zadny kurzor
45 #define LCD_LINE_2 0x40 // adresa 1. znaku 2. radky
46  
47  
48 // Definice rezimu LCD displeje
49 //
50  
51 uint8_t PROGMEM LCD_INIT_STRING[4] =
52 {
53 0x28, // intrfejs 4 bity, 2 radky, font 5x7
54 LCD_CURSOR_OFF_, // display on, kurzor off,
55 0x01, // clear displeje
56 0x06 // inkrement pozice kurzoru (posun kurzoru doprava)
57 };
58  
59 void LCD_init_IO_PIN(void)
60 {
61 DDR_D0 |= _BV(PIN_D0);
62 DDR_D1 |= _BV(PIN_D1);
63 DDR_D2 |= _BV(PIN_D2);
64 DDR_D3 |= _BV(PIN_D3);
65 DDR_E |= _BV(PIN_E);
66 DDR_RS |= _BV(PIN_RS);
67 }
68  
69 void LCD_init(void)
70 {
71 uint8_t a;
72  
73 LCD_init_IO_PIN();
74 _delay_ms(20);
75 L_E;
76 L_RS;
77 for (a=0;a<3;a++)
78 {
79 _delay_ms(2);
80 LCD_send_nibble(0x3);
81  
82 }
83 _delay_us(40);
84 LCD_send_nibble(0x2);
85 _delay_us(40);
86 for (a=0;a<3;a++)
87 {
88 LCD_send_command(pgm_read_byte(&(LCD_INIT_STRING[a])));
89 _delay_ms(2);
90 }
91 }
92  
93 void LCD_putc(uint8_t data)
94 {
95 LCD_send_data(data);
96 }
97  
98 void LCD_send_command(uint8_t data)
99 {
100 L_RS;
101 LCD_send(data);
102 H_RS;
103 }
104  
105 void LCD_send_data(uint8_t data)
106 {
107 H_RS;
108 LCD_send(data);
109 }
110  
111 void LCD_send(uint8_t data)
112 {
113 LCD_send_nibble(data >> 4);
114 LCD_send_nibble(data);
115 _delay_us(40);
116 }
117  
118 void LCD_send_nibble(uint8_t data)
119 {
120 L_D0;L_D1;L_D2;L_D3;
121 if (data & 0x1) H_D0;
122 if (data & 0x2) H_D1;
123 if (data & 0x4) H_D2;
124 if (data & 0x8) H_D3;
125 H_E;
126 _delay_us(1);
127 L_E;
128 }
129  
130  
131 void LCD_clear(void)
132 {
133 LCD_send_command(1);
134 _delay_ms(2);
135 }
136  
137 void LCD_gotoxy( uint8_t x, uint8_t y)
138 {
139 uint8_t Adr;
140  
141 Adr=x-1;
142 if(y==2)
143 Adr+=LCD_LINE_2;
144  
145 LCD_send_command(0x80|Adr);
146 }