Library for PAT9125 on L476RG platform
Fork of pat9125_mbed by
pixart_lcm.cpp@1:4b7c15d9c864, 2018-02-01 (annotated)
- Committer:
- pixus_mbed
- Date:
- Thu Feb 01 02:21:50 2018 +0000
- Revision:
- 1:4b7c15d9c864
Merge pixart_lcm to pat9125_mbed.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
pixus_mbed | 1:4b7c15d9c864 | 1 | #include "pixart_lcm.h" |
pixus_mbed | 1:4b7c15d9c864 | 2 | |
pixus_mbed | 1:4b7c15d9c864 | 3 | |
pixus_mbed | 1:4b7c15d9c864 | 4 | |
pixus_mbed | 1:4b7c15d9c864 | 5 | typedef struct |
pixus_mbed | 1:4b7c15d9c864 | 6 | { |
pixus_mbed | 1:4b7c15d9c864 | 7 | SPI *pSPI ; |
pixus_mbed | 1:4b7c15d9c864 | 8 | DigitalOut *pCSB; |
pixus_mbed | 1:4b7c15d9c864 | 9 | DigitalOut *pRSTB; |
pixus_mbed | 1:4b7c15d9c864 | 10 | DigitalOut *pRS; |
pixus_mbed | 1:4b7c15d9c864 | 11 | } pixart_lcm_state_s; |
pixus_mbed | 1:4b7c15d9c864 | 12 | |
pixus_mbed | 1:4b7c15d9c864 | 13 | static pixart_lcm_state_s g_state ; |
pixus_mbed | 1:4b7c15d9c864 | 14 | |
pixus_mbed | 1:4b7c15d9c864 | 15 | |
pixus_mbed | 1:4b7c15d9c864 | 16 | #define LOW 0 |
pixus_mbed | 1:4b7c15d9c864 | 17 | #define HIGH 1 |
pixus_mbed | 1:4b7c15d9c864 | 18 | #define PIN_LCM_RS g_state.pRS |
pixus_mbed | 1:4b7c15d9c864 | 19 | #define PIN_LCM_RSTB g_state.pRSTB |
pixus_mbed | 1:4b7c15d9c864 | 20 | #define PIN_LCM_CSB g_state.pCSB |
pixus_mbed | 1:4b7c15d9c864 | 21 | #define digitalWrite(pin,level) *pin = level |
pixus_mbed | 1:4b7c15d9c864 | 22 | #define LCM_RS_LO digitalWrite(PIN_LCM_RS,LOW) |
pixus_mbed | 1:4b7c15d9c864 | 23 | #define LCM_RS_HI digitalWrite(PIN_LCM_RS,HIGH) |
pixus_mbed | 1:4b7c15d9c864 | 24 | #define LCM_RSTB_LO digitalWrite(PIN_LCM_RSTB,LOW) |
pixus_mbed | 1:4b7c15d9c864 | 25 | #define LCM_RSTB_HI digitalWrite(PIN_LCM_RSTB,HIGH) |
pixus_mbed | 1:4b7c15d9c864 | 26 | #define LCM_CSB_LO digitalWrite(PIN_LCM_CSB,LOW) |
pixus_mbed | 1:4b7c15d9c864 | 27 | #define LCM_CSB_HI digitalWrite(PIN_LCM_CSB,HIGH) |
pixus_mbed | 1:4b7c15d9c864 | 28 | |
pixus_mbed | 1:4b7c15d9c864 | 29 | #define I2C_ADDRESS (0x73 << 1) |
pixus_mbed | 1:4b7c15d9c864 | 30 | #define delayMicroseconds(us) wait_us(us) |
pixus_mbed | 1:4b7c15d9c864 | 31 | #define delay(ms) wait_ms(ms) |
pixus_mbed | 1:4b7c15d9c864 | 32 | |
pixus_mbed | 1:4b7c15d9c864 | 33 | //----------------------------------------------------------------------- |
pixus_mbed | 1:4b7c15d9c864 | 34 | unsigned char hex2dec_nibble(unsigned char hex_nibble) |
pixus_mbed | 1:4b7c15d9c864 | 35 | { |
pixus_mbed | 1:4b7c15d9c864 | 36 | unsigned char dec; |
pixus_mbed | 1:4b7c15d9c864 | 37 | |
pixus_mbed | 1:4b7c15d9c864 | 38 | switch(hex_nibble) |
pixus_mbed | 1:4b7c15d9c864 | 39 | { |
pixus_mbed | 1:4b7c15d9c864 | 40 | case 0xA: dec=10; break; |
pixus_mbed | 1:4b7c15d9c864 | 41 | case 0xB: dec=11; break; |
pixus_mbed | 1:4b7c15d9c864 | 42 | case 0xC: dec=12; break; |
pixus_mbed | 1:4b7c15d9c864 | 43 | case 0xD: dec=13; break; |
pixus_mbed | 1:4b7c15d9c864 | 44 | case 0xE: dec=14; break; |
pixus_mbed | 1:4b7c15d9c864 | 45 | case 0xF: dec=15; break; |
pixus_mbed | 1:4b7c15d9c864 | 46 | default: dec=hex_nibble; break; |
pixus_mbed | 1:4b7c15d9c864 | 47 | } |
pixus_mbed | 1:4b7c15d9c864 | 48 | |
pixus_mbed | 1:4b7c15d9c864 | 49 | return (dec); |
pixus_mbed | 1:4b7c15d9c864 | 50 | } |
pixus_mbed | 1:4b7c15d9c864 | 51 | |
pixus_mbed | 1:4b7c15d9c864 | 52 | unsigned int hex2dec_word(unsigned int hex_word) |
pixus_mbed | 1:4b7c15d9c864 | 53 | { |
pixus_mbed | 1:4b7c15d9c864 | 54 | unsigned char dec_nb[4]; |
pixus_mbed | 1:4b7c15d9c864 | 55 | unsigned char nibble3=(hex_word>>12)&0x000f; |
pixus_mbed | 1:4b7c15d9c864 | 56 | unsigned char nibble2=(hex_word>>8)&0x000f; |
pixus_mbed | 1:4b7c15d9c864 | 57 | unsigned char nibble1=(hex_word>>4)&0x000f; |
pixus_mbed | 1:4b7c15d9c864 | 58 | unsigned char nibble0=hex_word&0x000f; |
pixus_mbed | 1:4b7c15d9c864 | 59 | |
pixus_mbed | 1:4b7c15d9c864 | 60 | dec_nb[3]=hex2dec_nibble(nibble3); |
pixus_mbed | 1:4b7c15d9c864 | 61 | dec_nb[2]=hex2dec_nibble(nibble2); |
pixus_mbed | 1:4b7c15d9c864 | 62 | dec_nb[1]=hex2dec_nibble(nibble1); |
pixus_mbed | 1:4b7c15d9c864 | 63 | dec_nb[0]=hex2dec_nibble(nibble0); |
pixus_mbed | 1:4b7c15d9c864 | 64 | return ((dec_nb[3]<<12)+(dec_nb[2]<<8)+(dec_nb[1]<<4)+dec_nb[0]); |
pixus_mbed | 1:4b7c15d9c864 | 65 | } |
pixus_mbed | 1:4b7c15d9c864 | 66 | |
pixus_mbed | 1:4b7c15d9c864 | 67 | void LCM_WriteCom(unsigned char Command) |
pixus_mbed | 1:4b7c15d9c864 | 68 | { |
pixus_mbed | 1:4b7c15d9c864 | 69 | LCM_CSB_LO; |
pixus_mbed | 1:4b7c15d9c864 | 70 | LCM_RS_LO; |
pixus_mbed | 1:4b7c15d9c864 | 71 | //SPI.transfer(Command); |
pixus_mbed | 1:4b7c15d9c864 | 72 | g_state.pSPI->write(Command); |
pixus_mbed | 1:4b7c15d9c864 | 73 | LCM_CSB_HI; |
pixus_mbed | 1:4b7c15d9c864 | 74 | |
pixus_mbed | 1:4b7c15d9c864 | 75 | delayMicroseconds(30); |
pixus_mbed | 1:4b7c15d9c864 | 76 | } |
pixus_mbed | 1:4b7c15d9c864 | 77 | |
pixus_mbed | 1:4b7c15d9c864 | 78 | void LCM_WriteData(unsigned char Ascii) |
pixus_mbed | 1:4b7c15d9c864 | 79 | { |
pixus_mbed | 1:4b7c15d9c864 | 80 | LCM_CSB_LO; |
pixus_mbed | 1:4b7c15d9c864 | 81 | LCM_RS_HI; |
pixus_mbed | 1:4b7c15d9c864 | 82 | //SPI.transfer(Ascii); |
pixus_mbed | 1:4b7c15d9c864 | 83 | g_state.pSPI->write(Ascii); |
pixus_mbed | 1:4b7c15d9c864 | 84 | LCM_CSB_HI; |
pixus_mbed | 1:4b7c15d9c864 | 85 | |
pixus_mbed | 1:4b7c15d9c864 | 86 | delayMicroseconds(30); |
pixus_mbed | 1:4b7c15d9c864 | 87 | } |
pixus_mbed | 1:4b7c15d9c864 | 88 | |
pixus_mbed | 1:4b7c15d9c864 | 89 | void LCM_Init(void) |
pixus_mbed | 1:4b7c15d9c864 | 90 | { |
pixus_mbed | 1:4b7c15d9c864 | 91 | LCM_RSTB_LO; |
pixus_mbed | 1:4b7c15d9c864 | 92 | delay(3); |
pixus_mbed | 1:4b7c15d9c864 | 93 | LCM_RSTB_HI; |
pixus_mbed | 1:4b7c15d9c864 | 94 | delay(20); |
pixus_mbed | 1:4b7c15d9c864 | 95 | LCM_WriteCom(0x30); //wake up |
pixus_mbed | 1:4b7c15d9c864 | 96 | delay(3); |
pixus_mbed | 1:4b7c15d9c864 | 97 | LCM_WriteCom(0x30); //wake up |
pixus_mbed | 1:4b7c15d9c864 | 98 | LCM_WriteCom(0x30); //wake up |
pixus_mbed | 1:4b7c15d9c864 | 99 | LCM_WriteCom(0x39); //function set |
pixus_mbed | 1:4b7c15d9c864 | 100 | LCM_WriteCom(0x14); //internal osc frequency |
pixus_mbed | 1:4b7c15d9c864 | 101 | LCM_WriteCom(0x56); //Contrast set |
pixus_mbed | 1:4b7c15d9c864 | 102 | LCM_WriteCom(0x6D); //follower control |
pixus_mbed | 1:4b7c15d9c864 | 103 | LCM_WriteCom(0x75); //contrast// |
pixus_mbed | 1:4b7c15d9c864 | 104 | LCM_WriteCom(0x0C); //display on |
pixus_mbed | 1:4b7c15d9c864 | 105 | LCM_WriteCom(0x06); //entry mode |
pixus_mbed | 1:4b7c15d9c864 | 106 | LCM_WriteCom(0x01); //clear |
pixus_mbed | 1:4b7c15d9c864 | 107 | |
pixus_mbed | 1:4b7c15d9c864 | 108 | delay(10); |
pixus_mbed | 1:4b7c15d9c864 | 109 | } |
pixus_mbed | 1:4b7c15d9c864 | 110 | |
pixus_mbed | 1:4b7c15d9c864 | 111 | void LCM_Clear(void) |
pixus_mbed | 1:4b7c15d9c864 | 112 | { |
pixus_mbed | 1:4b7c15d9c864 | 113 | LCM_WriteCom(0x01); |
pixus_mbed | 1:4b7c15d9c864 | 114 | |
pixus_mbed | 1:4b7c15d9c864 | 115 | delay(2); |
pixus_mbed | 1:4b7c15d9c864 | 116 | } |
pixus_mbed | 1:4b7c15d9c864 | 117 | |
pixus_mbed | 1:4b7c15d9c864 | 118 | void LCM_SetPosition(unsigned char line, unsigned char position)//line=1 or 2; position=1~16 |
pixus_mbed | 1:4b7c15d9c864 | 119 | { |
pixus_mbed | 1:4b7c15d9c864 | 120 | unsigned char address; |
pixus_mbed | 1:4b7c15d9c864 | 121 | |
pixus_mbed | 1:4b7c15d9c864 | 122 | address = ((line-1) * 0x40) + (position-1); |
pixus_mbed | 1:4b7c15d9c864 | 123 | address = 0x80 + (address & 0x7F); |
pixus_mbed | 1:4b7c15d9c864 | 124 | |
pixus_mbed | 1:4b7c15d9c864 | 125 | LCM_WriteCom(address); |
pixus_mbed | 1:4b7c15d9c864 | 126 | } |
pixus_mbed | 1:4b7c15d9c864 | 127 | |
pixus_mbed | 1:4b7c15d9c864 | 128 | void LCM_DisplayString(unsigned char line, unsigned char position, const char *ptr) |
pixus_mbed | 1:4b7c15d9c864 | 129 | { |
pixus_mbed | 1:4b7c15d9c864 | 130 | LCM_SetPosition(line,position); |
pixus_mbed | 1:4b7c15d9c864 | 131 | |
pixus_mbed | 1:4b7c15d9c864 | 132 | while (*ptr) |
pixus_mbed | 1:4b7c15d9c864 | 133 | { |
pixus_mbed | 1:4b7c15d9c864 | 134 | LCM_WriteData(*ptr++); |
pixus_mbed | 1:4b7c15d9c864 | 135 | } |
pixus_mbed | 1:4b7c15d9c864 | 136 | } |
pixus_mbed | 1:4b7c15d9c864 | 137 | |
pixus_mbed | 1:4b7c15d9c864 | 138 | void LCM_DisplayDecimal(unsigned char line, unsigned char position, unsigned int hex_word, unsigned char digits) |
pixus_mbed | 1:4b7c15d9c864 | 139 | { |
pixus_mbed | 1:4b7c15d9c864 | 140 | unsigned char sign;//0:positive, 1:negative |
pixus_mbed | 1:4b7c15d9c864 | 141 | unsigned int dec_num; |
pixus_mbed | 1:4b7c15d9c864 | 142 | unsigned char digit[5]; |
pixus_mbed | 1:4b7c15d9c864 | 143 | signed char ii; |
pixus_mbed | 1:4b7c15d9c864 | 144 | |
pixus_mbed | 1:4b7c15d9c864 | 145 | if(hex_word & 0x8000) |
pixus_mbed | 1:4b7c15d9c864 | 146 | sign=1; |
pixus_mbed | 1:4b7c15d9c864 | 147 | else |
pixus_mbed | 1:4b7c15d9c864 | 148 | sign=0; |
pixus_mbed | 1:4b7c15d9c864 | 149 | |
pixus_mbed | 1:4b7c15d9c864 | 150 | if(sign==1) |
pixus_mbed | 1:4b7c15d9c864 | 151 | hex_word=~hex_word+1; |
pixus_mbed | 1:4b7c15d9c864 | 152 | |
pixus_mbed | 1:4b7c15d9c864 | 153 | dec_num=hex2dec_word(hex_word); |
pixus_mbed | 1:4b7c15d9c864 | 154 | digit[4]=dec_num/10000; |
pixus_mbed | 1:4b7c15d9c864 | 155 | digit[3]=(dec_num%10000)/1000; |
pixus_mbed | 1:4b7c15d9c864 | 156 | digit[2]=(dec_num%1000)/100; |
pixus_mbed | 1:4b7c15d9c864 | 157 | digit[1]=(dec_num%100)/10; |
pixus_mbed | 1:4b7c15d9c864 | 158 | digit[0]=dec_num%10; |
pixus_mbed | 1:4b7c15d9c864 | 159 | |
pixus_mbed | 1:4b7c15d9c864 | 160 | LCM_SetPosition(line,position); |
pixus_mbed | 1:4b7c15d9c864 | 161 | |
pixus_mbed | 1:4b7c15d9c864 | 162 | if(sign==1) |
pixus_mbed | 1:4b7c15d9c864 | 163 | LCM_WriteData('-'); |
pixus_mbed | 1:4b7c15d9c864 | 164 | else |
pixus_mbed | 1:4b7c15d9c864 | 165 | LCM_WriteData('+'); |
pixus_mbed | 1:4b7c15d9c864 | 166 | |
pixus_mbed | 1:4b7c15d9c864 | 167 | for(ii=(digits-1);ii>=0;ii--) |
pixus_mbed | 1:4b7c15d9c864 | 168 | { |
pixus_mbed | 1:4b7c15d9c864 | 169 | LCM_WriteData(digit[ii] | 0x30);//decimal to ascii |
pixus_mbed | 1:4b7c15d9c864 | 170 | } |
pixus_mbed | 1:4b7c15d9c864 | 171 | |
pixus_mbed | 1:4b7c15d9c864 | 172 | } |
pixus_mbed | 1:4b7c15d9c864 | 173 | |
pixus_mbed | 1:4b7c15d9c864 | 174 | void LCM_ClearLine(unsigned char line)// line: 1 or 2 |
pixus_mbed | 1:4b7c15d9c864 | 175 | { |
pixus_mbed | 1:4b7c15d9c864 | 176 | LCM_DisplayString(line,1," "); |
pixus_mbed | 1:4b7c15d9c864 | 177 | } |
pixus_mbed | 1:4b7c15d9c864 | 178 | |
pixus_mbed | 1:4b7c15d9c864 | 179 | void LCM_DisplayString_Reset(void) |
pixus_mbed | 1:4b7c15d9c864 | 180 | { |
pixus_mbed | 1:4b7c15d9c864 | 181 | LCM_DisplayString(1,1,"SHAFT"); LCM_DisplayString(1,8,"U/D");LCM_DisplayDecimal(1,12,0x000,4); |
pixus_mbed | 1:4b7c15d9c864 | 182 | LCM_DisplayString(2,1,"SPRING");LCM_DisplayString(2,8,"P/R");LCM_DisplayDecimal(2,12,0x000,4); |
pixus_mbed | 1:4b7c15d9c864 | 183 | } |
pixus_mbed | 1:4b7c15d9c864 | 184 | |
pixus_mbed | 1:4b7c15d9c864 | 185 | void LCM_DisplayString_Boot(boolean sen_status) |
pixus_mbed | 1:4b7c15d9c864 | 186 | { |
pixus_mbed | 1:4b7c15d9c864 | 187 | LCM_DisplayString(1,1,"PixArt Shaft EVK"); |
pixus_mbed | 1:4b7c15d9c864 | 188 | LCM_DisplayString(2,1,"PAT9125 FW V2.40"); |
pixus_mbed | 1:4b7c15d9c864 | 189 | delay(2000); |
pixus_mbed | 1:4b7c15d9c864 | 190 | |
pixus_mbed | 1:4b7c15d9c864 | 191 | LCM_ClearLine(1); |
pixus_mbed | 1:4b7c15d9c864 | 192 | LCM_ClearLine(2); |
pixus_mbed | 1:4b7c15d9c864 | 193 | |
pixus_mbed | 1:4b7c15d9c864 | 194 | if(sen_status == true) |
pixus_mbed | 1:4b7c15d9c864 | 195 | { |
pixus_mbed | 1:4b7c15d9c864 | 196 | LCM_DisplayString_Reset(); |
pixus_mbed | 1:4b7c15d9c864 | 197 | } |
pixus_mbed | 1:4b7c15d9c864 | 198 | else |
pixus_mbed | 1:4b7c15d9c864 | 199 | { |
pixus_mbed | 1:4b7c15d9c864 | 200 | LCM_DisplayString(2,1,"Read Sensor Fail"); |
pixus_mbed | 1:4b7c15d9c864 | 201 | //while(1);//stop here if read sensor fail as a warning. |
pixus_mbed | 1:4b7c15d9c864 | 202 | } |
pixus_mbed | 1:4b7c15d9c864 | 203 | } |
pixus_mbed | 1:4b7c15d9c864 | 204 | |
pixus_mbed | 1:4b7c15d9c864 | 205 | //----------------------------------------------------------------------- |
pixus_mbed | 1:4b7c15d9c864 | 206 | |
pixus_mbed | 1:4b7c15d9c864 | 207 | pixart_lcm::pixart_lcm(SPI *pSPI, DigitalOut *pCSB, DigitalOut *pRSTB, DigitalOut *pRS) |
pixus_mbed | 1:4b7c15d9c864 | 208 | { |
pixus_mbed | 1:4b7c15d9c864 | 209 | g_state.pSPI = pSPI; |
pixus_mbed | 1:4b7c15d9c864 | 210 | g_state.pCSB = pCSB; |
pixus_mbed | 1:4b7c15d9c864 | 211 | g_state.pRSTB = pRSTB; |
pixus_mbed | 1:4b7c15d9c864 | 212 | g_state.pRS = pRS; |
pixus_mbed | 1:4b7c15d9c864 | 213 | *g_state.pRS = 1; |
pixus_mbed | 1:4b7c15d9c864 | 214 | LCM_Init(); |
pixus_mbed | 1:4b7c15d9c864 | 215 | } |
pixus_mbed | 1:4b7c15d9c864 | 216 | |
pixus_mbed | 1:4b7c15d9c864 | 217 | void pixart_lcm::LCM_DisplayString(unsigned char line, unsigned char position, const char *ptr) |
pixus_mbed | 1:4b7c15d9c864 | 218 | { |
pixus_mbed | 1:4b7c15d9c864 | 219 | ::LCM_DisplayString(line, position, ptr); |
pixus_mbed | 1:4b7c15d9c864 | 220 | } |
pixus_mbed | 1:4b7c15d9c864 | 221 | void pixart_lcm::LCM_DisplayDecimal(unsigned char line, unsigned char position, unsigned int hex_word, unsigned char digits) |
pixus_mbed | 1:4b7c15d9c864 | 222 | { |
pixus_mbed | 1:4b7c15d9c864 | 223 | ::LCM_DisplayDecimal(line, position, hex_word, digits); |
pixus_mbed | 1:4b7c15d9c864 | 224 | } |
pixus_mbed | 1:4b7c15d9c864 | 225 | void pixart_lcm::LCM_DisplayString_Reset(void) |
pixus_mbed | 1:4b7c15d9c864 | 226 | { |
pixus_mbed | 1:4b7c15d9c864 | 227 | ::LCM_DisplayString_Reset(); |
pixus_mbed | 1:4b7c15d9c864 | 228 | } |
pixus_mbed | 1:4b7c15d9c864 | 229 | void pixart_lcm::LCM_DisplayString_Boot(boolean sen_status) |
pixus_mbed | 1:4b7c15d9c864 | 230 | { |
pixus_mbed | 1:4b7c15d9c864 | 231 | ::LCM_DisplayString_Boot(sen_status); |
pixus_mbed | 1:4b7c15d9c864 | 232 | } |