制作出來的實物圖如下:
1.jpg (306.37 KB, 下載次數: 22)
下載附件
1.8寸TFT ST7735
2022-11-2 14:04 上傳
2.jpg (59.15 KB, 下載次數: 20)
下載附件
LCD1602A
2022-11-2 14:05 上傳
3.png (127.23 KB, 下載次數: 24)
下載附件
CubeMX設置
2022-11-2 14:05 上傳
4.png (91.42 KB, 下載次數: 23)
下載附件
時鐘配置
2022-11-2 14:05 上傳
5.png (156.11 KB, 下載次數: 20)
下載附件
2022-11-2 14:05 上傳
6.png (152.25 KB, 下載次數: 23)
下載附件
2022-11-2 14:05 上傳
STM32F103C8T6 HAL庫方式 1.8寸TFT ST7735 和LCD1602A 時間顯示照片輪播顯示
單片機源程序如下:
- /*
- * spi_lcd_st7735.h
- *
- * Created on: Oct 31, 2022
- * Author: Administrator
- */
- #ifndef LCD_SPI_LCD_ST7735_H_
- #define LCD_SPI_LCD_ST7735_H_
- #include "stm32f1xx_hal.h"
- #define u8 uint8_t
- #define u16 uint16_t
- #define u32 uint32_t
- void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color);//指定區域填充顏色
- void LCD_DrawPoint(u16 x,u16 y,u16 color);//在指定位置畫一個點
- void LCD_DrawLine(u16 x1,u16 y1,u16 x2,u16 y2,u16 color);//在指定位置畫一條線
- void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color);//在指定位置畫一個矩形
- void Draw_Circle(u16 x0,u16 y0,u8 r,u16 color);//在指定位置畫一個圓
- void LCD_ShowChinese(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode);//顯示漢字串
- void LCD_ShowChinese12x12(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode);//顯示單個12x12漢字
- void LCD_ShowChinese16x16(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode);//顯示單個16x16漢字
- void LCD_ShowChinese24x24(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode);//顯示單個24x24漢字
- void LCD_ShowChinese32x32(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode);//顯示單個32x32漢字
- void LCD_ShowChar(u16 x,u16 y,u8 num,u16 fc,u16 bc,u8 sizey,u8 mode);//顯示一個字符
- void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 fc,u16 bc,u8 sizey,u8 mode);//顯示字符串
- u32 mypow(u8 m,u8 n);//求冪
- void LCD_ShowIntNum(u16 x,u16 y,u16 num,u8 len,u16 fc,u16 bc,u8 sizey);//顯示整數變量
- void LCD_ShowFloatNum1(u16 x,u16 y,float num,u8 len,u16 fc,u16 bc,u8 sizey);//顯示兩位小數變量
- void LCD_ShowPicture(u16 x,u16 y,u16 length,u16 width,const u8 pic[]);//顯示圖片
- //畫筆顏色
- #define WHITE 0xFFFF
- #define BLACK 0x0000
- #define BLUE 0x001F
- #define BRED 0XF81F
- #define GRED 0XFFE0
- #define GBLUE 0X07FF
- #define RED 0xF800
- #define MAGENTA 0xF81F
- #define GREEN 0x07E0
- #define CYAN 0x7FFF
- #define YELLOW 0xFFE0
- #define BROWN 0XBC40 //棕色
- #define BRRED 0XFC07 //棕紅色
- #define GRAY 0X8430 //灰色
- #define DARKBLUE 0X01CF //深藍色
- #define LIGHTBLUE 0X7D7C //淺藍色
- #define GRAYBLUE 0X5458 //灰藍色
- #define LIGHTGREEN 0X841F //淺綠色
- #define LGRAY 0XC618 //淺灰色(PANNEL),窗體背景色
- #define LGRAYBLUE 0XA651 //淺灰藍色(中間層顏色)
- #define LBBLUE 0X2B12 //淺棕藍色(選擇條目的反色)
- #endif /* LCD_SPI_LCD_ST7735_H_ */
復制代碼- /*
- * spi_lcd_st7735.c
- *
- * Created on: Oct 31, 2022
- * Author: Administrator
- */
- #include "spi_lcd_st7735.h"
- #include "../delay/delay.h"
- #include "spi_lcd_st7735_font.h"
- #include "spi_lcd_st7735_init.h"
- /******************************************************************************
- 函數說明:在指定區域填充顏色
- 入口數據:xsta,ysta 起始坐標
- xend,yend 終止坐標
- color 要填充的顏色
- 返回值: 無
- ******************************************************************************/
- void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)
- {
- u16 i,j;
- LCD_Address_Set(xsta,ysta,xend-1,yend-1);//設置顯示范圍
- for(i=ysta;i<yend;i++)
- {
- for(j=xsta;j<xend;j++)
- {
- LCD_WR_DATA(color);
- }
- }
- }
- /******************************************************************************
- 函數說明:在指定位置畫點
- 入口數據:x,y 畫點坐標
- color 點的顏色
- 返回值: 無
- ******************************************************************************/
- void LCD_DrawPoint(u16 x,u16 y,u16 color)
- {
- LCD_Address_Set(x,y,x,y);//設置光標位置
- LCD_WR_DATA(color);
- }
- /******************************************************************************
- 函數說明:畫線
- 入口數據:x1,y1 起始坐標
- x2,y2 終止坐標
- color 線的顏色
- 返回值: 無
- ******************************************************************************/
- 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_y;}
- 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 終止坐標
- color 矩形的顏色
- 返回值: 無
- ******************************************************************************/
- 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 半徑
- color 圓的顏色
- 返回值: 無
- ******************************************************************************/
- 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顯示坐標
- *s 要顯示的漢字串
- fc 字的顏色
- bc 字的背景色
- sizey 字號 可選 16 24 32
- mode: 0非疊加模式 1疊加模式
- 返回值: 無
- ******************************************************************************/
- void LCD_ShowChinese(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
- {
- while(*s!=0)
- {
- if(sizey==12) LCD_ShowChinese12x12(x,y,s,fc,bc,sizey,mode);
- else if(sizey==16) LCD_ShowChinese16x16(x,y,s,fc,bc,sizey,mode);
- else if(sizey==24) LCD_ShowChinese24x24(x,y,s,fc,bc,sizey,mode);
- else if(sizey==32) LCD_ShowChinese32x32(x,y,s,fc,bc,sizey,mode);
- else return;
- s+=2;
- x+=sizey;
- }
- }
- /******************************************************************************
- 函數說明:顯示單個12x12漢字
- 入口數據:x,y顯示坐標
- *s 要顯示的漢字
- fc 字的顏色
- bc 字的背景色
- sizey 字號
- mode: 0非疊加模式 1疊加模式
- 返回值: 無
- ******************************************************************************/
- void LCD_ShowChinese12x12(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
- {
- u8 i,j,m=0;
- u16 k;
- u16 HZnum;//漢字數目
- u16 TypefaceNum;//一個字符所占字節大小
- u16 x0=x;
- TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
- HZnum=sizeof(tfont12)/sizeof(typFNT_GB12); //統計漢字數目
- for(k=0;k<HZnum;k++)
- {
- if((tfont12[k].Index[0]==*(s))&&(tfont12[k].Index[1]==*(s+1)))
- {
- LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
- for(i=0;i<TypefaceNum;i++)
- {
- for(j=0;j<8;j++)
- {
- if(!mode)//非疊加方式
- {
- if(tfont12[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);
- else LCD_WR_DATA(bc);
- m++;
- if(m%sizey==0)
- {
- m=0;
- break;
- }
- }
- else//疊加方式
- {
- if(tfont12[k].Msk[i]&(0x01<<j)) LCD_DrawPoint(x,y,fc);//畫一個點
- x++;
- if((x-x0)==sizey)
- {
- x=x0;
- y++;
- break;
- }
- }
- }
- }
- }
- continue; //查找到對應點陣字庫立即退出,防止多個漢字重復取模帶來影響
- }
- }
- /******************************************************************************
- 函數說明:顯示單個16x16漢字
- 入口數據:x,y顯示坐標
- *s 要顯示的漢字
- fc 字的顏色
- bc 字的背景色
- sizey 字號
- mode: 0非疊加模式 1疊加模式
- 返回值: 無
- ******************************************************************************/
- void LCD_ShowChinese16x16(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
- {
- u8 i,j,m=0;
- u16 k;
- u16 HZnum;//漢字數目
- u16 TypefaceNum;//一個字符所占字節大小
- u16 x0=x;
- TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
- HZnum=sizeof(tfont16)/sizeof(typFNT_GB16); //統計漢字數目
- for(k=0;k<HZnum;k++)
- {
- if ((tfont16[k].Index[0]==*(s))&&(tfont16[k].Index[1]==*(s+1)))
- {
- LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
- for(i=0;i<TypefaceNum;i++)
- {
- for(j=0;j<8;j++)
- {
- if(!mode)//非疊加方式
- {
- if(tfont16[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);
- else LCD_WR_DATA(bc);
- m++;
- if(m%sizey==0)
- {
- m=0;
- break;
- }
- }
- else//疊加方式
- {
- if(tfont16[k].Msk[i]&(0x01<<j)) LCD_DrawPoint(x,y,fc);//畫一個點
- x++;
- if((x-x0)==sizey)
- {
- x=x0;
- y++;
- break;
- }
- }
- }
- }
- }
- continue; //查找到對應點陣字庫立即退出,防止多個漢字重復取模帶來影響
- }
- }
- /******************************************************************************
- 函數說明:顯示單個24x24漢字
- 入口數據:x,y顯示坐標
- *s 要顯示的漢字
- fc 字的顏色
- bc 字的背景色
- sizey 字號
- mode: 0非疊加模式 1疊加模式
- 返回值: 無
- ******************************************************************************/
- void LCD_ShowChinese24x24(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
- {
- u8 i,j,m=0;
- u16 k;
- u16 HZnum;//漢字數目
- u16 TypefaceNum;//一個字符所占字節大小
- u16 x0=x;
- TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
- HZnum=sizeof(tfont24)/sizeof(typFNT_GB24); //統計漢字數目
- for(k=0;k<HZnum;k++)
- {
- if ((tfont24[k].Index[0]==*(s))&&(tfont24[k].Index[1]==*(s+1)))
- {
- LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
- for(i=0;i<TypefaceNum;i++)
- {
- for(j=0;j<8;j++)
- {
- if(!mode)//非疊加方式
- {
- if(tfont24[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);
- else LCD_WR_DATA(bc);
- m++;
- if(m%sizey==0)
- {
- m=0;
- break;
- }
- }
- else//疊加方式
- {
- if(tfont24[k].Msk[i]&(0x01<<j)) LCD_DrawPoint(x,y,fc);//畫一個點
- x++;
- if((x-x0)==sizey)
- {
- x=x0;
- y++;
- break;
- }
- }
- }
- }
- }
- continue; //查找到對應點陣字庫立即退出,防止多個漢字重復取模帶來影響
- }
- }
- /******************************************************************************
- 函數說明:顯示單個32x32漢字
- 入口數據:x,y顯示坐標
- *s 要顯示的漢字
- fc 字的顏色
- bc 字的背景色
- sizey 字號
- mode: 0非疊加模式 1疊加模式
- 返回值: 無
- ******************************************************************************/
- void LCD_ShowChinese32x32(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
- {
- u8 i,j,m=0;
- u16 k;
- u16 HZnum;//漢字數目
- u16 TypefaceNum;//一個字符所占字節大小
- u16 x0=x;
- TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
- HZnum=sizeof(tfont32)/sizeof(typFNT_GB32); //統計漢字數目
- for(k=0;k<HZnum;k++)
- {
- if ((tfont32[k].Index[0]==*(s))&&(tfont32[k].Index[1]==*(s+1)))
- {
- LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
- for(i=0;i<TypefaceNum;i++)
- {
- for(j=0;j<8;j++)
- {
- if(!mode)//非疊加方式
- {
- if(tfont32[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);
- else LCD_WR_DATA(bc);
- m++;
- if(m%sizey==0)
- {
- m=0;
- break;
- }
- }
- else//疊加方式
- {
- if(tfont32[k].Msk[i]&(0x01<<j)) LCD_DrawPoint(x,y,fc);//畫一個點
- x++;
- if((x-x0)==sizey)
- {
- x=x0;
- y++;
- break;
- }
- }
- }
- }
- }
- continue; //查找到對應點陣字庫立即退出,防止多個漢字重復取模帶來影響
- }
- }
- /******************************************************************************
- 函數說明:顯示單個字符
- 入口數據:x,y顯示坐標
- num 要顯示的字符
- fc 字的顏色
- bc 字的背景色
- sizey 字號
- mode: 0非疊加模式 1疊加模式
- 返回值: 無
- ******************************************************************************/
- void LCD_ShowChar(u16 x,u16 y,u8 num,u16 fc,u16 bc,u8 sizey,u8 mode)
- {
- u8 temp,sizex,t,m=0;
- u16 i,TypefaceNum;//一個字符所占字節大小
- u16 x0=x;
- sizex=sizey/2;
- TypefaceNum=(sizex/8+((sizex%8)?1:0))*sizey;
- num=num-' '; //得到偏移后的值
- LCD_Address_Set(x,y,x+sizex-1,y+sizey-1); //設置光標位置
- for(i=0;i<TypefaceNum;i++)
- {
- if(sizey==12)temp=ascii_1206[num][i]; //調用6x12字體
- else if(sizey==16)temp=ascii_1608[num][i]; //調用8x16字體
- else if(sizey==24)temp=ascii_2412[num][i]; //調用12x24字體
- else if(sizey==32)temp=ascii_3216[num][i]; //調用16x32字體
- else return;
- for(t=0;t<8;t++)
- {
- if(!mode)//非疊加模式
- {
- if(temp&(0x01<<t))LCD_WR_DATA(fc);
- else LCD_WR_DATA(bc);
- m++;
- if(m%sizex==0)
- {
- m=0;
- break;
- }
- }
- else//疊加模式
- {
- if(temp&(0x01<<t))LCD_DrawPoint(x,y,fc);//畫一個點
- x++;
- if((x-x0)==sizex)
- {
- x=x0;
- y++;
- break;
- }
- }
- }
- }
- }
- /******************************************************************************
- 函數說明:顯示字符串
- 入口數據:x,y顯示坐標
- *p 要顯示的字符串
- fc 字的顏色
- bc 字的背景色
- sizey 字號
- mode: 0非疊加模式 1疊加模式
- 返回值: 無
- ******************************************************************************/
- void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 fc,u16 bc,u8 sizey,u8 mode)
- {
- while(*p!='\0')
- {
- LCD_ShowChar(x,y,*p,fc,bc,sizey,mode);
- x+=sizey/2;
- p++;
- }
- }
- /******************************************************************************
- 函數說明:顯示數字
- 入口數據:m底數,n指數
- 返回值: 無
- ******************************************************************************/
- u32 mypow(u8 m,u8 n)
- {
- u32 result=1;
- while(n--)result*=m;
- return result;
- }
- /******************************************************************************
- 函數說明:顯示整數變量
- 入口數據:x,y顯示坐標
- num 要顯示整數變量
- len 要顯示的位數
- fc 字的顏色
- bc 字的背景色
- sizey 字號
- 返回值: 無
- ******************************************************************************/
- void LCD_ShowIntNum(u16 x,u16 y,u16 num,u8 len,u16 fc,u16 bc,u8 sizey)
- {
- u8 t,temp;
- u8 enshow=0;
- u8 sizex=sizey/2;
- 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+t*sizex,y,' ',fc,bc,sizey,0);
- continue;
- }else enshow=1;
- }
- LCD_ShowChar(x+t*sizex,y,temp+48,fc,bc,sizey,0);
- }
- }
- /******************************************************************************
- 函數說明:顯示兩位小數變量
- 入口數據:x,y顯示坐標
- num 要顯示小數變量
- len 要顯示的位數
- fc 字的顏色
- bc 字的背景色
- sizey 字號
- 返回值: 無
- ******************************************************************************/
- void LCD_ShowFloatNum1(u16 x,u16 y,float num,u8 len,u16 fc,u16 bc,u8 sizey)
- {
- u8 t,temp,sizex;
- u16 num1;
- sizex=sizey/2;
- num1=num*100;
- for(t=0;t<len;t++)
- {
- temp=(num1/mypow(10,len-t-1))%10;
- if(t==(len-2))
- {
- LCD_ShowChar(x+(len-2)*sizex,y,'.',fc,bc,sizey,0);
- t++;
- len+=1;
- }
- LCD_ShowChar(x+t*sizex,y,temp+48,fc,bc,sizey,0);
- }
- }
- /******************************************************************************
- 函數說明:顯示圖片
- 入口數據:x,y起點坐標
- length 圖片長度
- width 圖片寬度
- pic[] 圖片數組
- 返回值: 無
- ******************************************************************************/
- void LCD_ShowPicture(u16 x,u16 y,u16 length,u16 width,const u8 pic[])
- {
- u16 i,j;
- u32 k=0;
- LCD_Address_Set(x,y,x+length-1,y+width-1);
- for(i=0;i<length;i++)
- {
- for(j=0;j<width;j++)
- {
- LCD_WR_DATA8(pic[k*2]);
- LCD_WR_DATA8(pic[k*2+1]);
- k++;
- }
- }
- }
復制代碼- /*
- * spi_lcd_st7735_init.h
- *
- * Created on: Oct 31, 2022
- * Author: Administrator
- */
- #ifndef LCD_SPI_LCD_ST7735_INIT_H_
- #define LCD_SPI_LCD_ST7735_INIT_H_
- #include "stm32f1xx_hal.h"
- #define USE_HORIZONTAL 1 //設置橫屏或者豎屏顯示 0或1為豎屏 2或3為橫屏
- #define u8 uint8_t
- #define u16 uint16_t
- #if USE_HORIZONTAL==0||USE_HORIZONTAL==1
- #define LCD_W 128
- #define LCD_H 160
- #else
- #define LCD_W 160
- #define LCD_H 128
- #endif
- //-----------------LCD端口定義----------------
- #define LCD_SCLK_Clr() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET); //GPIO_ResetBits(GPIOA,GPIO_PIN_0)//SCL=SCLK 低電平
- #define LCD_SCLK_Set() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET); //GPIO_SetBits(GPIOA,GPIO_PIN_0) 高電平
- #define LCD_MOSI_Clr() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET); //GPIO_ResetBits(GPIOA,GPIO_PIN_1)//SDA=MOSI
- #define LCD_MOSI_Set() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//GPIO_SetBits(GPIOA,GPIO_PIN_1)
- #define LCD_RES_Clr() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);//GPIO_ResetBits(GPIOA,GPIO_PIN_2)//RES
- #define LCD_RES_Set() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//GPIO_SetBits(GPIOA,GPIO_PIN_2)
- #define LCD_DC_Clr() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);//GPIO_ResetBits(GPIOA,GPIO_PIN_3)//DC
- #define LCD_DC_Set() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);//GPIO_SetBits(GPIOA,GPIO_PIN_3)
- #define LCD_CS_Clr() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);//GPIO_ResetBits(GPIOA,GPIO_PIN_4)//CS
- #define LCD_CS_Set() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//GPIO_SetBits(GPIOA,GPIO_PIN_4)
- #define LCD_BLK_Clr() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);//GPIO_ResetBits(GPIOA,GPIO_PIN_5)//BLK
- #define LCD_BLK_Set() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);//GPIO_SetBits(GPIOA,GPIO_PIN_5)
- //void LCD_GPIO_Init(void);//初始化GPIO
- void LCD_Writ_Bus(u8 dat);//模擬SPI時序
- void LCD_WR_DATA8(u8 dat);//寫入一個字節
- void LCD_WR_DATA(u16 dat);//寫入兩個字節
- void LCD_WR_REG(u8 dat);//寫入一個指令
- void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2);//設置坐標函數
- void LCD_Init(void);//LCD初始化
- #endif /* LCD_SPI_LCD_ST7735_INIT_H_ */
復制代碼- /*
- * spi_lcd_st7735_init.c
- *
- * Created on: Oct 31, 2022
- * Author: Administrator
- */
- #include "spi_lcd_st7735_init.h"
- #include "../delay/delay.h"
- //void LCD_GPIO_Init(void)
- //{
- // GPIO_InitTypeDef GPIO_InitStructure;
- // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能A端口時鐘
- // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
- // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
- // GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA
- // GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);
- //}
- /******************************************************************************
- 函數說明:LCD串行數據寫入函數
- 入口數據:dat 要寫入的串行數據
- 返回值: 無
- ******************************************************************************/
- void LCD_Writ_Bus(u8 dat)
- {
- u8 i;
- LCD_CS_Clr();
- for(i=0;i<8;i++)
- {
- LCD_SCLK_Clr();
- if(dat&0x80)
- {
- LCD_MOSI_Set();
- }
- else
- {
- LCD_MOSI_Clr();
- }
- LCD_SCLK_Set();
- dat<<=1;
- }
- LCD_CS_Set();
- }
- /******************************************************************************
- 函數說明:LCD寫入數據
- 入口數據:dat 寫入的數據
- 返回值: 無
- ******************************************************************************/
- void LCD_WR_DATA8(u8 dat)
- {
- LCD_Writ_Bus(dat);
- }
- /******************************************************************************
- 函數說明:LCD寫入數據
- 入口數據:dat 寫入的數據
- 返回值: 無
- ******************************************************************************/
- void LCD_WR_DATA(u16 dat)
- {
- LCD_Writ_Bus(dat>>8);
- LCD_Writ_Bus(dat);
- }
- /******************************************************************************
- 函數說明:LCD寫入命令
- 入口數據:dat 寫入的命令
- 返回值: 無
- ******************************************************************************/
- void LCD_WR_REG(u8 dat)
- {
- LCD_DC_Clr();//寫命令
- LCD_Writ_Bus(dat);
- LCD_DC_Set();//寫數據
- }
- /******************************************************************************
- 函數說明:設置起始和結束地址
- 入口數據: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+2);
- LCD_WR_DATA(x2+2);
- LCD_WR_REG(0x2b);//行地址設置
- LCD_WR_DATA(y1+1);
- LCD_WR_DATA(y2+1);
- LCD_WR_REG(0x2c);//儲存器寫
- }
- else if(USE_HORIZONTAL==1)
- {
- LCD_WR_REG(0x2a);//列地址設置
- LCD_WR_DATA(x1+2);
- LCD_WR_DATA(x2+2);
- LCD_WR_REG(0x2b);//行地址設置
- LCD_WR_DATA(y1+1);
- LCD_WR_DATA(y2+1);
- LCD_WR_REG(0x2c);//儲存器寫
- }
- else if(USE_HORIZONTAL==2)
- {
- LCD_WR_REG(0x2a);//列地址設置
- LCD_WR_DATA(x1+1);
- LCD_WR_DATA(x2+1);
- LCD_WR_REG(0x2b);//行地址設置
- LCD_WR_DATA(y1+2);
- LCD_WR_DATA(y2+2);
- LCD_WR_REG(0x2c);//儲存器寫
- }
- else
- {
- LCD_WR_REG(0x2a);//列地址設置
- LCD_WR_DATA(x1+1);
- LCD_WR_DATA(x2+1);
- LCD_WR_REG(0x2b);//行地址設置
- LCD_WR_DATA(y1+2);
- LCD_WR_DATA(y2+2);
- LCD_WR_REG(0x2c);//儲存器寫
- }
- }
- void LCD_Init(void)
- {
- // LCD_GPIO_Init();//初始化GPIO
- LCD_RES_Clr();//復位
- delay_ms(100);
- LCD_RES_Set();
- delay_ms(100);
- LCD_BLK_Set();//打開背光
- delay_ms(100);
- //************* Start Initial Sequence **********//
- LCD_WR_REG(0x11); //Sleep out
- delay_ms(120); //Delay 120ms
- //------------------------------------ST7735S Frame Rate-----------------------------------------//
- LCD_WR_REG(0xB1);
- LCD_WR_DATA8(0x05);
- LCD_WR_DATA8(0x3C);
- LCD_WR_DATA8(0x3C);
- LCD_WR_REG(0xB2);
- LCD_WR_DATA8(0x05);
- LCD_WR_DATA8(0x3C);
- LCD_WR_DATA8(0x3C);
- LCD_WR_REG(0xB3);
- LCD_WR_DATA8(0x05);
- LCD_WR_DATA8(0x3C);
- LCD_WR_DATA8(0x3C);
- LCD_WR_DATA8(0x05);
- LCD_WR_DATA8(0x3C);
- LCD_WR_DATA8(0x3C);
- //------------------------------------End ST7735S Frame Rate---------------------------------//
- LCD_WR_REG(0xB4); //Dot inversion
- LCD_WR_DATA8(0x03);
- //------------------------------------ST7735S Power Sequence---------------------------------//
- LCD_WR_REG(0xC0);
- LCD_WR_DATA8(0x28);
- LCD_WR_DATA8(0x08);
- LCD_WR_DATA8(0x04);
- LCD_WR_REG(0xC1);
- LCD_WR_DATA8(0XC0);
- LCD_WR_REG(0xC2);
- LCD_WR_DATA8(0x0D);
- LCD_WR_DATA8(0x00);
- LCD_WR_REG(0xC3);
- LCD_WR_DATA8(0x8D);
- LCD_WR_DATA8(0x2A);
- LCD_WR_REG(0xC4);
- LCD_WR_DATA8(0x8D);
- LCD_WR_DATA8(0xEE);
- //---------------------------------End ST7735S Power Sequence-------------------------------------//
- LCD_WR_REG(0xC5); //VCOM
- LCD_WR_DATA8(0x1A);
- LCD_WR_REG(0x36); //MX, MY, RGB mode
- 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);
- //------------------------------------ST7735S Gamma Sequence---------------------------------//
- LCD_WR_REG(0xE0);
- LCD_WR_DATA8(0x04);
- LCD_WR_DATA8(0x22);
- LCD_WR_DATA8(0x07);
- LCD_WR_DATA8(0x0A);
- LCD_WR_DATA8(0x2E);
- LCD_WR_DATA8(0x30);
- LCD_WR_DATA8(0x25);
- LCD_WR_DATA8(0x2A);
- LCD_WR_DATA8(0x28);
- LCD_WR_DATA8(0x26);
- LCD_WR_DATA8(0x2E);
- LCD_WR_DATA8(0x3A);
- LCD_WR_DATA8(0x00);
- LCD_WR_DATA8(0x01);
- LCD_WR_DATA8(0x03);
- LCD_WR_DATA8(0x13);
- LCD_WR_REG(0xE1);
- LCD_WR_DATA8(0x04);
- LCD_WR_DATA8(0x16);
- LCD_WR_DATA8(0x06);
- LCD_WR_DATA8(0x0D);
- LCD_WR_DATA8(0x2D);
- LCD_WR_DATA8(0x26);
- LCD_WR_DATA8(0x23);
- LCD_WR_DATA8(0x27);
- LCD_WR_DATA8(0x27);
- LCD_WR_DATA8(0x25);
- LCD_WR_DATA8(0x2D);
- LCD_WR_DATA8(0x3B);
- LCD_WR_DATA8(0x00);
- LCD_WR_DATA8(0x01);
- LCD_WR_DATA8(0x04);
- LCD_WR_DATA8(0x13);
- //------------------------------------End ST7735S Gamma Sequence-----------------------------//
- LCD_WR_REG(0x3A); //65k mode
- LCD_WR_DATA8(0x05);
- LCD_WR_REG(0x29); //Display on
- }
復制代碼- /*
- * spi_lcd_st7735_font.h
- *
- * Created on: Oct 31, 2022
- * Author: Administrator
- */
- #ifndef LCD_SPI_LCD_ST7735_FONT_H_
- #define LCD_SPI_LCD_ST7735_FONT_H_
- const unsigned char ascii_1206[][12]={
- {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
- {0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x04,0x00,0x00},/*"!",1*/
- …………省略, 詳見附件…………
- 0x08,0x08,0x20,0x08,0x08,0x00,0x00,0x00,/*"豬",7*/
- /* (24 X 24 , 宋體 )*/
- };
- typedef struct
- {
- unsigned char Index[2];
- unsigned char Msk[128];
- }typFNT_GB32;
- const typFNT_GB32 tfont32[]={
- "中",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x01,0x00,
- 0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,
- 0x10,0x80,0x01,0x0C,0xF0,0xFF,0xFF,0x0F,0x30,0x80,0x01,0x04,0x30,0x80,0x01,0x04,
- 0x30,0x80,0x01,0x04,0x30,0x80,0x01,0x04,0x30,0x80,0x01,0x04,0x30,0x80,0x01,0x04,
- 0x30,0x80,0x01,0x04,0x30,0x80,0x01,0x04,0xF0,0xFF,0xFF,0x07,0x30,0x80,0x01,0x04,
- 0x30,0x80,0x01,0x04,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,
- 0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,
- 0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,/*"中",0*/
- "景",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,
- 0x00,0xFF,0xFF,0x01,0x00,0x03,0x80,0x01,0x00,0x03,0x80,0x01,0x00,0xFF,0xFF,0x01,
- 0x00,0x03,0x80,0x01,0x00,0x03,0x80,0x01,0x00,0xFF,0xFF,0x01,0x00,0x81,0x81,0x00,
- 0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x1C,0xFC,0xFF,0xFF,0x3F,0x00,0x00,0x40,0x00,
- 0x00,0x03,0xC0,0x01,0x00,0xFF,0xFF,0x01,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,
- 0x00,0x03,0xC0,0x00,0x00,0xFF,0xFF,0x00,0x00,0x01,0x41,0x00,0x00,0x04,0x01,0x00,
- 0x00,0x0E,0x71,0x00,0x00,0x07,0x81,0x01,0x80,0x01,0x01,0x07,0x60,0x00,0x01,0x0E,
- 0x18,0x98,0x01,0x1C,0x04,0xE0,0x01,0x18,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,/*"景",1*/
- "園",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xF0,0xFF,0xFF,0x1F,
- 0x30,0x00,0x00,0x0C,0x30,0x00,0x00,0x0C,0x30,0x00,0x10,0x0C,0x30,0xFE,0x3F,0x0C,
- 0x30,0x04,0x00,0x0C,0x30,0x00,0x00,0x0C,0x30,0x00,0x00,0x0C,0x30,0x00,0x00,0x0C,
- 0x30,0x00,0xC0,0x0C,0xF0,0xFF,0xFF,0x0D,0x30,0x30,0x06,0x0E,0x30,0x30,0x06,0x0C,
- 0x30,0x10,0x06,0x0C,0x30,0x10,0x06,0x0C,0x30,0x10,0x06,0x0C,0x30,0x18,0x86,0x0C,
- 0x30,0x18,0x86,0x0C,0x30,0x08,0x06,0x0D,0x30,0x0C,0x86,0x0D,0x30,0x06,0xEE,0x0F,
- 0x30,0x02,0xFC,0x0D,0x30,0x01,0x00,0x0C,0xF0,0x00,0x00,0x0C,0x30,0x00,0x00,0x0C,
- 0xF0,0xFF,0xFF,0x0F,0x30,0x00,0x00,0x0C,0x10,0x00,0x00,0x04,0x00,0x00,0x00,0x00,/*"園",2*/
- "電",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x01,0x00,
- 0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,
- 0xE0,0xFF,0xFF,0x03,0x60,0xC0,0x00,0x03,0x60,0xC0,0x00,0x03,0x60,0xC0,0x00,0x03,
- 0x60,0xC0,0x00,0x03,0x60,0xC0,0x00,0x03,0x60,0xC0,0x00,0x03,0xE0,0xFF,0xFF,0x03,
- 0x60,0xC0,0x00,0x03,0x60,0xC0,0x00,0x03,0x60,0xC0,0x00,0x03,0x60,0xC0,0x00,0x03,
- 0x60,0xC0,0x00,0x03,0xE0,0xFF,0xFF,0x03,0x60,0xC0,0x00,0x01,0x60,0xC0,0x00,0x00,
- 0x00,0xC0,0x00,0x08,0x00,0xC0,0x00,0x10,0x00,0xC0,0x00,0x10,0x00,0xC0,0x00,0x18,
- 0x00,0xC0,0x01,0x38,0x00,0x80,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"電",3*/
- "子",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
- 0xC0,0xFF,0xFF,0x07,0x00,0x00,0x80,0x07,0x00,0x00,0xC0,0x00,0x00,0x00,0x60,0x00,
- 0x00,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x80,0x03,0x00,0x00,0x80,0x03,0x00,
- 0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x08,0x00,0x80,0x01,0x1C,0xFC,0xFF,0xFF,0x3F,
- 0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,
- 0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,
- 0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,
- 0x00,0xFC,0x01,0x00,0x00,0xE0,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,/*"子",4*/
- };
- #endif /* LCD_SPI_LCD_ST7735_FONT_H_ */
復制代碼 修正時間方法,上位機通過 串口usart1 訪問 115200 ,編碼改成中文,按回車顯示當前時間,按C 回車 提示操作成功 輸入當前時間 比如:20220916144030 年月日小時分鐘秒 回車 就同步成功。
RTC實時時鐘測試
實時時間:2022-09-16 14:44:07
單按回車鍵更新時間,輸入字母C初始化時鐘
請輸入設置時間,格式20170806120000,按回車鍵確定!
串口usart3 是留給與藍牙串口通信,手機藍牙助手訪問串口usart3藍牙,上面同樣的指令來一遍
Keil代碼下載:
Keil代碼.7z
(748.62 KB, 下載次數: 60)
2022-11-2 16:18 上傳
點擊文件名下載附件
STM32F103C8T6 HAL庫方式 1.8寸TFT ST7735 和LCD1602AHAL庫方式源碼 下載積分: 黑幣 -5
|