|
LCD240128(UC1698芯片)驅(qū)動(dòng)采用STM32的FSMC
單片機(jī)源程序如下:
- /*
- (芯片:UC1698 芯片驅(qū)動(dòng),參考LCD_240128CFW顯示屏)
- */
- #include "UC1698.h"
- #include "FONT.H"
- //LCD重要參數(shù)集
- typedef struct
- {
- u16 width; //LCD 寬度
- u16 height; //LCD 高度
- u16 id; //LCD ID
- u8 dir; //橫屏還是豎屏控制:0,豎屏;1,橫屏。
- u16 wramcmd; //開(kāi)始寫(xiě)gram指令
- u16 setxcmd; //設(shè)置x坐標(biāo)指令
- u16 setycmd; //設(shè)置y坐標(biāo)指令
- }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 溫度補(bǔ)償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 設(shè)置對(duì)比度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 設(shè)置行掃描頻率
- #define UC1698_AP_DC(x) (0xa4|x) //Set All-Pixel-ON 顯示特性性
- #define UC1698_ID_DC(x) (0xa6|x) //Set Inverse display 設(shè)置方向顯示(0--正、1--反向);
- #define UC1698_DE_DC 0xad //Set Display enable 開(kāi)顯示
- #define UC1698_MC_DC(x) (0xC0|(0x07&x)) //Set LCD Mapping contro 設(shè)置lcd映射控制:LCD映像MY=1,MX=0,LC0=0
- #define UC1698_NIV 0xC8 //Set N-Line Inversion 設(shè)置M信號(hào)為0行翻磚(LCD_WR_REG(0x10); )
- #define UC1698_CP_LC(x) (0xD0|x) //Set Color pattern彩色數(shù)據(jù)格式 0/1
- #define UC1698_CM_LC(x) (0xD4|(0X03&x)) //Set Color Mode 彩色數(shù)據(jù)模式 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 設(shè)置偏壓比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; //對(duì)比度bf
- #if Address_struct==1
- //寫(xiě)寄存器函數(shù) 指令寫(xiě)入子程序-
- //regval:寄存器值
- void LCD_WR_REG(vu16 regval)
- {
- regval=regval; //使用-O2優(yōu)化的時(shí)候,必須插入的延時(shí)
- LCD->LCD_REG=regval;//寫(xiě)入要寫(xiě)的寄存器序號(hào)
- }
- //寫(xiě)LCD數(shù)據(jù) 數(shù)據(jù)寫(xiě)入子程序
- //data:要寫(xiě)入的值
- void LCD_WR_DATA(vu16 data)
- {
- data=data; //使用-O2優(yōu)化的時(shí)候,必須插入的延時(shí)
- LCD->LCD_RAM=data;
- }
- //讀LCD數(shù)據(jù)
- //返回值:讀到的值
- u16 LCD_RD_DATA(void)
- {
- vu16 ram; //防止被優(yōu)化
- 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; //地址建立時(shí)間(ADDSET)為16個(gè)HCLK 1/168M=6ns*16=96ns
- readWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持時(shí)間(ADDHLD)模式A未用到
- readWriteTiming.FSMC_DataSetupTime = 60; //數(shù)據(jù)保存時(shí)間為60個(gè)HCLK =6*60=360ns
- readWriteTiming.FSMC_BusTurnAroundDuration = 0x00; //總線恢復(fù)時(shí)間
- readWriteTiming.FSMC_CLKDivision = 0x00; // 時(shí)鐘分頻因子
- readWriteTiming.FSMC_DataLatency = 0x00; //數(shù)據(jù)產(chǎn)生時(shí)間
- readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A; // //FSMC NOR控制器時(shí)序:模式A
-
- writeTiming.FSMC_AddressSetupTime =10; //地址建立時(shí)間(ADDSET)為9個(gè)HCLK =54ns
- writeTiming.FSMC_AddressHoldTime = 10; //地址保持時(shí)間(A
- writeTiming.FSMC_DataSetupTime = 10; //數(shù)據(jù)保存時(shí)間為6ns*9個(gè)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 ,也就對(duì)應(yīng)BTCR[6],[7]。--》 nor被分為四塊,其中這個(gè)參數(shù)是說(shuō)明對(duì)那個(gè)塊編程
- FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; // 不復(fù)用數(shù)據(jù)地址--》 地址\數(shù)據(jù)是否復(fù)用
- FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM; //SRAM --》 存儲(chǔ)器類(lèi)型
- FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;//存儲(chǔ)器數(shù)據(jù)寬度為16bit --》數(shù)據(jù)總線寬度 8位/16位
- FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable; --》是否進(jìn)行成組模式訪問(wèn)
- FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;//等待信號(hào)有效級(jí)性
-
- FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; //該位決定控制器是否支持把非對(duì)齊的AHB成組操作分割成2次線性操作;該位僅在存儲(chǔ)器的成組模式下有效。
- FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; //當(dāng)閃存存儲(chǔ)器處于成組傳輸模式時(shí),NWAIT信號(hào)指示從閃存存儲(chǔ)器出來(lái)的數(shù)據(jù)是否有效或是否需要插入等待周期。該位決定存儲(chǔ)器是在等待狀態(tài)之前的一個(gè)時(shí)鐘周期產(chǎn)生NWAIT信號(hào),還是在等待狀態(tài)期間產(chǎn)生NWAIT信號(hào)。
- FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; // 存儲(chǔ)器寫(xiě)使能----》該位指示FSMC是否允許/禁止對(duì)存儲(chǔ)器的寫(xiě)操作。
- FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; //當(dāng)閃存存儲(chǔ)器處于成組傳輸模式時(shí),這一位允許/禁止通過(guò)NWAIT信號(hào)插入等待狀態(tài)。
- FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable; //設(shè)置是否使能在同步傳輸時(shí)使用的等待信號(hào),在控制同步類(lèi)型的NOR或PSRAM時(shí),存儲(chǔ)器可以使用FSMC_NWAIT引腳通知STM32需要等待。
-
- FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
- //FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; // 讀寫(xiě)使用不同的時(shí)序 --》該位允許FSMC使用FSMC_BWTR寄存器,即允許讀和寫(xiě)使用不同的時(shí)序。
- FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; //對(duì)于處于成組傳輸模式的閃存存儲(chǔ)器,這一位允許/禁止通過(guò)NWAIT信號(hào)插入等待狀態(tài)。讀操作的同步成組傳輸協(xié)議使能位是FSMC_BCRx寄存器的BURSTEN位。
- FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &writeTiming; //寫(xiě)時(shí)序--->//寫(xiě)時(shí)序配置指針
- FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming; //讀寫(xiě)時(shí)序--->//讀時(shí)序配置指針
- FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); //初始化FSMC配置
- FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE); // 使能BANK1
-
- }
- //初始化lcd
- //該初始化函數(shù)可以初始化各種ILI93XX液晶,但是其他函數(shù)是基于ILI9320的!!!
- //在其他型號(hào)的驅(qū)動(dòng)芯片上沒(méi)有測(cè)試!
- void LCD_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- //************************打開(kāi)相應(yīng)的時(shí)鐘使能***********************************/
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG, ENABLE);//使能PD,PE,PF,PG時(shí)鐘
- RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE);//使能FSMC時(shí)鐘
-
- //************************背光燈的設(shè)置***********************************/
-
- 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對(duì)應(yīng)IO口(背光燈)
- GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIO
- GPIO_SetBits(GPIOE,GPIO_Pin_5);//PE5 設(shè)置為高,
- //BLK_OFF;
-
- //************************LCD復(fù)位***********************************/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//GPIOG PG對(duì)應(yīng)IO口(LCD復(fù)位)
- GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化GPIO
- GPIO_SetBits(GPIOG,GPIO_Pin_3); // 設(shè)置為高,
-
- //************************數(shù)據(jù)總線與使能線的IO配置***********************************/
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//復(fù)用輸出
- 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);//初始化
- //************************相應(yīng)管腳映射到FSMC接口 數(shù)據(jù)總線+使能控制線***********************************/
- 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);
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
51hei.png (5.26 KB, 下載次數(shù): 45)
下載附件
2021-6-16 20:05 上傳
以上3個(gè)文件51hei下載,不含工程文件,請(qǐng)自行移植:
LCD_240128CFW顯示屏(FSMC).rar
(19.85 KB, 下載次數(shù): 63)
2021-6-16 10:09 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|