#include "CH554.h" #include "common.h" //#include "font.h" //#include "sys.h" #include "lcd.h" /****************************************************** GND=GND VCC=3.3V P00=CLK P01=MOSI P02=RES P03=DC P04=CS1 BLK为LCD背光控制管脚,低电平关闭背光,高电平打开;默认可以不接打开背光 ////////////////////////以上是LCD工作所需要的///////////////////////////////////// P05=FSO P06=CS2 ******************************************************/ u16 BACK_COLOR, POINT_COLOR; //背景色,画笔色 unsigned char bdata bitdata; sbit bit7=bitdata^7; sbit bit6=bitdata^6; sbit bit5=bitdata^5; sbit bit4=bitdata^4; sbit bit3=bitdata^3; sbit bit2=bitdata^2; sbit bit1=bitdata^1; sbit bit0=bitdata^0; void LCD_Writ_Bus(char da) //串行数据写入 { bitdata=da; LCD_SDI=bit7;LCD_SCK=0;LCD_SCK=1; LCD_SDI=bit6;LCD_SCK=0;LCD_SCK=1; LCD_SDI=bit5;LCD_SCK=0;LCD_SCK=1; LCD_SDI=bit4;LCD_SCK=0;LCD_SCK=1; LCD_SDI=bit3;LCD_SCK=0;LCD_SCK=1; LCD_SDI=bit2;LCD_SCK=0;LCD_SCK=1; LCD_SDI=bit1;LCD_SCK=0;LCD_SCK=1; LCD_SDI=bit0;LCD_SCK=0;LCD_SCK=1; } void LCD_WR_DATA8(char da) //发送数据-8位参数 { LCD_CS1=0; LCD_DC=1; LCD_Writ_Bus(da); LCD_CS1=1; } void LCD_WR_DATA(int da) { LCD_CS1=0; LCD_DC=1; LCD_Writ_Bus(da>>8); LCD_Writ_Bus(da); LCD_CS1=1; } void LCD_WR_REG(char da) { LCD_CS1=0; LCD_DC=0; LCD_Writ_Bus(da); LCD_CS1=1; } void LCD_WR_REG_DATA(int reg,int da) { LCD_WR_REG(reg); LCD_WR_DATA(da); } void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2) { LCD_WR_REG(0x2a); LCD_WR_DATA8(0x02); LCD_WR_DATA8(x1+2); LCD_WR_DATA8(0x02); LCD_WR_DATA8(x2+2); LCD_WR_REG(0x2b); LCD_WR_DATA8(0x01); LCD_WR_DATA8(y1+1); LCD_WR_DATA8(0x01); LCD_WR_DATA8(y2+1); LCD_WR_REG(0x2C); } void Lcd_Init(void) {//LCD_BLK=1; //调用一次这些函数,免得编译的时候提示警告 // LCD_WR_REG_DATA(0,0); // LCD_ShowString(0,0," "); // LCD_ShowNum(0,0,0,0); // LCD_Show2Num(0,0,0,0); // LCD_DrawPoint_big(0,0); // LCD_DrawRectangle(0,0,0,0); // Draw_Circle(0,0,0); LCD_REST=0; delayms(20); LCD_REST=1; delayms(20); LCD_WR_REG(0x11);//Sleep exit delayms (120); //ST7735R Frame Rate LCD_WR_REG(0xB1); LCD_WR_DATA8(0x01); LCD_WR_DATA8(0x2C); LCD_WR_DATA8(0x2D); LCD_WR_REG(0xB2); LCD_WR_DATA8(0x01); LCD_WR_DATA8(0x2C); LCD_WR_DATA8(0x2D); LCD_WR_REG(0xB3); LCD_WR_DATA8(0x01); LCD_WR_DATA8(0x2C); LCD_WR_DATA8(0x2D); LCD_WR_DATA8(0x01); LCD_WR_DATA8(0x2C); LCD_WR_DATA8(0x2D); LCD_WR_REG(0xB4); //Column inveLCD_DC ion LCD_WR_DATA8(0x07); //ST7735R Power Sequence LCD_WR_REG(0xC0); LCD_WR_DATA8(0xA2); LCD_WR_DATA8(0x02); LCD_WR_DATA8(0x84); LCD_WR_REG(0xC1); LCD_WR_DATA8(0xC5); LCD_WR_REG(0xC2); LCD_WR_DATA8(0x0A); LCD_WR_DATA8(0x00); LCD_WR_REG(0xC3); LCD_WR_DATA8(0x8A); LCD_WR_DATA8(0x2A); LCD_WR_REG(0xC4); LCD_WR_DATA8(0x8A); LCD_WR_DATA8(0xEE); LCD_WR_REG(0xC5); //VCOM LCD_WR_DATA8(0x0E); LCD_WR_REG(0x36); //MX, MY, RGB mode LCD_WR_DATA8(0xC0); #ifdef USE_LANDSCAPE LCD_WR_DATA8(0xA8); //竖屏C8 横屏08 A8 #else LCD_WR_DATA8(0xC8); //竖屏C8 横屏08 A8 #endif //ST7735R Gamma Sequence LCD_WR_REG(0xe0); LCD_WR_DATA8(0x0f); LCD_WR_DATA8(0x1a); LCD_WR_DATA8(0x0f); LCD_WR_DATA8(0x18); LCD_WR_DATA8(0x2f); LCD_WR_DATA8(0x28); LCD_WR_DATA8(0x20); LCD_WR_DATA8(0x22); LCD_WR_DATA8(0x1f); LCD_WR_DATA8(0x1b); LCD_WR_DATA8(0x23); LCD_WR_DATA8(0x37); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x07); LCD_WR_DATA8(0x02); LCD_WR_DATA8(0x10); LCD_WR_REG(0xe1); LCD_WR_DATA8(0x0f); LCD_WR_DATA8(0x1b); LCD_WR_DATA8(0x0f); LCD_WR_DATA8(0x17); LCD_WR_DATA8(0x33); LCD_WR_DATA8(0x2c); LCD_WR_DATA8(0x29); LCD_WR_DATA8(0x2e); LCD_WR_DATA8(0x30); LCD_WR_DATA8(0x30); LCD_WR_DATA8(0x39); LCD_WR_DATA8(0x3f); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x07); LCD_WR_DATA8(0x03); LCD_WR_DATA8(0x10); LCD_WR_REG(0x2a); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x00+2); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x80+2); LCD_WR_REG(0x2b); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x00+3); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x80+3); LCD_WR_REG(0xF0); //Enable test command LCD_WR_DATA8(0x01); LCD_WR_REG(0xF6); //Disable ram power save mode LCD_WR_DATA8(0x00); LCD_WR_REG(0x3A); //65k mode LCD_WR_DATA8(0x05); LCD_WR_REG(0x29);//Display on } //*************************************************************** //清屏函数 //Color:要清屏的填充色 void LCD_Clear(u16 Color) { u16 i,j; Address_set(0,0,LCD_W-1,LCD_H-1); for(i=0;i0)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(uRow,uCol);//画点 xerr+=delta_x ; yerr+=delta_y ; if(xerr>distance) { xerr-=distance; uRow+=incx; } if(yerr>distance) { yerr-=distance; uCol+=incy; } } } //画矩形 void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2) { LCD_DrawLine(x1,y1,x2,y1); LCD_DrawLine(x1,y1,x1,y2); LCD_DrawLine(x1,y2,x2,y2); LCD_DrawLine(x2,y1,x2,y2); } //在指定位置画一个指定大小的圆 //(x,y):中心点 //r :半径 void Draw_Circle(u16 x0,u16 y0,u8 r) { int a,b; int di; a=0;b=r; di=3-(r<<1); //判断下个点位置的标志 while(a<=b) { LCD_DrawPoint(x0-b,y0-a); //3 LCD_DrawPoint(x0+b,y0-a); //0 LCD_DrawPoint(x0-a,y0+b); //1 LCD_DrawPoint(x0-b,y0-a); //7 LCD_DrawPoint(x0-a,y0-b); //2 LCD_DrawPoint(x0+b,y0+a); //4 LCD_DrawPoint(x0+a,y0-b); //5 LCD_DrawPoint(x0+a,y0+b); //6 LCD_DrawPoint(x0-b,y0+a); a++; //使用Bresenham算法画圆 if(di<0)di +=4*a+6; else { di+=10+4*(a-b); b--; } LCD_DrawPoint(x0+a,y0+b); } } //在指定位置显示一个字符 //num:要显示的字符:" "--->"~" //mode:叠加方式(1)还是非叠加方式(0) //在指定位置显示一个字符 //num:要显示的字符:" "--->"~" //mode:叠加方式(1)还是非叠加方式(0) void LCD_ShowChar(u16 x,u16 y,u8 num,u8 mode) { u8 temp; u8 pos,t; u16 x0=x; u16 colortemp=POINT_COLOR; if(x>LCD_W-16||y>LCD_H-16)return; //设置窗口 num=num-' ';//得到偏移后的值 Address_set(x,y,x+8-1,y+16-1); //设置光标位置 if(!mode) //非叠加方式 { for(pos=0;pos<16;pos++) { //temp=asc2_1608[(u16)num*16+pos]; //调用1608字体 for(t=0;t<8;t++) { if(temp&0x01)POINT_COLOR=colortemp; else POINT_COLOR=BACK_COLOR; LCD_WR_DATA(POINT_COLOR); temp>>=1; x++; } x=x0; y++; } }else//叠加方式 { for(pos=0;pos<16;pos++) { //temp=asc2_1608[(u16)num*16+pos]; //调用1608字体 for(t=0;t<8;t++) { if(temp&0x01)LCD_DrawPoint(x+t,y+pos);//画一个点 temp>>=1; } } } POINT_COLOR=colortemp; } //m^n函数 u32 mypow(u8 m,u8 n) { u32 result=1; while(n--)result*=m; return result; } //显示2个数字 //x,y :起点坐标 //len :数字的位数 //color:颜色 //num:数值(0~4294967295); void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len) { u8 t,temp; u8 enshow=0; num=(u16)num; for(t=0;tLCD_W-16){x=0;y+=16;} if(y>LCD_H-16){y=x=0;LCD_Clear(RED);} LCD_ShowChar(x,y,*p,0); x+=8; p++; } }