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