lcd.c


1
/********** lcd.c   *****************/
2
#include <16F1829.H>
3
#include "lcd.h"
4
#use delay(clock=16000000)
5
6
void LCD_write4Bit(unsigned char zeichen)
7
{
8
    LCD_E=0;
9
    LCD_D7=zeichen &0x80;
10
    LCD_D6=zeichen &0x40;
11
    LCD_D5=zeichen &0x20;
12
    LCD_D4=zeichen &0x10;
13
  LCD_E=1;
14
  LCD_E=0;
15
  delay_us(50); //50µs warten
16
    LCD_D7=zeichen &0x08;
17
    LCD_D6=zeichen &0x04;
18
    LCD_D5=zeichen &0x02;
19
    LCD_D4=zeichen &0x01;
20
  LCD_E=1;
21
  LCD_E=0;
22
  delay_us(50); //50 µs warten
23
}
24
25
void LCD_reset()
26
{  
27
  LCD_E=0;
28
    LCD_RS=REG;
29
    LCD_D7=0;
30
  LCD_D6=0;
31
  LCD_D5=1;
32
  LCD_D4=1;
33
  LCD_E=1;
34
  LCD_E=0;
35
  delay_ms(5);
36
  LCD_D7=0;
37
  LCD_D6=0;
38
  LCD_D5=1;
39
  LCD_D4=1;
40
  LCD_E=1;
41
  LCD_E=0;
42
  delay_us(100);
43
  LCD_D7=0;
44
  LCD_D6=0;
45
  LCD_D5=1;
46
  LCD_D4=1;
47
  LCD_E=1;
48
  LCD_E=0;
49
  delay_ms(1);
50
}
51
   
52
53
void LCD_init()
54
{  
55
  LCD_reset();
56
    LCD_E=0;
57
  LCD_RS=REG;
58
  LCD_D7=0;
59
  LCD_D6=0;
60
  LCD_D5=1;
61
  LCD_D4=0;
62
  LCD_E=1;
63
  LCD_E=0;
64
  delay_ms(2);
65
  LCD_write4Bit(0x28);
66
  delay_ms(2);
67
     LCD_write4Bit(0x0c);
68
  delay_ms(2);
69
  LCD_write4Bit(0x01);
70
  delay_ms(2); //1 ms warten
71
}
72
73
void LCD_del()
74
{   
75
  LCD_RS=REG; //Registerbefehl
76
  LCD_write4Bit(0x01); //Daten werden gesendet
77
  delay_ms(1);//700µs warten
78
}
79
80
void LCD_pos1()
81
{
82
  LCD_RS=REG; //Registerbefehl
83
  LCD_write4Bit(0x02); //Daten werden gesendet
84
  delay_ms(1);//700µs warten
85
}
86
87
void LCD_on()
88
{
89
  LCD_RS=REG; //Registerbefehl
90
  LCD_write4Bit(0x0C);//Daten werden gesendet 
91
  delay_us(50);//50µs warten
92
}
93
94
95
void LCD_out(char *text)
96
{
97
  LCD_RS=DAT;
98
    while(*text!='\0')
99
  {
100
  LCD_write4Bit(*text++); //string wird zeichen für zeichen ausgegeben bis '\0'
101
  }
102
}
103
void LCD_movexy(unsigned char row, unsigned char col)
104
{
105
  unsigned char address;
106
  if (row==1)
107
  {
108
    address=0x80+col; //0x80 1.Zeile 1.Zeichen
109
  }
110
  else
111
  {
112
    address=0xc0+col; //0xc0 2.Zeile 1.Zeichen
113
  }
114
  LCD_RS=REG; //Registerbefehl
115
  LCD_write4Bit(address); //Daten werden gesendet
116
  delay_ms(1);//1 ms warten
117
}
118
void LCD_enable()
119
{
120
  LCD_E=1;//negative Flanke wird erzeugt
121
  LCD_E=0;
122
}
123
124
125
void DefineBarSigns()
126
{
127
  // to set a bar with xx elements 0-100%
128
  // 8 rows must be inserted for one user sign
129
  unsigned char i;
130
  unsigned char addr_inc;
131
  unsigned char value=0;
132
  unsigned char fac=1;
133
134
  LCD_RS = REG;
135
  LCD_write4Bit(0x40);     // address 0 character ram
136
                           // address auto increment
137
  delay_ms(1);
138
  for(addr_inc=0;addr_inc<6;addr_inc++)
139
    {
140
     LCD_RS = DAT;
141
     LCD_write4Bit(0x1F);//(0b00011111); //Daten werden gesendet
142
     delay_ms(1);
143
     for (i=0;i<6;i++)
144
       {
145
        LCD_write4Bit(0x1F-value);//0b00011111 - value
146
        delay_ms(1);
147
       }
148
     LCD_write4Bit(0x1F); //0b00011111
149
     delay_ms(1);
150
     value=value + fac;
151
     fac=fac*2;
152
     }
153
}
154
155
void DrawBar(unsigned char percent) //10 segment
156
{
157
  unsigned char i;
158
  unsigned char rest=0;
159
  unsigned char cnt_full=0;
160
  unsigned char cnt_rest=0;
161
  unsigned char cnt_barseg=0;
162
163
  if(percent>100)percent=100;
164
  if(percent<0)percent=0;
165
166
  cnt_full = percent / 10;
167
  rest = percent - cnt_full * 10;
168
169
  for(i=0;i<cnt_full;i++)
170
    {
171
     LCD_RS=DAT;
172
     LCD_write4Bit(0);
173
     cnt_barseg++;
174
    }
175
176
  if(cnt_full<10)
177
    {cnt_rest = rest / 2;
178
     LCD_RS=DAT;
179
     LCD_write4Bit(5-cnt_rest);
180
     cnt_barseg++;
181
    }
182
  for(i=0;i<(10-cnt_barseg);i++)
183
    {
184
    LCD_RS=DAT; 
185
    LCD_write4Bit(5);
186
    }
187
}