利用彩屏顯示圖片需要先完成彩屏的驅動程序,然后在驅動程序的基礎上再編寫應用程序。
彩屏的驅動程序如果寫好的話,就可以一直使用了,精力主要集中在應用程序的編寫就可以了,但是移植的話,要移植驅動程序。其實移植也只是改變那些很底層的靠近處理器的那部分代碼。
因為STM32F103C8的片上只有64K的FLASH,所以不能存儲太多的圖片數據,也就不能顯示太大的圖片。
一下的程序注釋的比較詳細,看懂了基本上就可以用了。
彩屏驅動程序的頭文件lcd.h如下:
#define uchar unsigned char
#define uint unsigned int
#define Bus_16 //16位數據模式,如果使用8位模式,請注釋此語句,如果使用16位模式,請打開此句
#define LCD_DataPortH P1 //高8位數據口,8位模式下只使用高8位
#define LCD_DataPortL P0 //低8位數據口 ,8位模式下低8位可以不接線
#define LCD_WR GPIO_Pin_2 //WR 引腳定義 P2^5
#define LCD_RS GPIO_Pin_1 //RS 引腳定義 P2^6
#define LCD_CS GPIO_Pin_0 //CS 引腳定義 P2^7
#define LCD_RST GPIO_Pin_11 //RST 引腳定義 P3^3
#define LCD_RD GPIO_Pin_8 //RD 引腳定義 P3^2
#define LCD_SIZE_X 240
#define LCD_SIZE_Y 320
extern uint colors[];
extern void pic_play(uint xStart, uint xEnd, uint yStart, uint yEnd); //顯示圖片函數
void delayms(int count) ;
//void LCD_Writ_Bus(char VH,char VL);
void LCD_Init(void);
void LCD_Writ_Bus( uint VH, uint VL);
void LCD_Write_COM(char VH,char VL);
void LCD_Write_DATA(char VH,char VL);
void Pant(char VH,char VL);
void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2);
驅動程序lcd.c文件如下:
#include "stm32f10x_lib.h"
#include "Lcd.h"
//存儲圖片數據的頭文件
//#include "picture.h"
#include "picture_sara.h"
#include "xiaoqian.h"
#include "yang.h"
#define LCD_rest(x) x ? GPIO_SetBits(GPIOA, LCD_RST): GPIO_ResetBits(GPIOA, LCD_RST) //自己定義位操作函數
#define LCD_rd(x) x ? GPIO_SetBits(GPIOA, LCD_RD) : GPIO_ResetBits(GPIOA, LCD_RD)
#define LCD_rs(x) x ? GPIO_SetBits(GPIOB, LCD_RS) : GPIO_ResetBits(GPIOB, LCD_RS)
#define LCD_wr(x) x ? GPIO_SetBits(GPIOB, LCD_WR) : GPIO_ResetBits(GPIOB, LCD_WR)
#define LCD_cs(x) x ? GPIO_SetBits(GPIOB, LCD_CS) : GPIO_ResetBits(GPIOB, LCD_CS)
uint colors[]=
{
0xf800,0x07e0,0x001f,0xffe0,0x0000,0x07ff,0xf81f,0xffff //顏色數據
};
void LCD_Init(void) //初始化LCD
{
LCD_rest(1);
delayms(5);
LCD_rest(0);
delayms(5);
LCD_rest(1);
delayms(5);
LCD_cs(0); //打開片選使能
//
LCD_Write_COM(0x00,0xE5); LCD_Write_DATA(0x78,0xF0); // set SRAM internal timing
LCD_Write_COM(0x00,0x01); LCD_Write_DATA(0x01,0x00); // set SS and SM bit
LCD_Write_COM(0x00,0x02); LCD_Write_DATA(0x07,0x00); // set 1 line inversion
LCD_Write_COM(0x00,0x03); LCD_Write_DATA(0x10,0x30); // set GRAM write direction and BGR=1.
LCD_Write_COM(0x00,0x04); LCD_Write_DATA(0x00,0x00); // Resize register
LCD_Write_COM(0x00,0x08); LCD_Write_DATA(0x02,0x07); // set the back porch and front porch
LCD_Write_COM(0x00,0x09); LCD_Write_DATA(0x00,0x00); // set non-display area refresh cycle ISC[3:0]
LCD_Write_COM(0x00,0x0A); LCD_Write_DATA(0x00,0x00); // FMARK function
LCD_Write_COM(0x00,0x0C); LCD_Write_DATA(0x00,0x00); // RGB interface setting
LCD_Write_COM(0x00,0x0D); LCD_Write_DATA(0x00,0x00); // Frame marker Position
LCD_Write_COM(0x00,0x0F); LCD_Write_DATA(0x00,0x00); // RGB interface polarity
//
LCD_Write_COM(0x00,0x10); LCD_Write_DATA(0x00,0x00); // SAP, BT[3:0], AP, DSTB, SLP, STB
LCD_Write_COM(0x00,0x11); LCD_Write_DATA(0x00,0x07); // DC1[2:0], DC0[2:0], VC[2:0]
LCD_Write_COM(0x00,0x12); LCD_Write_DATA(0x00,0x00); // VREG1OUT voltage
LCD_Write_COM(0x00,0x13); LCD_Write_DATA(0x00,0x00); // VDV[4:0] for VCOM amplitude
LCD_Write_COM(0x00,0x07); LCD_Write_DATA(0x00,0x01);
delayms(50); // Dis-charge capacitor power voltage
LCD_Write_COM(0x00,0x10); LCD_Write_DATA(0x10,0x90); // 1490//SAP, BT[3:0], AP, DSTB, SLP, STB
LCD_Write_COM(0x00,0x11); LCD_Write_DATA(0x02,0x27); // DC1[2:0], DC0[2:0], VC[2:0]
delayms(50); // Delay 50ms
LCD_Write_COM(0x00,0x12); LCD_Write_DATA(0x00,0x1F); //001C// Internal reference voltage= Vci;
delayms(50); // Delay 50ms
LCD_Write_COM(0x00,0x13); LCD_Write_DATA(0x15,0x00); //0x1000//1400 Set VDV[4:0] for VCOM amplitude 1A00
LCD_Write_COM(0x00,0x29); LCD_Write_DATA(0x00,0x27); //0x0012 //001a Set VCM[5:0] for VCOMH //0x0025 0034
LCD_Write_COM(0x00,0x2B); LCD_Write_DATA(0x00,0x0D); // Set Frame Rate 000C
delayms(50); // Delay 50ms
LCD_Write_COM(0x00,0x20); LCD_Write_DATA(0x00,0x00); // GRAM horizontal Address
LCD_Write_COM(0x00,0x21); LCD_Write_DATA(0x00,0x00); // GRAM Vertical Address
// ----------- Adjust the Gamma Curve ----------//
LCD_Write_COM(0x00,0x30); LCD_Write_DATA(0x00,0x00);
LCD_Write_COM(0x00,0x31); LCD_Write_DATA(0x07,0x07);
LCD_Write_COM(0x00,0x32); LCD_Write_DATA(0x03,0x07);
LCD_Write_COM(0x00,0x35); LCD_Write_DATA(0x02,0x00);
LCD_Write_COM(0x00,0x36); LCD_Write_DATA(0x00,0x08);//0207
LCD_Write_COM(0x00,0x37); LCD_Write_DATA(0x00,0x04);//0306
LCD_Write_COM(0x00,0x38); LCD_Write_DATA(0x00,0x00);//0102
LCD_Write_COM(0x00,0x39); LCD_Write_DATA(0x07,0x07);//0707
LCD_Write_COM(0x00,0x3C); LCD_Write_DATA(0x00,0x02);//0702
LCD_Write_COM(0x00,0x3D); LCD_Write_DATA(0x1D,0x04);//1604
//------------------ Set GRAM area ---------------//
LCD_Write_COM(0x00,0x50); LCD_Write_DATA(0x00,0x00); // Horizontal GRAM Start Address
LCD_Write_COM(0x00,0x51); LCD_Write_DATA(0x00,0xEF); // Horizontal GRAM End Address
LCD_Write_COM(0x00,0x52); LCD_Write_DATA(0x00,0x00); // Vertical GRAM Start Address
LCD_Write_COM(0x00,0x53); LCD_Write_DATA(0x01,0x3F); // Vertical GRAM Start Address
LCD_Write_COM(0x00,0x60); LCD_Write_DATA(0xA7,0x00); // Gate Scan Line
LCD_Write_COM(0x00,0x61); LCD_Write_DATA(0x00,0x01); // NDL,VLE, REV
LCD_Write_COM(0x00,0x6A); LCD_Write_DATA(0x00,0x00); // set scrolling line
//-------------- Partial Display Control ---------//
LCD_Write_COM(0x00,0x80); LCD_Write_DATA(0x00,0x00);
LCD_Write_COM(0x00,0x81); LCD_Write_DATA(0x00,0x00);
LCD_Write_COM(0x00,0x82); LCD_Write_DATA(0x00,0x00);
LCD_Write_COM(0x00,0x83); LCD_Write_DATA(0x00,0x00);
LCD_Write_COM(0x00,0x84); LCD_Write_DATA(0x00,0x00);
LCD_Write_COM(0x00,0x85); LCD_Write_DATA(0x00,0x00);
//-------------- Panel Control -------------------//
LCD_Write_COM(0x00,0x90); LCD_Write_DATA(0x00,0x10);
LCD_Write_COM(0x00,0x92); LCD_Write_DATA(0x06,0x00);
LCD_Write_COM(0x00,0x07); LCD_Write_DATA(0x01,0x33); // 262K color and display ON
LCD_cs(1); //關閉片選使能
}
void delayms(int count) //
{
int i,j;
for(i=0;i for(j=0;j<100;j++); } #ifdef Bus_16 //條件編譯-16位數據模式 void LCD_Writ_Bus(uint VH , uint VL) //并行數據寫入函數 { //LCD_DataPortH=VH; //高位P1口 //屏蔽高8位 將數據送到PA0-PA7 GPIOA->BSRR = VH & 0x00ff; GPIOA->BRR = (~VH) & 0x00ff; //GPIO_SetBits(GPIOA, VH & 0x00ff); //GPIO_ResetBits(GPIOA, (~ VH & 0x00ff)); //LCD_DataPortL=VL; //低位P0口 //屏蔽低8位 將數據送到PB8-PB15 GPIOB->BSRR = (VL)<<8 & 0xff00; GPIOB->BRR = ((~VL)<<8) & 0xff00; LCD_wr(0); LCD_wr(1); } #else //條件編譯-8位數據模式 void LCD_Writ_Bus(char VH,char VL) //并行數據寫入函數 { //LCD_DataPortH=VH; //八位模式都用P0口送數據 //LCD_wr(0); //LCD_wr(1); //LCD_DataPortH=VL; //八位模式都用P0口送數據 //LCD_wr(0); //LCD_wr(1); } #endif void LCD_Write_COM(char VH,char VL) //發送命令 { LCD_rs(0); LCD_Writ_Bus(VH,VL); } void LCD_Write_DATA(char VH,char VL) //發送數據 { LCD_rs(1); LCD_Writ_Bus(VH,VL); } void Pant(char VH,char VL) //涂滿全屏函數 { int i,j; LCD_cs(0); //打開片選使能 Address_set(0,0,239,319); for(i=0;i<320;i++) { for (j=0;j<240;j++) { LCD_Write_DATA(VH,VL); } } LCD_cs(1); //關閉片選使能 } void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2) //設置地址范圍函數 { LCD_Write_COM(0x00,0x20);LCD_Write_DATA(x1>>8,x1); //設置X坐標位置 LCD_Write_COM(0x00,0x21);LCD_Write_DATA(y1>>8,y1); //設置Y坐標位置 LCD_Write_COM(0x00,0x50);LCD_Write_DATA(x1>>8,x1); //開始X LCD_Write_COM(0x00,0x52);LCD_Write_DATA(y1>>8,y1); //開始Y LCD_Write_COM(0x00,0x51);LCD_Write_DATA(x2>>8,x2); //結束X LCD_Write_COM(0x00,0x53);LCD_Write_DATA(y2>>8,y2); //結束Y LCD_Write_COM(0x00,0x22); } void pic_play(uint Start_X, uint End_X,uint Start_Y,uint End_Y) { uint m; //LCD_CS = 0; GPIO_ResetBits(GPIOB,LCD_CS); //打開片選 Address_set(Start_X,Start_Y,End_X,End_Y) ; //指定圖片顯示的范圍 // LCD_RS = 1; GPIO_SetBits(GPIOB, LCD_RS); //關閉片選 //循環把圖片的所有數據依次寫入 Address_set(0,0,141,79); //用彩屏顯示圖片時,一定要注意圖片長寬比例,如果長寬比例不對的話,顯示的圖片就會變形 //例如本幅圖片取模軟件輸出的長寬為(177,100),所以在這里圖片的顯示范圍必須設為(0,0,176,99),即x范圍為0~176,y的范圍為 //0~99.這樣圖片才能正常顯示,否則圖片就會變形。 for(m=0;m<22728/2;m++) //這里的35400這個數字指定顯示圖片的范圍,因為該圖的數據總共只有35400個,所以這里指定 //整幅圖都顯示出來。如果這個數比35400小,則只顯示該圖的一部分。 { LCD_Write_DATA(gImage_sara[m*2+1],gImage_sara[m*2]); } Address_set(0,90,65,189); //一定要注意保持比例 for(m=0;m<13200/2;m++) { LCD_Write_DATA(gImage_xiaoqian[m*2+1],gImage_xiaoqian[m*2]); } Address_set(75,90,137,189); //一定要注意保持比例 for(m=0;m<12600/2;m++) { LCD_Write_DATA(gImage_yang[m*2+1],gImage_yang[m*2]); } //LCD_CS = 1; GPIO_SetBits(GPIOB, LCD_CS); //關閉片選 } 主程序main.c 在主程序中完成對系統的初始化配置,利用彩屏的驅動程序完成圖片的顯示等功能,程序如下: #include "stm32f10x_lib.h" #include "lcd.h" GPIO_InitTypeDef GPIO_InitStructure; //定義GPIO初始化的結構體變量
上一篇:STM32F10x芯片GPIO/AFIO端口配置總結
下一篇:STM32實現DAC輸出的相關設置
推薦閱讀最新更新時間:2025-05-31 01:19