C文件
#define _LCD_ODEV_C_ #include "LCD_odev.h" #include "fonts.h" //ASCII×Ö·ûÐÍ×Ö¿â void LCD_Delay(unsigned short int i) { while(i--); } void LCD_wt8bitData(unsigned char da) //·¢ËÍÊý¾Ý-8λ²ÎÊý { LCD_CS_en(); LCD_DC_data(); SPI1_ReadWriteByte(da); LCD_CS_dis(); } void LCD_wt16bitData(unsigned short int da) { LCD_CS_en(); LCD_DC_data(); SPI1_ReadWriteByte(da>>8); SPI1_ReadWriteByte(da&0xFF); LCD_CS_dis(); } void LCD_wtREG(unsigned char cmd) { LCD_CS_en(); LCD_DC_reg(); SPI1_ReadWriteByte(cmd); LCD_CS_dis(); } void LCD_wtREG_DATA(unsigned char reg,unsigned short int da) { LCD_wtREG(reg); LCD_wt16bitData(da); } unsigned char LCD_Read_Data(void) { LCD_CS_en(); LCD_DC_data(); //´Ë´¦½ûÖ¹disbaleµôCS½Å£¬CS½Å±ØÐëһֱʹÄÜ£¬·ñÔò¶ÁÈ¡µÄÊý¾ÝÈ«ÊÇ0xff return SPI1_ReadWriteByte(0xFF); } void ILI9341_io_Init() // ÆäËûÒý½Å³õʼ»¯ { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB , ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA , ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_Init(GPIOB, &GPIO_InitStructure); } // ------------------------------- void LCD_odev_init(void) { ILI9341_io_Init(); lcddev.width = LCD_Wide; lcddev.height = LCD_High; LCD_RST_Clr(); delay_ms(20); LCD_RST_Set(); delay_ms(20); //LCD_BLK_Set(); //************* Start Initial Sequence **********// LCD_wtREG(0xCF); LCD_wt8bitData(0x00); LCD_wt8bitData(0xD9); LCD_wt8bitData(0X30); LCD_wtREG(0xED); LCD_wt8bitData(0x64); LCD_wt8bitData(0x03); LCD_wt8bitData(0X12); LCD_wt8bitData(0X81); LCD_wtREG(0xE8); LCD_wt8bitData(0x85); LCD_wt8bitData(0x10); LCD_wt8bitData(0x78); LCD_wtREG(0xCB); LCD_wt8bitData(0x39); LCD_wt8bitData(0x2C); LCD_wt8bitData(0x00); LCD_wt8bitData(0x34); LCD_wt8bitData(0x02); LCD_wtREG(0xF7); LCD_wt8bitData(0x20); LCD_wtREG(0xEA); LCD_wt8bitData(0x00); LCD_wt8bitData(0x00); LCD_wtREG(0xC0); //Power control LCD_wt8bitData(0x21); //VRH[5:0] LCD_wtREG(0xC1); //Power control LCD_wt8bitData(0x12); //SAP[2:0];BT[3:0] LCD_wtREG(0xC5); //VCM control LCD_wt8bitData(0x32); LCD_wt8bitData(0x3C); LCD_wtREG(0xC7); //VCM control2 LCD_wt8bitData(0XC1); LCD_wtREG(0x36); // Memory Access Control LCD_wt8bitData(0x68); LCD_wtREG(0x2A); //ÐеØÖ·ÉèÖà LCD_wt8bitData(0x00); LCD_wt8bitData(0x00); LCD_wt8bitData(0x01); LCD_wt8bitData(0x3f); LCD_wtREG(0x2B); //ÁеØÖ·ÉèÖà LCD_wt8bitData(0x00); LCD_wt8bitData(0x00); LCD_wt8bitData(0x00); LCD_wt8bitData(0xef); LCD_wtREG(0x3A); LCD_wt8bitData(0x55); LCD_wtREG(0xB1); LCD_wt8bitData(0x00); LCD_wt8bitData(0x18); LCD_wtREG(0xB6); // Display Function Control LCD_wt8bitData(0x0A); LCD_wt8bitData(0xA2); LCD_wtREG(0xF2); // 3Gamma Function Disable LCD_wt8bitData(0x00); LCD_wtREG(0x26); //Gamma curve selected LCD_wt8bitData(0x01); LCD_wtREG(0xE0); //Set Gamma LCD_wt8bitData(0x0F); LCD_wt8bitData(0x20); LCD_wt8bitData(0x1E); LCD_wt8bitData(0x09); LCD_wt8bitData(0x12); LCD_wt8bitData(0x0B); LCD_wt8bitData(0x50); LCD_wt8bitData(0XBA); LCD_wt8bitData(0x44); LCD_wt8bitData(0x09); LCD_wt8bitData(0x14); LCD_wt8bitData(0x05); LCD_wt8bitData(0x23); LCD_wt8bitData(0x21); LCD_wt8bitData(0x00); LCD_wtREG(0XE1); //Set Gamma LCD_wt8bitData(0x00); LCD_wt8bitData(0x19); LCD_wt8bitData(0x19); LCD_wt8bitData(0x00); LCD_wt8bitData(0x12); LCD_wt8bitData(0x07); LCD_wt8bitData(0x2D); LCD_wt8bitData(0x28); LCD_wt8bitData(0x3F); LCD_wt8bitData(0x02); LCD_wt8bitData(0x0A); LCD_wt8bitData(0x08); LCD_wt8bitData(0x25); LCD_wt8bitData(0x2D); LCD_wt8bitData(0x0F); LCD_wtREG(0x11); //Exit Sleep delay_ms(120); LCD_wtREG(0x29); //Display on lcddev.bled = BLEDoff; } unsigned short int LCD_Read_Point(unsigned short int cx,unsigned short int cy) { unsigned char r=0,g=0,b=0; LCD_set_windows(cx,cy,cx,cy); LCD_wtREG(0x2E); LCD_Read_Data(); //Ö»ÐèÒªÖ´ÐÐÒ»´Î¿Õ¶ÁÈ¡ r = LCD_Read_Data(); g = LCD_Read_Data(); b = LCD_Read_Data(); LCD_wtREG(0x2C); //¹Ø¼ü²½Ö裬±ØÐëÒªÓÐ return (((r>>3)<<11)|((g>>2)<<5)|(b>>3)); } void LCD_restar(void) //Èí¼þ¸´Î»Ö¸Áî²»ÄÜÔÚÍ˳ö˯ÃßÐòÁÐʱ·¢ËÍ { LCD_wtREG(0x01); delay_ms(250); } void LCD_inSleep(void) { LCD_wtREG(0x28); //display TURNOFF delay_ms(50); LCD_wtREG(0x10); //sleep ENABLE LCD_BLK_Clr(); } void LCD_outSleep(void) { LCD_wtREG(0x11); //sleep DISABLE delay_ms(50); LCD_wtREG(0x29); //display TURNON LCD_BLK_Set(); } unsigned char LCD_onDisp(void) { LCD_wtREG(0x29); //display TURNON return BLEDon; } unsigned char LCD_offDisp(void) { LCD_wtREG(0x28); //display TURNOFF return BLEDoff; } /**************************************************** *** º¯Êý¹¦ÄÜ£ºÇóÏÔʾµÄµãÕóÃæ»ý *** Èë¿Ú²ÎÊý£ºm:ºá×ø±ê *** n:×Ý×ø±ê ****************************************************/ //m^nº¯Êý //·µ»ØÖµ:m^n´Î·½. unsigned long LCD_Pow(unsigned char m,unsigned char n) { unsigned long result=1; while(n--)result*=m; return result; } /**************************************************** *** º¯Êý¹¦ÄÜ£ºÉèÖùâ±êλÖ㬼´ÉèÖÃÏÔʾµÄÆðʼ×ø±ê *** Èë¿Ú²ÎÊý£ºXpos:ºá×ø±ê *** Ypos:×Ý×ø±ê ****************************************************/ void LCD_SetCursor(unsigned short int Xpos, unsigned short int Ypos) { LCD_wtREG_DATA(Xreg ,Xpos); LCD_wtREG_DATA(Yreg ,Ypos); } /**************************************************** *** º¯Êý¹¦ÄÜ£ºÉèÖÃÏÔʾ´°¿Ú£¬¼´´´½¨Ò»¸öÏÔʾ´°¿Ú *** Èë¿Ú²ÎÊý£ºx1,y1-->Æðʼ×ø±ê *** x2,y2-->ÖÕµã×ø±ê ****************************************************/ void LCD_set_windows(unsigned short int x1,unsigned short int y1,unsigned short int x2,unsigned short int y2) { LCD_wtREG(0x2a); LCD_wt16bitData(x1); LCD_wt16bitData(x2); LCD_wtREG(0x2b); LCD_wt16bitData(y1); LCD_wt16bitData(y2); LCD_wtREG(0x2C); } //ÇåÆÁº¯Êý //Color:ÒªÇåÆÁµÄÌî³äÉ« void LCD_Clear(unsigned short int color) { unsigned short int i,j; LCD_set_windows(0,0,lcddev.width-1,lcddev.height-1); for(i=0;i<lcddev.width;i++) { for (j=0;j<lcddev.height;j++) { LCD_wt16bitData(color); } } } /********************************************************** * º¯Êý¹¦ÄÜ ---> LCD»µãº¯Êý * Èë¿Ú²ÎÊý ---> (x,y)¹â±ê×ø±êÊýÖµ * ·µ»ØÊýÖµ ---> none * ¹¦ÄÜ˵Ã÷ ---> µãµÄÑÕÉ«ÔÚÇ°ÃæµÄ»±ÊÑÕÉ«ÉèÖà **********************************************************/ void LCD_DrawPoint(unsigned short int x,unsigned short int y) { LCD_set_windows(x,y,x,y); //É趨¹â±ê×ø±ê LCD_wtREG_DATA(LCD_wtgram,lcddev.brushcl); //дÈëµãµÄÑÕÉ«Öµ,¼´ÉèÖû±ÊµÄĬÈÏÑÕÉ« } /********************************************************** * º¯Êý¹¦ÄÜ ---> LCD»µãº¯Êý£¬ÑÕÉ«ÖµËæÉ趨дÈ루¿ìËÙ»µã£© * Èë¿Ú²ÎÊý ---> (x,y)¹â±ê×ø±êÊýÖµ * cl£ºÒªÐ´ÈëµÄÑÕÉ«Öµ * ·µ»ØÊýÖµ ---> none * ¹¦ÄÜ˵Ã÷ ---> none **********************************************************/ void LCD_DrawPoint_Color(unsigned short int x,unsigned short int y,unsigned short int cl) { LCD_set_windows(x,y,x,y); //É趨¹â±ê×ø±ê LCD_wtREG_DATA(LCD_wtgram,cl); //дÈëµãµÄÑÕÉ«Öµ,¼´ÉèÖû±ÊµÄĬÈÏÑÕÉ« } /********************************************************** * º¯Êý¹¦ÄÜ ---> LCD»Ïߺ¯Êý * Èë¿Ú²ÎÊý ---> (x1,y1)Æðµã×ø±êÊýÖµ * (x2,y2)ÖÕµã×ø±êÊýÖµ * cl-»±ÊÑÕÉ« * ·µ»ØÊýÖµ ---> none * ¹¦ÄÜ˵Ã÷ ---> **********************************************************/ void LCD_Draw_Line(unsigned short int x1,unsigned short int y1,unsigned short int x2,unsigned short int y2, unsigned short int cl) { unsigned short int t; int xerr=0,yerr=0,delta_x,delta_y,distance; int incx,incy,uRow,uCol; delta_x=x2-x1; //¼ÆËã×ø±êÔöÁ¿ delta_y=y2-y1; uRow=x1; uCol=y1; if(delta_x>0)incx=1; //ÉèÖõ¥²½·½Ïò else if(delta_x==0)incx=0;//´¹Ö±Ïß else {incx=-1;delta_x=-delta_x;} if(delta_y>0)incy=1; else if(delta_y==0)incy=0;//ˮƽÏß else{incy=-1;delta_y=-delta_y;} if( delta_x>delta_y)distance=delta_x; //Ñ¡È¡»ù±¾ÔöÁ¿×ø±êÖá else distance=delta_y; for(t=0;t<=distance+1;t++ )//»ÏßÊä³ö { LCD_DrawPoint_Color(uRow,uCol,cl);//»µã xerr+=delta_x ; yerr+=delta_y ; if(xerr>distance) { xerr-=distance; uRow+=incx; } if(yerr>distance) { yerr-=distance; uCol+=incy; } } } /********************************************************** * º¯Êý¹¦ÄÜ ---> LCDÖе㷨»Ô²º¯Êý * Èë¿Ú²ÎÊý ---> (x,y)Æð½Ç×ø±êÊýÖµ * r£ºÔ²°ë¾¶ * * ·µ»ØÊýÖµ ---> none * ¹¦ÄÜ˵Ã÷ ---> Ô²µÄÑÕÉ«ÔÚÇ°ÃæµÄ»±ÊÑÕÉ«ÉèÖà **********************************************************/ void LCD_Draw_Circle(unsigned short int x0,unsigned short int y0,unsigned char r , unsigned short int cl) { unsigned char x,y; //Öá·½Ïò±äÁ¿ float d; x = 0; y = r; d = 5.0/4 - r; //ÄæʱÕë»Ô² while(x <= y) { LCD_DrawPoint_Color(x0 + x,y0 + y,cl); //270¡ã LCD_DrawPoint_Color(x0 + x,y0 - y,cl); //90¡ã LCD_DrawPoint_Color(x0 - x,y0 + y,cl); LCD_DrawPoint_Color(x0 - x,y0 - y,cl); LCD_DrawPoint_Color(x0 + y,y0 + x,cl); //0¡ã LCD_DrawPoint_Color(x0 + y,y0 - x,cl); LCD_DrawPoint_Color(x0 - y,y0 + x,cl); //180¡ã LCD_DrawPoint_Color(x0 - y,y0 - x,cl); if(d < 0) //yÖáË¥¼õÂý { d += x * 2.0 + 3; } else //xÖáË¥¼õÂý { d += 2.0 * (x - y) + 5; y--; } x++; } } /********************************************************** * º¯Êý¹¦ÄÜ ---> LCD»¾ØÐκ¯Êý * Èë¿Ú²ÎÊý ---> (x1,y1)Æð½Ç×ø±êÊýÖµ * (x2,y2)¶Ô½Ç×ø±êÊýÖµ ,¾ØÐεĶԽÇ×ø±ê * cl-»±ÊÑÕÉ« * ·µ»ØÊýÖµ ---> none * ¹¦ÄÜ˵Ã÷ ---> ÏßµÄÑÕÉ«ÔÚÇ°ÃæµÄ»±ÊÑÕÉ«ÉèÖà **********************************************************/ void LCD_Draw_Quad(unsigned short int x1,unsigned short int y1,unsigned short int x2,unsigned short int y2 , unsigned short int cl) { LCD_Draw_Line(x1,y1,x2,y1,cl); //ÒÔy1ΪÖá»Ïß LCD_Draw_Line(x2,y1,x2,y2,cl); //ÒÔx2ΪÖá»Ïß LCD_Draw_Line(x2,y2,x1,y2,cl); //ÒÔy2ΪÖá»Ïß LCD_Draw_Line(x1,y2,x1,y1,cl); //ÒÔx1ΪÖá»Ïß } /********************************************************** * º¯Êý¹¦ÄÜ ---> LCDÖ¸¶¨ÇøÓòÌî³äÑÕÉ«º¯Êý * Èë¿Ú²ÎÊý ---> (x1,y1)Æð½Ç×ø±êÊýÖµ * (x2,y2)¶Ô½Ç×ø±êÊýÖµ * cl£ºÌî³äÑÕÉ«Öµ * ·µ»ØÊýÖµ ---> none * ¹¦ÄÜ˵Ã÷ ---> ÔÚÆÁÄ»Éϻһ¸öËıßÐβ¢Ìî³äÏàÓ¦µÄÑÕÉ« * ¿éÇøÓò´óС£¨Ãæ»ý£© = (x2 - x1) * (y2 - y1) **********************************************************/ void LCD_Area_Color(unsigned short int x1,unsigned short int y1,unsigned short int x2,unsigned short int y2,unsigned short int cl) { unsigned short int i,j; LCD_set_windows(x1,y1,x2,y2); //ÉèÖùâ±êλÖà for(i=y1;i<=y2;i++) { for(j=x1;j<=x2;j++) LCD_wt16bitData(cl);//ÉèÖùâ±êλÖà } } /********************************************************** * º¯Êý¹¦ÄÜ ---> LCDÖ¸¶¨Î»ÖÃÏÔʾһ¸ö×Ö·ûº¯Êý * Èë¿Ú²ÎÊý ---> (x,y)×ø±êÊýÖµ * ch£ºÒªÏÔʾµÄ×Ö·û * size£º×ÖÌå´óС * mode£º0£º·Çµþ¼Ó·½Ê½ÏÔʾ¡£1£ºµþ¼Ó·½Ê½ÏÔʾ * ·µ»ØÊýÖµ ---> none * ¹¦ÄÜ˵Ã÷ ---> Ö÷ÒªÏÔʾһЩÐèÒª±ä»¯Ö®ÀàµÄÊý×ÖÏÔʾ **********************************************************/ void LCD_ShowChar(unsigned short int x,unsigned short int y,unsigned char ch,unsigned char csize,unsigned char mode) { unsigned char temp,t1,t; unsigned short int y0=y; unsigned char sz=(csize/8+((csize%8)?1:0))*(csize/2); //µÃµ½×ÖÌåÒ»¸ö×Ö·û¶ÔÓ¦µãÕó¼¯ËùÕ¼µÄ×Ö½ÚÊý ch=ch-' ';//µÃµ½Æ«ÒƺóµÄÖµ£¨ASCII×Ö¿âÊÇ´Ó¿Õ¸ñ¿ªÊ¼È¡Ä££¬ËùÒÔ-' '¾ÍÊǶÔÓ¦×Ö·ûµÄ×ֿ⣩ for(t=0;t<sz;t++) { if(csize==12)temp=ascii_1206[ch][t]; //µ÷ÓÃ1206×ÖÌå else if(csize==16)temp=ascii_1608[ch][t]; //µ÷ÓÃ1608×ÖÌå else if(csize==24)temp=ascii_2412[ch][t]; //µ÷ÓÃ2412×ÖÌå else return; //ûÓеÄ×Ö¿â for(t1=0;t1<8;t1++) { if(temp&0x80) { LCD_DrawPoint_Color(x,y,lcddev.cur_brushcl); } else if(mode==0) { LCD_DrawPoint_Color(x,y,lcddev.cur_backcl); } temp<<=1; y++; if(y>=lcddev.height)return; //³¬ÇøÓòÁË if((y-y0)==csize) { y=y0; x++; if(x>=lcddev.width)return; //³¬ÇøÓòÁË break; } } } } /************************************************************* *** º¯Êý¹¦ÄÜ ---> LCDÖ¸¶¨Î»ÖÿªÊ¼ÏÔʾ×Ö·û´®, *** Èë¿Ú²ÎÊý ---> x,y:Æðµã×ø±ê *** width,height:ÇøÓò´óС *** size:×ÖÌå´óС *** p:×Ö·û´®ÆðʼµØÖ· *** mode:0,Õý³£ÏÔʾ,1,µþ¼ÓÏÔʾ **************************************************************/ void LCD_ShowString(unsigned short int x,unsigned short int y,char *p ,unsigned char csize,unsigned char mode) { unsigned short int w,h; switch (csize) { case Ch12_6: { w = 6; h =12; break; } case Ch16_8: { w = 8; h =16; break; } case Ch24_12: { w = 12; h =24; break; } } while(*p!='