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)
|