00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include "lcd.h"
00037 #include <string.h>
00038 #include <stdlib.h>
00039
00040 void lcd_toggle_e() {
00041 set_pin(lcd_e_port, lcd_e_pin);
00042 delay_us(50);
00043 clear_pin(lcd_e_port, lcd_e_pin);
00044 delay_us(50);
00045 }
00046
00047 void lcd_write_nibble(uns8 data) {
00048
00049
00050
00051
00052 change_pin(lcd_db4_port, lcd_db4_pin, data.0);
00053 change_pin(lcd_db5_port, lcd_db5_pin, data.1);
00054 change_pin(lcd_db6_port, lcd_db6_pin, data.2);
00055 change_pin(lcd_db7_port, lcd_db7_pin, data.3);
00056 }
00057
00058 void lcd_write_byte(uns8 data) {
00059
00060 lcd_write_nibble(data >> 4);
00061 lcd_toggle_e();
00062 lcd_write_nibble(data);
00063 lcd_toggle_e();
00064 }
00065
00066
00067 void lcd_setup() {
00068
00069
00070 make_output(lcd_e_port, lcd_e_pin);
00071 make_output(lcd_rs_port, lcd_rs_pin);
00072 make_output(lcd_rw_port, lcd_rw_pin);
00073 make_output(lcd_db7_port, lcd_db7_pin);
00074 make_output(lcd_db6_port, lcd_db6_pin);
00075 make_output(lcd_db5_port, lcd_db5_pin);
00076 make_output(lcd_db4_port, lcd_db4_pin);
00077
00078 clear_pin(lcd_e_port, lcd_e_pin);
00079 clear_pin(lcd_rs_port, lcd_rs_pin);
00080 clear_pin(lcd_rw_port, lcd_rw_pin);
00081 }
00082
00083
00084 void lcd_init() {
00085
00086 delay_ms(16);
00087 lcd_write_nibble(0x03);
00088 lcd_toggle_e();
00089 delay_ms(5);
00090 lcd_write_nibble(0x03);
00091 lcd_toggle_e();
00092 delay_ms(1);
00093 lcd_write_nibble(0x03);
00094 lcd_toggle_e();
00095 lcd_write_nibble(0x02);
00096 lcd_toggle_e();
00097
00098
00099
00100 lcd_write_command(0b00101000);
00101
00102 lcd_write_command(0b00001000);
00103
00104 lcd_write_command(0b00000110);
00105
00106 lcd_write_command(0b00001100);
00107
00108 lcd_write_command(LCD_CLEAR_DISP);
00109 lcd_write_command(LCD_RETURN_HOME);
00110
00111 }
00112
00113 void lcd_write_command(uns8 data) {
00114
00115 lcd_wait_busy();
00116
00117 clear_pin(lcd_rs_port, lcd_rs_pin);
00118 clear_pin(lcd_rw_port, lcd_rw_pin);
00119
00120 lcd_write_byte(data);
00121 }
00122
00123 void lcd_write_data(uns8 data) {
00124 lcd_wait_busy();
00125
00126 set_pin(lcd_rs_port, lcd_rs_pin);
00127 clear_pin(lcd_rw_port, lcd_rw_pin);
00128
00129 lcd_write_byte(data);
00130 }
00131
00132 void lcd_write_data_str(char *str) {
00133
00134 lcd_wait_busy();
00135
00136 set_pin(lcd_rs_port, lcd_rs_pin);
00137 clear_pin(lcd_rw_port, lcd_rw_pin);
00138
00139
00140 while (*str) {
00141 lcd_write_byte(*str++);
00142 }
00143 }
00144
00145 void lcd_write_data_int(uns16 i) {
00146
00147 char buffer[6];
00148
00149 itoa( i, buffer, 10 );
00150 lcd_write_data_str(buffer);
00151 }
00152
00153
00154 void lcd_wait_busy() {
00155
00156
00157 set_bit(tris_array[lcd_db7_port - PORTA], lcd_db7_pin);
00158 set_bit(tris_array[lcd_db6_port - PORTA], lcd_db6_pin);
00159 set_bit(tris_array[lcd_db5_port - PORTA], lcd_db5_pin);
00160 set_bit(tris_array[lcd_db4_port - PORTA], lcd_db4_pin);
00161
00162
00163 clear_pin(lcd_rs_port, lcd_rs_pin);
00164 set_pin(lcd_rw_port, lcd_rw_pin);
00165
00166 char counter = 0;
00167
00168 set_pin(lcd_e_port, lcd_e_pin);
00169
00170
00171 while ((test_pin(lcd_db7_port, lcd_db7_pin) == 1) && counter < 0xF0){
00172 clear_pin(lcd_e_port, lcd_e_pin);
00173 set_pin(lcd_e_port, lcd_e_pin);
00174 delay_us(100);
00175 clear_pin(lcd_e_port, lcd_e_pin);
00176
00177 counter++;
00178 }
00179
00180
00181
00182 if (counter == 0xF0) {
00183 }
00184
00185 clear_bit(tris_array[lcd_db7_port - PORTA], lcd_db7_pin);
00186 clear_bit(tris_array[lcd_db6_port - PORTA], lcd_db6_pin);
00187 clear_bit(tris_array[lcd_db5_port - PORTA], lcd_db5_pin);
00188 clear_bit(tris_array[lcd_db4_port - PORTA], lcd_db4_pin);
00189
00190 return;
00191 }
00192
00193 void lcd_set_ddram_pos(uns8 x) {
00194 x.7 = 1;
00195 lcd_write_command(x);
00196 }
00197
00198 void lcd_set_cgram_pos(uns8 x) {
00199 x.7 = 0;
00200 x.6 = 1;
00201 lcd_write_command(x);
00202 }
00203
00204 void lcd_cursor_home() {
00205 lcd_write_command(LCD_CLEAR_DISP);
00206 }