#include "gd32f30x.h" #include "gd32f30x_it.h" #include "gd32f30x_spi.h" #include "gd32f30x_rcu.h" #include "gd32f30x_gpio.h" #include "oledfont.h" #include "lcd.h" #include "lcd.h" #include "delay.h" u16 BACK_COLOR; //背景色 /****************************************************************************** 函数说明:LCD串行数据写入函数 入口数据:dat 要写入的串行数据 返回值: 无 ******************************************************************************/ void LCD_Writ_Bus(u8 dat) { u8 i; OLED_CS_Clr(); for(i=0;i<8;i++) { OLED_SCLK_Clr(); if(dat&0x80) OLED_SDIN_Set(); else OLED_SDIN_Clr(); OLED_SCLK_Set(); dat<<=1; } OLED_CS_Set(); } /****************************************************************************** 函数说明:LCD写入数据 入口数据:dat 写入的数据 返回值: 无 ******************************************************************************/ void LCD_WR_DATA8(u8 dat) { OLED_DC_Set();//写数据 LCD_Writ_Bus(dat); } /****************************************************************************** 函数说明:LCD写入数据 入口数据:dat 写入的数据 返回值: 无 ******************************************************************************/ void LCD_WR_DATA(u16 dat) { OLED_DC_Set();//写数据 LCD_Writ_Bus(dat>>8); LCD_Writ_Bus(dat); } /****************************************************************************** 函数说明:LCD写入命令 入口数据:dat 写入的命令 返回值: 无 ******************************************************************************/ void LCD_WR_REG(u8 dat) { OLED_DC_Clr();//写命令 LCD_Writ_Bus(dat); } /****************************************************************************** 函数说明:设置起始和结束地址 入口数据:x1,x2 设置列的起始和结束地址 y1,y2 设置行的起始和结束地址 返回值: 无 ******************************************************************************/ void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2) { if(USE_HORIZONTAL==0) { LCD_WR_REG(0x2a);//列地址设置 LCD_WR_DATA(x1); LCD_WR_DATA(x2); LCD_WR_REG(0x2b);//行地址设置 LCD_WR_DATA(y1); LCD_WR_DATA(y2); LCD_WR_REG(0x2c);//储存器写 } else if(USE_HORIZONTAL==1) { LCD_WR_REG(0x2a);//列地址设置 LCD_WR_DATA(x1); LCD_WR_DATA(x2); LCD_WR_REG(0x2b);//行地址设置 LCD_WR_DATA(y1+80); LCD_WR_DATA(y2+80); LCD_WR_REG(0x2c);//储存器写 } else if(USE_HORIZONTAL==2) { LCD_WR_REG(0x2a);//列地址设置 LCD_WR_DATA(x1); LCD_WR_DATA(x2); LCD_WR_REG(0x2b);//行地址设置 LCD_WR_DATA(y1); LCD_WR_DATA(y2); LCD_WR_REG(0x2c);//储存器写 } else { LCD_WR_REG(0x2a);//列地址设置 LCD_WR_DATA(x1+80); LCD_WR_DATA(x2+80); LCD_WR_REG(0x2b);//行地址设置 LCD_WR_DATA(y1); LCD_WR_DATA(y2); LCD_WR_REG(0x2c);//储存器写 } } /****************************************************************************** 函数说明:LCD初始化函数 入口数据:无 返回值: 无 ******************************************************************************/ void Lcd_Init(void) { // GPIO_InitTypeDef GPIO_InitStructure; // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE, ENABLE); //使能A端口时钟 // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出 // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz // GPIO_Init(GPIOG, &GPIO_InitStructure); //初始化GPIOG12 // GPIO_SetBits(GPIOG,GPIO_Pin_12); // // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_15; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz // GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化GPIOD1,5,15 // GPIO_SetBits(GPIOD,GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_15); // // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_10; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz // GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化GPIOE8,10 // GPIO_SetBits(GPIOE,GPIO_Pin_8|GPIO_Pin_10); /* SCL <--------> PA5 (clock) SDA <--------> PA7 (data) RES <--------> PA11 (reset) DC <--------> PA8 (data / cmd) CS <--------> PA12 (chip select) BLK <--------> PD2 (background) */ rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_GPIOD); gpio_init(GPIOA,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_5); gpio_init(GPIOA,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_7); gpio_init(GPIOA,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_8); gpio_init(GPIOA,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_11); gpio_init(GPIOA,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_12); gpio_init(GPIOD,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_2); gpio_bit_set(GPIOD,GPIO_PIN_2); gpio_bit_set(GPIOA,GPIO_PIN_7); gpio_bit_set(GPIOA,GPIO_PIN_8); gpio_bit_set(GPIOA,GPIO_PIN_11); gpio_bit_set(GPIOA,GPIO_PIN_12); gpio_bit_set(GPIOA,GPIO_PIN_5); OLED_RES_Clr(); delay_ms(200); OLED_RES_Set(); delay_ms(200); OLED_BLK_Set(); delay_ms(200); //************* Start Initial Sequence **********// LCD_WR_REG(0x36); if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x00); else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC0); else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x70); else LCD_WR_DATA8(0xA0); LCD_WR_REG(0x3A); LCD_WR_DATA8(0x05); LCD_WR_REG(0xB2); LCD_WR_DATA8(0x0C); LCD_WR_DATA8(0x0C); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x33); LCD_WR_DATA8(0x33); LCD_WR_REG(0xB7); LCD_WR_DATA8(0x35); LCD_WR_REG(0xBB); LCD_WR_DATA8(0x19); LCD_WR_REG(0xC0); LCD_WR_DATA8(0x2C); LCD_WR_REG(0xC2); LCD_WR_DATA8(0x01); LCD_WR_REG(0xC3); LCD_WR_DATA8(0x12); LCD_WR_REG(0xC4); LCD_WR_DATA8(0x20); LCD_WR_REG(0xC6); LCD_WR_DATA8(0x0F); LCD_WR_REG(0xD0); LCD_WR_DATA8(0xA4); LCD_WR_DATA8(0xA1); LCD_WR_REG(0xE0); LCD_WR_DATA8(0xD0); LCD_WR_DATA8(0x04); LCD_WR_DATA8(0x0D); LCD_WR_DATA8(0x11); LCD_WR_DATA8(0x13); LCD_WR_DATA8(0x2B); LCD_WR_DATA8(0x3F); LCD_WR_DATA8(0x54); LCD_WR_DATA8(0x4C); LCD_WR_DATA8(0x18); LCD_WR_DATA8(0x0D); LCD_WR_DATA8(0x0B); LCD_WR_DATA8(0x1F); LCD_WR_DATA8(0x23); LCD_WR_REG(0xE1); LCD_WR_DATA8(0xD0); LCD_WR_DATA8(0x04); LCD_WR_DATA8(0x0C); LCD_WR_DATA8(0x11); LCD_WR_DATA8(0x13); LCD_WR_DATA8(0x2C); LCD_WR_DATA8(0x3F); LCD_WR_DATA8(0x44); LCD_WR_DATA8(0x51); LCD_WR_DATA8(0x2F); LCD_WR_DATA8(0x1F); LCD_WR_DATA8(0x1F); LCD_WR_DATA8(0x20); LCD_WR_DATA8(0x23); LCD_WR_REG(0x21); LCD_WR_REG(0x11); //Delay (120); LCD_WR_REG(0x29); } /****************************************************************************** 函数说明:LCD清屏函数 入口数据:无 返回值: 无 ******************************************************************************/ void LCD_Clear(u16 Color) { u16 i,j; LCD_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_x;} if(delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴 else distance=delta_y; for(t=0;tdistance) { xerr-=distance; uRow+=incx; } if(yerr>distance) { yerr-=distance; uCol+=incy; } } } /****************************************************************************** 函数说明:画矩形 入口数据:x1,y1 起始坐标 x2,y2 终止坐标 返回值: 无 ******************************************************************************/ void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color) { LCD_DrawLine(x1,y1,x2,y1,color); LCD_DrawLine(x1,y1,x1,y2,color); LCD_DrawLine(x1,y2,x2,y2,color); LCD_DrawLine(x2,y1,x2,y2,color); } /****************************************************************************** 函数说明:画圆 入口数据:x0,y0 圆心坐标 r 半径 返回值: 无 ******************************************************************************/ void Draw_Circle(u16 x0,u16 y0,u8 r,u16 color) { int a,b; a=0;b=r; while(a<=b) { LCD_DrawPoint(x0-b,y0-a,color); //3 LCD_DrawPoint(x0+b,y0-a,color); //0 LCD_DrawPoint(x0-a,y0+b,color); //1 LCD_DrawPoint(x0-a,y0-b,color); //2 LCD_DrawPoint(x0+b,y0+a,color); //4 LCD_DrawPoint(x0+a,y0-b,color); //5 LCD_DrawPoint(x0+a,y0+b,color); //6 LCD_DrawPoint(x0-b,y0+a,color); //7 a++; if((a*a+b*b)>(r*r))//判断要画的点是否过远 { b--; } } } /****************************************************************************** 函数说明:显示字符 入口数据:x,y 起点坐标 num 要显示的字符 mode 1叠加方式 0非叠加方式 返回值: 无 ******************************************************************************/ void LCD_ShowChar(u16 x,u16 y,u8 num,u8 mode,u16 color) { u8 temp; u8 pos,t; u16 x0=x; if(x>LCD_W-16||y>LCD_H-16)return; //设置窗口 num=num-' ';//得到偏移后的值 LCD_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)LCD_WR_DATA(color); else LCD_WR_DATA(BACK_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,color);//画一个点 temp>>=1; } } } } /****************************************************************************** 函数说明:显示字符串 入口数据:x,y 起点坐标 *p 字符串起始地址 返回值: 无 ******************************************************************************/ void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 color) { while(*p!='\0') { if(x>LCD_W-16){x=0;y+=16;} if(y>LCD_H-16){y=x=0;LCD_Clear(RED);} LCD_ShowChar(x,y,*p,0,color); x+=8; p++; } } /****************************************************************************** 函数说明:显示数字 入口数据:m底数,n指数 返回值: 无 ******************************************************************************/ u32 mypow(u8 m,u8 n) { u32 result=1; while(n--)result*=m; return result; } /****************************************************************************** 函数说明:显示数字 入口数据:x,y 起点坐标 num 要显示的数字 len 要显示的数字个数 返回值: 无 ******************************************************************************/ void LCD_ShowNum(u16 x,u16 y,u16 num,u8 len,u16 color) { u8 t,temp; u8 enshow=0; for(t=0;t