Library for PAT9125 on L476RG platform

Fork of pat9125_mbed by PixArt Imaging

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?

UserRevisionLine numberNew 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 }