LCD240128(UC1698芯片)驅動采用STM32的FSMC
單片機源程序如下:
- /*
- (芯片:UC1698 芯片驅動,參考LCD_240128CFW顯示屏)
- */
- #include "UC1698.h"
- #include "FONT.H"
- //LCD重要參數集
- typedef struct
- {
- u16 width; //LCD 寬度
- u16 height; //LCD 高度
- u16 id; //LCD ID
- u8 dir; //橫屏還是豎屏控制:0,豎屏;1,橫屏。
- u16 wramcmd; //開始寫gram指令
- u16 setxcmd; //設置x坐標指令
- u16 setycmd; //設置y坐標指令
- }lcd_dev;
- /*************LCD 屏的像素LCD_MAX_width * LCD_MAX_height *********************************/
- #define LCD_MAX_width 240
- #define LCD_MAX_height 128
- /*************UC1698寄存器控制命令*********************************/
- #define UC1698_CA_LSB(x) (0x00|(0x0f&x)) //Set Column Address LSB 列地址
- #define UC1698_CA_MSB(x) (0x10|0x0f&(x>>4)) //Set Column Address MSB 列地址
- #define UC1698_TC(x) (0x24|(0x03&x)) //Set Temp. Compensation 溫度補償LSB
- #define UC1698_PC(x) (0x28|(0x03&x)) //Set Power control 功率控制
- #define UC1698_RA_LSB(y) (0x60|(0x0f&y)) //Set row Address LSB 行地址
- #define UC1698_RA_MSB(y) (0x70|0x0f&(y>>4)) //Set Row Address MSB 行地址
- #define UC1698_PDC_LC(x) (0x84|x) //Set Partial Display Control
- #define UC1698_PM 0x81 //Set VBIAS Potentiometer 設置對比度bf(ContrastLevel)
- #define UC1698_RAC_AC(x) (0x88|(0x07&x)) //Set RAM Address Control RAM地址控制
- #define UC1698_LR_LC(x) (0xa0|(0x03&x)) //Set Line rate 設置行掃描頻率
- #define UC1698_AP_DC(x) (0xa4|x) //Set All-Pixel-ON 顯示特性性
- #define UC1698_ID_DC(x) (0xa6|x) //Set Inverse display 設置方向顯示(0--正、1--反向);
- #define UC1698_DE_DC 0xad //Set Display enable 開顯示
- #define UC1698_MC_DC(x) (0xC0|(0x07&x)) //Set LCD Mapping contro 設置lcd映射控制:LCD映像MY=1,MX=0,LC0=0
- #define UC1698_NIV 0xC8 //Set N-Line Inversion 設置M信號為0行翻磚(LCD_WR_REG(0x10); )
- #define UC1698_CP_LC(x) (0xD0|x) //Set Color pattern彩色數據格式 0/1
- #define UC1698_CM_LC(x) (0xD4|(0X03&x)) //Set Color Mode 彩色數據模式 0x01:12位 0x02:16位
- #define UC1698_CSF(x) (0xd8|(x&0X07)) //Set COM Scan Function 掃描模式
- #define UC1698_BR(x) (0xE8|(x&0X03)) //Set LCD Bias Ratio 設置偏壓比1/10 LCD_WR_REG(0xe9);
- #define UC1698_CEN 0xf1 //Set COM End
- #define UC1698_DST 0xf2 //Set Partial Display Start
- #define UC1698_CDEN 0xf3 //Set Set Partial Display End
- #define UC1698_WPC0 0xf4 // Set Window Program Starting Columm Address 窗口左邊界
- #define UC1698_WPP0 0xf5 // Set Window Program Starting Row Address 窗口上邊界
- #define UC1698_WPC1 0xf6 // Set Window Program Ending Columm Address 窗口右邊界
- #define UC1698_WPP1 0xf7 // Set Window Program Starting Row Address 窗口下邊界
- #define UC1698_WPM_AC(x) (0xf8|x) // Window Program Mode: 0 ->Inside;1-> All area
- static vu8 ContrastLevel = 0x2D; //對比度bf
- #if Address_struct==1
- //寫寄存器函數 指令寫入子程序-
- //regval:寄存器值
- void LCD_WR_REG(vu16 regval)
- {
- regval=regval; //使用-O2優化的時候,必須插入的延時
- LCD->LCD_REG=regval;//寫入要寫的寄存器序號
- }
- //寫LCD數據 數據寫入子程序
- //data:要寫入的值
- void LCD_WR_DATA(vu16 data)
- {
- data=data; //使用-O2優化的時候,必須插入的延時
- LCD->LCD_RAM=data;
- }
- //讀LCD數據
- //返回值:讀到的值
- u16 LCD_RD_DATA(void)
- {
- vu16 ram; //防止被優化
- ram=LCD->LCD_RAM;
- return ram;
- }
- #endif
- /*************FSMC********************************
-
-
-
- ************* *********************************/
-
- void FSMC_Init(void){
- FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
- FSMC_NORSRAMTimingInitTypeDef readWriteTiming;
- FSMC_NORSRAMTimingInitTypeDef writeTiming;
- readWriteTiming.FSMC_AddressSetupTime = 0XF; //地址建立時間(ADDSET)為16個HCLK 1/168M=6ns*16=96ns
- readWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持時間(ADDHLD)模式A未用到
- readWriteTiming.FSMC_DataSetupTime = 60; //數據保存時間為60個HCLK =6*60=360ns
- readWriteTiming.FSMC_BusTurnAroundDuration = 0x00; //總線恢復時間
- readWriteTiming.FSMC_CLKDivision = 0x00; // 時鐘分頻因子
- readWriteTiming.FSMC_DataLatency = 0x00; //數據產生時間
- readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A; // //FSMC NOR控制器時序:模式A
-
- writeTiming.FSMC_AddressSetupTime =10; //地址建立時間(ADDSET)為9個HCLK =54ns
- writeTiming.FSMC_AddressHoldTime = 10; //地址保持時間(A
- writeTiming.FSMC_DataSetupTime = 10; //數據保存時間為6ns*9個HCLK=54ns
- writeTiming.FSMC_BusTurnAroundDuration = 0x00;
- writeTiming.FSMC_CLKDivision = 0x00;
- writeTiming.FSMC_DataLatency = 0x00;
- writeTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A
-
- FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;// 這里我們使用NE4 ,也就對應BTCR[6],[7]。--》 nor被分為四塊,其中這個參數是說明對那個塊編程
- FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; // 不復用數據地址--》 地址\數據是否復用
- FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM; //SRAM --》 存儲器類型
- FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;//存儲器數據寬度為16bit --》數據總線寬度 8位/16位
- FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable; --》是否進行成組模式訪問
- FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;//等待信號有效級性
-
- FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; //該位決定控制器是否支持把非對齊的AHB成組操作分割成2次線性操作;該位僅在存儲器的成組模式下有效。
- FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; //當閃存存儲器處于成組傳輸模式時,NWAIT信號指示從閃存存儲器出來的數據是否有效或是否需要插入等待周期。該位決定存儲器是在等待狀態之前的一個時鐘周期產生NWAIT信號,還是在等待狀態期間產生NWAIT信號。
- FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; // 存儲器寫使能----》該位指示FSMC是否允許/禁止對存儲器的寫操作。
- FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; //當閃存存儲器處于成組傳輸模式時,這一位允許/禁止通過NWAIT信號插入等待狀態。
- FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable; //設置是否使能在同步傳輸時使用的等待信號,在控制同步類型的NOR或PSRAM時,存儲器可以使用FSMC_NWAIT引腳通知STM32需要等待。
-
- FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
- //FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; // 讀寫使用不同的時序 --》該位允許FSMC使用FSMC_BWTR寄存器,即允許讀和寫使用不同的時序。
- FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; //對于處于成組傳輸模式的閃存存儲器,這一位允許/禁止通過NWAIT信號插入等待狀態。讀操作的同步成組傳輸協議使能位是FSMC_BCRx寄存器的BURSTEN位。
- FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &writeTiming; //寫時序--->//寫時序配置指針
- FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming; //讀寫時序--->//讀時序配置指針
- FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); //初始化FSMC配置
- FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE); // 使能BANK1
-
- }
- //初始化lcd
- //該初始化函數可以初始化各種ILI93XX液晶,但是其他函數是基于ILI9320的!!!
- //在其他型號的驅動芯片上沒有測試!
- void LCD_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- //************************打開相應的時鐘使能***********************************/
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG, ENABLE);//使能PD,PE,PF,PG時鐘
- RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE);//使能FSMC時鐘
-
- //************************背光燈的設置***********************************/
-
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通輸出模式
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//GPIOE PE對應IO口(背光燈)
- GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIO
- GPIO_SetBits(GPIOE,GPIO_Pin_5);//PE5 設置為高,
- //BLK_OFF;
-
- //************************LCD復位***********************************/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//GPIOG PG對應IO口(LCD復位)
- GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化GPIO
- GPIO_SetBits(GPIOG,GPIO_Pin_3); // 設置為高,
-
- //************************數據總線與使能線的IO配置***********************************/
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//復用輸出
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_14|GPIO_Pin_15;
- GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;
- GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_12;//PF12,FSMC_A6
- GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化
- //************************相應管腳映射到FSMC接口 數據總線+使能控制線***********************************/
- GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC); //-->D0
- GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC); //-->D1
- GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FSMC); //-->D2
- GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FSMC); //-->D3
-
- GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FSMC); //-->D4
- GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FSMC); //-->D5
- GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FSMC); //-->D6
- GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC); //-->D7
-
- GPIO_PinAFConfig(GPIOD,GPIO_PinSource4,GPIO_AF_FSMC); //-->RD
- GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_FSMC); //-->WR
-
- GPIO_PinAFConfig(GPIOG,GPIO_PinSource12,GPIO_AF_FSMC); // -->CS
- GPIO_PinAFConfig(GPIOG,GPIO_PinSource2,GPIO_AF_FSMC); //->CD(A12)
- FSMC_Init();//FSMC_初始化
-
- LCD_RESET_L;
- delay_ms(6);
- LCD_RESET_H;
- delay_ms(80);
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
以上3個文件51hei下載,不含工程文件,請自行移植:
LCD_240128CFW顯示屏(FSMC).rar
(19.85 KB, 下載次數: 63)
2021-6-16 10:09 上傳
點擊文件名下載附件
|