-
Notifications
You must be signed in to change notification settings - Fork 0
/
lcd_displ.c
128 lines (97 loc) · 2.56 KB
/
lcd_displ.c
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// 6 kabelków
// LCD_D4,LCD_D5,LCD_D6,LCD_D7 magistrala 4 bity
// EN - enable signal
// RS - register select (dane albo rozkazy)
// RW - zapis/odczyt u nas tylko zapis = 0
// dzia³a prawid³owo dla impulsów skróconych: 0.35 T (graniczne), wyd³uzonych wiêcej ni¿ 10 x T, T - d³ugoœæ standardowa
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include "lcd_displ.h"
// procedura wysyla 4 bity na wyswietlacz
void lcd_send_4(unsigned char b)
{
set_lcd_en;
// wysterowanie poszczególnych linii danych
if (b & 1) set_lcd_d4; else clr_lcd_d4;
if (b & 2) set_lcd_d5; else clr_lcd_d5;
if (b & 4) set_lcd_d6; else clr_lcd_d6;
if (b & 8) set_lcd_d7; else clr_lcd_d7;
_delay_us(1); // min 230ns
// zapis danych opadajacym zboczem EN
clr_lcd_en;
_delay_us(1); // min 500ns
}
void lcd_send_8(unsigned char b)
{
lcd_send_4(b>>4); // najpierw czêœæ bardziej znacz¹ca
lcd_send_4(b);
}
void lcd_send_com(unsigned char b)
{
// rs = 0 wysy³anie rozkazu
clr_lcd_rs;
lcd_send_8(b);
_delay_us(100);
}
void lcd_send_data(unsigned char b)
{
// rs = 1 wysy³anie danej (do pamiêci)
set_lcd_rs; // SET(PORT,LCD_RS);
lcd_send_8(b);
_delay_us(100);
}
void lcd_init(void)
{
//kierunek portów = 1 (wyjscie)
ddr_d4; ddr_d5; ddr_d6; ddr_d7; ddr_en; ddr_rs;
_delay_ms(5);
lcd_send_4(3); _delay_ms(1); lcd_send_4(3); _delay_ms(1); // prze³¹czanie na magistral 4 bit
lcd_send_4(3); _delay_ms(1); lcd_send_4(2); _delay_ms(1);
lcd_send_com(0x28); _delay_ms(1); // szerokosc magistrali 4 bity, 2 linie
lcd_send_com(0x01); _delay_ms(1); // clear
lcd_send_com(0x06); _delay_ms(1); // inkrementacja DDRAM bez przes
lcd_send_com(0x0C); _delay_ms(1); // w³acz, bez kursora i migania
}
void lcd_control( unsigned char on, unsigned char cur, unsigned char blink)
{
unsigned char v=0;
v = 1<<3 | (on!=0)<<2 | (cur!=0)<<1 | (blink!=0);
lcd_send_com( v );
}
void lcd_clear(void)
{
lcd_send_com(1);
lcd_send_com(2);
}
void lcd_home(void)
{
lcd_send_com(2);
_delay_ms(2);
}
void lcd_gotoxy(unsigned char x, unsigned char y)
{
lcd_send_com( 128 | ((y==1)? 64:0) | x );
}
void lcd_swrite( char *s)
{int i=0;
while(s[i] && i<1000) { lcd_send_data(s[i]); ++i; }
}
void lcd_iwrite(int i)
{
char s[10];
itoa( i, s, 10); lcd_swrite(s) ;
}
int lcd_printf( char *format, ... )
{
va_list argptr;
char str[40];
int n;
va_start( argptr, format );
n = vsprintf( str, format, argptr );
lcd_swrite( str );
va_end( argptr );
return( n );
} /* end e_printf */