| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606 |
- #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;i<LCD_W;i++)
- {
- for (j=0;j<LCD_H;j++)
- {
- LCD_WR_DATA(Color);
- }
- }
- }
- /******************************************************************************
- 函数说明:LCD显示汉字
- 入口数据:x,y 起始坐标
- index 汉字的序号
- size 字号
- 返回值: 无
- ******************************************************************************/
- //void LCD_ShowChinese(u16 x,u16 y,u8 index,u8 size,u16 color)
- //{
- // u8 i,j;
- // u8 *temp,size1;
- // if(size==16){temp=Hzk16;}//选择字号
- // if(size==32){temp=Hzk32;}
- // LCD_Address_Set(x,y,x+size-1,y+size-1); //设置一个汉字的区域
- // size1=size*size/8;//一个汉字所占的字节
- // temp+=index*size1;//写入的起始位置
- // for(j=0;j<size1;j++)
- // {
- // for(i=0;i<8;i++)
- // {
- // if((*temp&(1<<i))!=0)//从数据的低位开始读
- // {
- // LCD_WR_DATA(color);//点亮
- // }
- // else
- // {
- // LCD_WR_DATA(BACK_COLOR);//不点亮
- // }
- // }
- // temp++;
- // }
- //}
- /******************************************************************************
- 函数说明:LCD显示汉字
- 入口数据:x,y 起始坐标
- 返回值: 无
- ******************************************************************************/
- void LCD_DrawPoint(u16 x,u16 y,u16 color)
- {
- LCD_Address_Set(x,y,x,y);//设置光标位置
- LCD_WR_DATA(color);
- }
- /******************************************************************************
- 函数说明:LCD画一个大的点
- 入口数据:x,y 起始坐标
- 返回值: 无
- ******************************************************************************/
- void LCD_DrawPoint_big(u16 x,u16 y,u16 color)
- {
- LCD_Fill(x-1,y-1,x+1,y+1,color);
- }
- /******************************************************************************
- 函数说明:在指定区域填充颜色
- 入口数据:xsta,ysta 起始坐标
- xend,yend 终止坐标
- 返回值: 无
- ******************************************************************************/
- void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)
- {
- u16 i,j;
- LCD_Address_Set(xsta,ysta,xend,yend); //设置光标位置
- for(i=ysta;i<=yend;i++)
- {
- for(j=xsta;j<=xend;j++)LCD_WR_DATA(color);//设置光标位置
- }
- }
- /******************************************************************************
- 函数说明:画线
- 入口数据:x1,y1 起始坐标
- x2,y2 终止坐标
- 返回值: 无
- ******************************************************************************/
- void LCD_DrawLine(u16 x1,u16 y1,u16 x2,u16 y2,u16 color)
- {
- u16 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_x;}
- if(delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
- else distance=delta_y;
- for(t=0;t<distance+1;t++)
- {
- LCD_DrawPoint(uRow,uCol,color);//画点
- xerr+=delta_x;
- yerr+=delta_y;
- if(xerr>distance)
- {
- 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<len;t++)
- {
- temp=(num/mypow(10,len-t-1))%10;
- if(enshow==0&&t<(len-1))
- {
- if(temp==0)
- {
- LCD_ShowChar(x+8*t,y,' ',0,color);
- continue;
- }else enshow=1;
-
- }
- LCD_ShowChar(x+8*t,y,temp+48,0,color);
- }
- }
- /******************************************************************************
- 函数说明:显示小数
- 入口数据:x,y 起点坐标
- num 要显示的小数
- len 要显示的数字个数
- 返回值: 无
- ******************************************************************************/
- void LCD_ShowNum1(u16 x,u16 y,float num,u8 len,u16 color)
- {
- u8 t,temp;
- u16 num1;
- num1=num*100;
- for(t=0;t<len;t++)
- {
- temp=(num1/mypow(10,len-t-1))%10;
- if(t==(len-2))
- {
- LCD_ShowChar(x+8*(len-2),y,'.',0,color);
- t++;
- len+=1;
- }
- LCD_ShowChar(x+8*t,y,temp+48,0,color);
- }
- }
- /******************************************************************************
- 函数说明:显示40x40图片
- 入口数据:x,y 起点坐标
- 返回值: 无
- ******************************************************************************/
- //void LCD_ShowPicture(u16 x1,u16 y1,u16 x2,u16 y2)
- //{
- // int i;
- // LCD_Address_Set(x1,y1,x2,y2);
- // for(i=0;i<1600;i++)
- // {
- // LCD_WR_DATA8(image[i*2+1]);
- // LCD_WR_DATA8(image[i*2]);
- // }
- //}
|