00001
00002
00003
00004
00005
00006
00007
00008 #include "lcd-twi.h"
00009 #include "twi.h"
00010 #include <util/delay.h>
00011 #include "uart_i.h"
00012 #define DB(PIN) (1<<PIN)
00013 #define ENWAIT 1500
00014 #define HOLD 50
00015
00016 #define RS (1<<4)
00017 #define RW (1<<5)
00018 #define EN (1<<6)
00019 #define DB4 (1<<0)
00020 #define DB5 (1<<1)
00021 #define DB6 (1<<2)
00022 #define DB7 (1<<3)
00023
00024 #define puts(ARG) puts_i(ARG,0)
00025
00026
00027
00028
00029
00030 static int SendRawData(uint8_t addr,uint8_t data){
00031 return TWIMasterTransmit(addr,&data,1);
00032 }
00033
00034
00035
00036
00037
00038
00039 static int SendInitData(uint8_t addr,uint8_t data){
00040
00041 if(SendRawData(addr, data)){
00042 return -1;
00043 }
00044 if(SendRawData(addr,data|EN)){
00045 return -1;
00046 }
00047 _delay_us(ENWAIT);
00048
00049 if(SendRawData(addr,data)){
00050 return -1;
00051 }
00052 _delay_us(HOLD);
00053
00054 return 0;
00055
00056 }
00057
00058 static int BusyWait(uint8_t addr){
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00073
00074 _delay_us(50);
00075 return 0;
00076 }
00077
00078
00079 static int SendIns(uint8_t addr,uint8_t ins){
00080 uint8_t send=0;
00081 send=ins;
00082
00083 send=send>>4;
00084
00085
00086
00087
00088 if(SendRawData(addr,send)){
00089 return -1;
00090 }
00091
00092 if(SendRawData(addr,send|EN)){
00093 return -1;
00094 }
00095 _delay_us(ENWAIT);
00096 if(SendRawData(addr,send)){
00097 return -1;
00098 }
00099 _delay_us(HOLD);
00100
00101
00102
00103 send = ins &0x0f;
00104
00105
00106
00107
00108
00109 if(SendRawData(addr,send)){
00110 return -1;
00111 }
00112
00113 if(SendRawData(addr,send|EN)){
00114 return -1;
00115 }
00116 _delay_us(ENWAIT);
00117 if(SendRawData(addr,send)){
00118 return -1;
00119 }
00120 _delay_us(HOLD);
00121
00122 return BusyWait(addr);
00123 }
00124
00125 static int SendDat(uint8_t addr,int8_t dat){
00126 uint8_t send=0;
00127
00128 send=dat>>4;
00129 if(SendRawData(addr, send|RS)){
00130 return -1;
00131 }
00132 if(SendRawData(addr, send|RS|EN)){
00133 return -1;
00134 }
00135 _delay_us(ENWAIT);
00136 if(SendRawData(addr, send|RS)){
00137 return -1;
00138 }
00139 _delay_us(HOLD);
00140
00141
00142
00143 send = (dat&0x0f);
00144
00145
00146 if(SendRawData(addr, send|RS)){
00147 return -1;
00148 }
00149 if(SendRawData(addr, send|RS|EN)){
00150 return -1;
00151 }
00152 _delay_us(ENWAIT);
00153 if(SendRawData(addr, send|RS)){
00154 return -1;
00155 }
00156 _delay_us(HOLD);
00157
00158 return BusyWait(addr);
00159 }
00160
00161
00162 int LCDInit(uint8_t addr){
00163 int8_t data=0;
00164 int c=1;
00165 TWI_Init_default();
00166
00167 _delay_ms(16);
00168
00169
00170 data=DB5|DB4;
00171 c=SendInitData(addr,data);
00172 if(c!=0){
00173 return c;
00174 }
00175 _delay_ms(5);
00176 c=SendInitData(addr,data);
00177 if(c!=0){
00178 return c;
00179 }
00180 _delay_us(120);
00181 c=SendInitData(addr,data);
00182 if(c!=0){
00183 return c;
00184 }
00185
00186 BusyWait(addr);
00187
00188 data=DB5;
00189 c=SendInitData(addr,data);
00190 if(c!=0){
00191 return c;
00192 }
00193 BusyWait(addr);
00194
00195
00196
00197
00198 c=SendIns(addr, DB(5)|DB(3)|DB(2));
00199
00200
00201
00202
00203
00204 data=0;
00205 c=SendIns(addr,DB(0));
00206 if(c!=0){
00207 return c;
00208 }
00209
00210 c=SendIns(addr, DB(0));
00211 if(c!=0){
00212 return c;
00213 }
00214
00215 BusyWait(addr);
00216 BusyWait(addr);
00217
00218
00219
00220
00221
00222 SendIns(addr, DB(2)|DB(1) );
00223
00224
00225 BusyWait(addr);
00226
00227 data=DB(3)|DB(2)|DB(1);
00228 return SendIns(addr,data);
00229
00230 }
00231
00232 int LCD_enable_blink(int8_t addr){
00233
00234
00235
00236
00237 return SendIns(addr,DB(3)|DB(2)|DB(1));
00238
00239 }
00240
00241 int LCD_disable_cursor(uint8_t addr){
00242 return SendIns(addr, DB(3)|DB(2));
00243 }
00244
00245 int LCD_enable_cursor(uint8_t addr){
00246 return SendIns(addr,DB(3)|DB(2)|DB(1));
00247 }
00248
00249 int LCD_clear(uint8_t addr){
00250 int c=0;
00251 c=SendIns(addr, DB(0));
00252 _delay_ms(2);
00253 return c;
00254 }
00255
00256 int LCD_setpos(uint8_t addr, uint8_t position){
00257 return SendIns(addr, 0x80|position);
00258
00259 }
00260
00261 int LCD_return(uint8_t addr){
00262 int c=0;
00263 c=SendIns(addr, DB(1));
00264 _delay_us(1500);
00265 return c;
00266 }
00267
00268 int LCD_putc(uint8_t addr,char c){
00269 int r;
00270 r=SendDat(addr, c);
00271 return r;
00272 }
00273
00274 int LCD_puts(uint8_t addr, char * string){
00275 int i=0,r=0;
00276 while((*(string+i)!='\0')&&r==0){
00277 r=LCD_putc(addr,string[i]);
00278 i++;
00279 }
00280 return r;
00281 }