#include "..\config.h" #include "string.h" #include "userDataProcess.h" // Delay ms void delayUs(INT16U us) { INT16U i=0; INT16U j=0; for(i=0; i<=us; i++) { for(j=0; j<=16; j++); } } // Delay us void delayMs(INT16U ms) { INT16U i=0; for(i=0; i<=ms; i++) { delayUs(1000); } } // Initialize "RS", "RW" and "E" to be output PIN void lcdControlPinInit(void) { FIO0DIR |= RS; // "RS" PIN is output FIO0DIR |= RW; // "RW" PIN is output FIO0DIR |= E; // "E" PIN is output } // Set DB7~DB0 to be input or output // direction=1 -> input; direction=0(or other value of non "1") -> output; void lcdDdataPinsDirectionSet(INT8U direction) { if(direction==1) { FIO1DIR &= ~DB7; // DB7 input FIO1DIR &= ~DB6; // DB6 input FIO1DIR &= ~DB5; // DB5 input FIO1DIR &= ~DB4; // DB4 input FIO1DIR &= ~DB3; // DB3 input FIO1DIR &= ~DB2; // DB2 input FIO1DIR &= ~DB1; // DB1 input FIO1DIR &= ~DB0; // DB0 input } else { FIO1DIR |= DB7; // DB7 output FIO1DIR |= DB6; // DB7 output FIO1DIR |= DB5; // DB7 output FIO1DIR |= DB4; // DB7 output FIO1DIR |= DB3; // DB7 output FIO1DIR |= DB2; // DB7 output FIO1DIR |= DB1; // DB7 output FIO1DIR |= DB0; // DB7 output } } // Set "RS" to be '0' or '1' // Input: 0->Low; 1->High void setRS(INT8U RS_value) { if(RS_value == 0) { FIO0CLR = RS; // RS=0 } else { FIO0SET = RS; // RS=1 } } // Set "RW" to be '0' or '1' // Input: 0->Low; 1->High void setRW(INT8U RW_value) { if(RW_value == 0) { FIO0CLR = RW; // RW=0 } else { FIO0SET = RW; // RW=1 } } // Set "E" to be '0' or '1' // Input: 0->Low; 1->High void setE(INT8U E_value) { if(E_value == 0) { FIO0CLR = E; // E=0 } else { FIO0SET = E; // E=1 } } // Input: Refer to Command Set of Data Sheet void writeComd(INT8U comd) { lcdDdataPinsDirectionSet(0); // DB7~DB0 output setRW(0); setRS(0); // Write instruction register if(comd&0x80) FIO1SET = DB7; else FIO1CLR = DB7; if(comd&0x40) FIO1SET = DB6; else FIO1CLR = DB6; if(comd&0x20) FIO1SET = DB5; else FIO1CLR = DB5; if(comd&0x10) FIO1SET = DB4; else FIO1CLR = DB4; if(comd&0x08) FIO1SET = DB3; else FIO1CLR = DB3; if(comd&0x04) FIO1SET = DB2; else FIO1CLR = DB2; if(comd&0x02) FIO1SET = DB1; else FIO1CLR = DB1; if(comd&0x01) FIO1SET = DB0; else FIO1CLR = DB0; delayUs(2); setE(1); delayUs(5); setE(0); delayMs(1); } // дdata, with check "BUSY" // Input: Refer to Data Sheet void writeData(INT8U data) { lcdDdataPinsDirectionSet(0); // DB7~DB0 output setRW(0); setRS(1); // Write data register if(data&0x80) FIO1SET = DB7; else FIO1CLR = DB7; // P1_20=DB7 if(data&0x40) FIO1SET = DB6; else FIO1CLR = DB6; // P1_21=DB6 if(data&0x20) FIO1SET = DB5; else FIO1CLR = DB5; // P1_28=DB5 if(data&0x10) FIO1SET = DB4; else FIO1CLR = DB4; // P1_29=DB4 if(data&0x08) FIO1SET = DB3; else FIO1CLR = DB3; // P1_25=DB3 if(data&0x04) FIO1SET = DB2; else FIO1CLR = DB2; // P1_26=DB2 if(data&0x02) FIO1SET = DB1; else FIO1CLR = DB1; // P1_19=DB1 if(data&0x01) FIO1SET = DB0; else FIO1CLR = DB0; // P1_22=DB0 delayUs(2); setE(1); delayUs(5); setE(0); delayMs(1); } // LCM initialization void lcdInit(void) { delayMs(20); writeComd_NoCheckBusy(0x38); delayUs(100); // Function Set writeComd_NoCheckBusy(0x38); delayUs(100); // Function Set writeComd_NoCheckBusy(0x38); delayUs(100); // Function Set writeComd(0x38); delayUs(100); // Function Set writeComd(0x08); delayUs(100); // Display ON/OFF control writeComd(0x01); delayMs(10); // Clear display writeComd(0x06); delayUs(100); // Entry mode set writeComd(0x0c); delayUs(100); // Display ON/OFF control } /****************** Display Position Address Map (Hex)************************ * 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 (column) * row1 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 * row2 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 * row3 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 * row4 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 ******************************************************************************/ // Print A CHARACTER on specific position of LCD // Input: row -> 1~4; // column -> 1~20; // ch -> ASCII character void printCharacter(INT8U row, INT8U column, unsigned char ch) { if(row==1) { switch(column) { case 1: {writeComd(0x80); writeData(ch); break;} case 2: {writeComd(0x81); writeData(ch); break;} case 3: {writeComd(0x82); writeData(ch); break;} case 4: {writeComd(0x83); writeData(ch); break;} case 5: {writeComd(0x84); writeData(ch); break;} case 6: {writeComd(0x85); writeData(ch); break;} case 7: {writeComd(0x86); writeData(ch); break;} case 8: {writeComd(0x87); writeData(ch); break;} case 9: {writeComd(0x88); writeData(ch); break;} case 10: {writeComd(0x89); writeData(ch); break;} case 11: {writeComd(0x8a); writeData(ch); break;} case 12: {writeComd(0x8b); writeData(ch); break;} case 13: {writeComd(0x8c); writeData(ch); break;} case 14: {writeComd(0x8d); writeData(ch); break;} case 15: {writeComd(0x8e); writeData(ch); break;} case 16: {writeComd(0x8f); writeData(ch); break;} case 17: {writeComd(0x90); writeData(ch); break;} case 18: {writeComd(0x91); writeData(ch); break;} case 19: {writeComd(0x92); writeData(ch); break;} case 20: {writeComd(0x93); writeData(ch); break;} default: break; } } else if(row==2) { switch(column) { case 1: {writeComd(0xc0); writeData(ch); break;} case 2: {writeComd(0xc1); writeData(ch); break;} case 3: {writeComd(0xc2); writeData(ch); break;} case 4: {writeComd(0xc3); writeData(ch); break;} case 5: {writeComd(0xc4); writeData(ch); break;} case 6: {writeComd(0xc5); writeData(ch); break;} case 7: {writeComd(0xc6); writeData(ch); break;} case 8: {writeComd(0xc7); writeData(ch); break;} case 9: {writeComd(0xc8); writeData(ch); break;} case 10: {writeComd(0xc9); writeData(ch); break;} case 11: {writeComd(0xca); writeData(ch); break;} case 12: {writeComd(0xcb); writeData(ch); break;} case 13: {writeComd(0xcc); writeData(ch); break;} case 14: {writeComd(0xcd); writeData(ch); break;} case 15: {writeComd(0xce); writeData(ch); break;} case 16: {writeComd(0xcf); writeData(ch); break;} case 17: {writeComd(0xd0); writeData(ch); break;} case 18: {writeComd(0xd1); writeData(ch); break;} case 19: {writeComd(0xd2); writeData(ch); break;} case 20: {writeComd(0xd3); writeData(ch); break;} default: break; } } else if(row==3) { switch(column) { case 1: {writeComd(0x94); writeData(ch); break;} case 2: {writeComd(0x95); writeData(ch); break;} case 3: {writeComd(0x96); writeData(ch); break;} case 4: {writeComd(0x97); writeData(ch); break;} case 5: {writeComd(0x98); writeData(ch); break;} case 6: {writeComd(0x99); writeData(ch); break;} case 7: {writeComd(0x9a); writeData(ch); break;} case 8: {writeComd(0x9b); writeData(ch); break;} case 9: {writeComd(0x9c); writeData(ch); break;} case 10: {writeComd(0x9d); writeData(ch); break;} case 11: {writeComd(0x9e); writeData(ch); break;} case 12: {writeComd(0x9f); writeData(ch); break;} case 13: {writeComd(0xa0); writeData(ch); break;} case 14: {writeComd(0xa1); writeData(ch); break;} case 15: {writeComd(0xa2); writeData(ch); break;} case 16: {writeComd(0xa3); writeData(ch); break;} case 17: {writeComd(0xa4); writeData(ch); break;} case 18: {writeComd(0xa5); writeData(ch); break;} case 19: {writeComd(0xa6); writeData(ch); break;} case 20: {writeComd(0xa7); writeData(ch); break;} default: break; } } else if(row==4) { switch(column) { case 1: {writeComd(0xd4); writeData(ch); break;} case 2: {writeComd(0xd5); writeData(ch); break;} case 3: {writeComd(0xd6); writeData(ch); break;} case 4: {writeComd(0xd7); writeData(ch); break;} case 5: {writeComd(0xd8); writeData(ch); break;} case 6: {writeComd(0xd9); writeData(ch); break;} case 7: {writeComd(0xda); writeData(ch); break;} case 8: {writeComd(0xdb); writeData(ch); break;} case 9: {writeComd(0xdc); writeData(ch); break;} case 10: {writeComd(0xdd); writeData(ch); break;} case 11: {writeComd(0xde); writeData(ch); break;} case 12: {writeComd(0xdf); writeData(ch); break;} case 13: {writeComd(0xe0); writeData(ch); break;} case 14: {writeComd(0xe1); writeData(ch); break;} case 15: {writeComd(0xe2); writeData(ch); break;} case 16: {writeComd(0xe3); writeData(ch); break;} case 17: {writeComd(0xe4); writeData(ch); break;} case 18: {writeComd(0xe5); writeData(ch); break;} case 19: {writeComd(0xe6); writeData(ch); break;} case 20: {writeComd(0xe7); writeData(ch); break;} default: break; } } }