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 #include "pic24_all.h"
00031
00032
00045 #define RS_HIGH() _LATB15 = 1
00046 #define RS_LOW() _LATB15 = 0
00047 #define CONFIG_RS() CONFIG_RB15_AS_DIG_OUTPUT()
00048
00049 #define RW_HIGH() _LATD5 = 1
00050 #define RW_LOW() _LATD5 = 0
00051 #define CONFIG_RW() CONFIG_RD5_AS_DIG_OUTPUT()
00052
00053 #define E_HIGH() _LATD4 = 1
00054 #define E_LOW() _LATD4 = 0
00055 #define CONFIG_E() CONFIG_RD4_AS_DIG_OUTPUT()
00056
00057 #define LCD4O _LATE4
00058 #define LCD5O _LATE5
00059 #define LCD6O _LATE6
00060 #define LCD7O _LATE7
00061 #define LCD7I _RE7
00062
00063 #define CONFIG_LCD4_AS_INPUT() CONFIG_RE4_AS_DIG_INPUT()
00064 #define CONFIG_LCD5_AS_INPUT() CONFIG_RE5_AS_DIG_INPUT()
00065 #define CONFIG_LCD6_AS_INPUT() CONFIG_RE6_AS_DIG_INPUT()
00066 #define CONFIG_LCD7_AS_INPUT() CONFIG_RE7_AS_DIG_INPUT()
00067
00068 #define CONFIG_LCD4_AS_OUTPUT() CONFIG_RE4_AS_DIG_OUTPUT()
00069 #define CONFIG_LCD5_AS_OUTPUT() CONFIG_RE5_AS_DIG_OUTPUT()
00070 #define CONFIG_LCD6_AS_OUTPUT() CONFIG_RE6_AS_DIG_OUTPUT()
00071 #define CONFIG_LCD7_AS_OUTPUT() CONFIG_RE7_AS_DIG_OUTPUT()
00072
00073 #define GET_BUSY_FLAG() LCD7I
00074
00080
00081 void configBusAsOutLCD(void) {
00082 RW_LOW();
00083 CONFIG_LCD4_AS_OUTPUT();
00084 CONFIG_LCD5_AS_OUTPUT();
00085 CONFIG_LCD6_AS_OUTPUT();
00086 CONFIG_LCD7_AS_OUTPUT();
00087 }
00088
00089
00090 void configBusAsInLCD(void) {
00091 CONFIG_LCD4_AS_INPUT();
00092 CONFIG_LCD5_AS_INPUT();
00093 CONFIG_LCD6_AS_INPUT();
00094 CONFIG_LCD7_AS_INPUT();
00095 RW_HIGH();
00096 }
00097
00098
00099 void outputToBusLCD(uint8 u8_c) {
00100 LCD4O = u8_c & 0x01;
00101 LCD5O = (u8_c >> 1)& 0x01;
00102 LCD6O = (u8_c >> 2)& 0x01;
00103 LCD7O = (u8_c >> 3)& 0x01;
00104 }
00105
00106
00107 void configControlLCD(void) {
00108 CONFIG_RS();
00109 CONFIG_RW();
00110 CONFIG_E();
00111 RW_LOW();
00112 E_LOW();
00113 RS_LOW();
00114 }
00115
00116
00117
00118 void pulseE(void) {
00119 DELAY_US(1);
00120 E_HIGH();
00121 DELAY_US(1);
00122 E_LOW();
00123 DELAY_US(1);
00124 }
00125
00126
00127
00128
00129
00130
00131 void writeLCD(uint8 u8_Cmd, uint8 u8_DataFlag,
00132 uint8 u8_CheckBusy, uint8 u8_Send8Bits) {
00133
00134 uint8 u8_BusyFlag;
00135 uint8 u8_wdtState;
00136 if (u8_CheckBusy) {
00137 RS_LOW();
00138
00139 configBusAsInLCD();
00140 u8_wdtState = _SWDTEN;
00141 CLRWDT();
00142 _SWDTEN = 1;
00143 do {
00144 E_HIGH();
00145 DELAY_US(1);
00146 u8_BusyFlag = GET_BUSY_FLAG();
00147 E_LOW();
00148 DELAY_US(1);
00149 pulseE();
00150 } while (u8_BusyFlag);
00151 _SWDTEN = u8_wdtState;
00152 } else {
00153 DELAY_MS(10);
00154 }
00155 configBusAsOutLCD();
00156 if (u8_DataFlag) RS_HIGH();
00157 else RS_LOW();
00158 outputToBusLCD(u8_Cmd >> 4);
00159 pulseE();
00160 if (u8_Send8Bits) {
00161 outputToBusLCD(u8_Cmd);
00162 pulseE();
00163 }
00164 }
00165
00166
00167 void initLCD() {
00168 DELAY_MS(50);
00169 writeLCD(0x28,0,0,0);
00170 writeLCD(0x28,0,1,1);
00171 writeLCD(0x06,0,0,1);
00172 writeLCD(0x0C,0,0,1);
00173 writeLCD(0x01,0,0,1);
00174 DELAY_MS(3);
00175 }
00176
00177
00178 void outStringLCD(char *psz_s) {
00179 while (*psz_s) {
00180 writeLCD(*psz_s, 1, 1,1);
00181 psz_s++;
00182 }
00183 }
00184
00185
00186 int main (void) {
00187 configBasic(HELLO_MSG);
00188
00189 configControlLCD();
00190 initLCD();
00191
00192 outStringLCD("******Hello, my name is Bob********");
00193 writeLCD(0xC0,0,1,1);
00194 outStringLCD("-----these lines are moving!-------");
00195 while (1) {
00196 writeLCD(0x18,0,1,1);
00197 DELAY_MS(200);
00198 doHeartbeat();
00199 }
00200 }