找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3609|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

LCD240128(UC1698芯片)驅(qū)動(dòng)程序 C語(yǔ)言 STM32的FSMC

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
LCD240128(UC1698芯片)驅(qū)動(dòng)采用STM32的FSMC

單片機(jī)源程序如下:

  1. /*
  2.           (芯片:UC1698 芯片驅(qū)動(dòng),參考LCD_240128CFW顯示屏)

  3. */


  4. #include "UC1698.h"
  5. #include "FONT.H"

  6. //LCD重要參數(shù)集
  7. typedef struct  
  8. {                                                                                    
  9.         u16 width;                        //LCD 寬度
  10.         u16 height;                        //LCD 高度
  11.         u16 id;                                //LCD ID
  12.         u8  dir;                        //橫屏還是豎屏控制:0,豎屏;1,橫屏。        
  13.         u16        wramcmd;                //開(kāi)始寫(xiě)gram指令
  14.         u16  setxcmd;                //設(shè)置x坐標(biāo)指令
  15.         u16  setycmd;                //設(shè)置y坐標(biāo)指令
  16. }lcd_dev;         

  17. /*************LCD 屏的像素LCD_MAX_width * LCD_MAX_height *********************************/
  18. #define LCD_MAX_width        240
  19. #define LCD_MAX_height       128

  20. /*************UC1698寄存器控制命令*********************************/
  21. #define UC1698_CA_LSB(x)    (0x00|(0x0f&x))    //Set Column Address LSB  列地址
  22. #define UC1698_CA_MSB(x)    (0x10|0x0f&(x>>4)) //Set Column Address MSB   列地址
  23. #define UC1698_TC(x)        (0x24|(0x03&x))    //Set Temp. Compensation  溫度補(bǔ)償LSB
  24. #define UC1698_PC(x)        (0x28|(0x03&x))    //Set Power control 功率控制
  25. #define UC1698_RA_LSB(y)    (0x60|(0x0f&y))    //Set row Address LSB      行地址
  26. #define UC1698_RA_MSB(y)    (0x70|0x0f&(y>>4)) //Set Row Address MSB      行地址
  27. #define UC1698_PDC_LC(x)    (0x84|x)           //Set Partial Display Control  
  28. #define UC1698_PM            0x81              //Set VBIAS Potentiometer  設(shè)置對(duì)比度bf(ContrastLevel)
  29. #define UC1698_RAC_AC(x)    (0x88|(0x07&x))    //Set RAM Address Control  RAM地址控制
  30. #define UC1698_LR_LC(x)     (0xa0|(0x03&x))    //Set Line rate  設(shè)置行掃描頻率
  31. #define UC1698_AP_DC(x)     (0xa4|x)           //Set All-Pixel-ON    顯示特性性
  32. #define UC1698_ID_DC(x)     (0xa6|x)           //Set Inverse display  設(shè)置方向顯示(0--正、1--反向);
  33. #define UC1698_DE_DC         0xad             //Set Display enable  開(kāi)顯示
  34. #define UC1698_MC_DC(x)     (0xC0|(0x07&x))    //Set LCD Mapping contro  設(shè)置lcd映射控制:LCD映像MY=1,MX=0,LC0=0
  35. #define UC1698_NIV           0xC8             //Set N-Line Inversion  設(shè)置M信號(hào)為0行翻磚(LCD_WR_REG(0x10); )
  36. #define UC1698_CP_LC(x)     (0xD0|x)           //Set Color pattern彩色數(shù)據(jù)格式   0/1
  37. #define UC1698_CM_LC(x)     (0xD4|(0X03&x))     //Set Color Mode  彩色數(shù)據(jù)模式  0x01:12位 0x02:16位
  38. #define UC1698_CSF(x)       (0xd8|(x&0X07))    //Set COM Scan Function  掃描模式
  39. #define UC1698_BR(x)        (0xE8|(x&0X03))    //Set LCD Bias Ratio  設(shè)置偏壓比1/10          LCD_WR_REG(0xe9);
  40. #define UC1698_CEN           0xf1             //Set COM End
  41. #define UC1698_DST           0xf2             //Set Partial Display Start
  42. #define UC1698_CDEN          0xf3             //Set  Set Partial Display End
  43. #define UC1698_WPC0          0xf4                                            // Set Window Program Starting Columm Address  窗口左邊界
  44. #define UC1698_WPP0          0xf5                                // Set Window Program Starting Row Address     窗口上邊界
  45. #define UC1698_WPC1          0xf6                                       // Set Window Program Ending Columm Address    窗口右邊界
  46. #define UC1698_WPP1          0xf7                                // Set Window Program Starting Row Address     窗口下邊界
  47. #define UC1698_WPM_AC(x)    (0xf8|x)                                   // Window Program Mode: 0 ->Inside;1-> All area
  48. static vu8 ContrastLevel = 0x2D;  //對(duì)比度bf

  49. #if Address_struct==1
  50.         //寫(xiě)寄存器函數(shù)  指令寫(xiě)入子程序-
  51.         //regval:寄存器值
  52.         void LCD_WR_REG(vu16 regval)
  53.         {   
  54.                 regval=regval;                //使用-O2優(yōu)化的時(shí)候,必須插入的延時(shí)
  55.                 LCD->LCD_REG=regval;//寫(xiě)入要寫(xiě)的寄存器序號(hào)         
  56.         }
  57.         //寫(xiě)LCD數(shù)據(jù)    數(shù)據(jù)寫(xiě)入子程序
  58.         //data:要寫(xiě)入的值
  59.         void LCD_WR_DATA(vu16 data)
  60.         {         
  61.                 data=data;                        //使用-O2優(yōu)化的時(shí)候,必須插入的延時(shí)
  62.                 LCD->LCD_RAM=data;        
  63.         }

  64.         //讀LCD數(shù)據(jù)
  65.         //返回值:讀到的值
  66.         u16 LCD_RD_DATA(void)
  67.         {
  68.                 vu16 ram;                        //防止被優(yōu)化
  69.                 ram=LCD->LCD_RAM;        
  70.                 return ram;         
  71.         }        
  72. #endif

  73. /*************FSMC********************************
  74.         
  75.         
  76.         
  77. *************        *********************************/        
  78.         
  79. void FSMC_Init(void){
  80.         FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
  81.   FSMC_NORSRAMTimingInitTypeDef  readWriteTiming;
  82.         FSMC_NORSRAMTimingInitTypeDef  writeTiming;

  83.   readWriteTiming.FSMC_AddressSetupTime = 0XF;         //地址建立時(shí)間(ADDSET)為16個(gè)HCLK 1/168M=6ns*16=96ns        
  84.   readWriteTiming.FSMC_AddressHoldTime = 0x00;         //地址保持時(shí)間(ADDHLD)模式A未用到        
  85.   readWriteTiming.FSMC_DataSetupTime = 60;                        //數(shù)據(jù)保存時(shí)間為60個(gè)HCLK        =6*60=360ns
  86.   readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;  //總線恢復(fù)時(shí)間
  87.   readWriteTiming.FSMC_CLKDivision = 0x00;         // 時(shí)鐘分頻因子
  88.   readWriteTiming.FSMC_DataLatency = 0x00;             //數(shù)據(jù)產(chǎn)生時(shí)間
  89.   readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A;         // //FSMC NOR控制器時(shí)序:模式A
  90.    
  91.         writeTiming.FSMC_AddressSetupTime =10;              //地址建立時(shí)間(ADDSET)為9個(gè)HCLK =54ns
  92.   writeTiming.FSMC_AddressHoldTime = 10;         //地址保持時(shí)間(A               
  93.   writeTiming.FSMC_DataSetupTime = 10;                 //數(shù)據(jù)保存時(shí)間為6ns*9個(gè)HCLK=54ns
  94.   writeTiming.FSMC_BusTurnAroundDuration = 0x00;
  95.   writeTiming.FSMC_CLKDivision = 0x00;
  96.   writeTiming.FSMC_DataLatency = 0x00;
  97.   writeTiming.FSMC_AccessMode = FSMC_AccessMode_A;         //模式A

  98.   FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;//  這里我們使用NE4 ,也就對(duì)應(yīng)BTCR[6],[7]。--》 nor被分為四塊,其中這個(gè)參數(shù)是說(shuō)明對(duì)那個(gè)塊編程
  99.   FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; // 不復(fù)用數(shù)據(jù)地址--》   地址\數(shù)據(jù)是否復(fù)用
  100.   FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM;  //SRAM   --》   存儲(chǔ)器類(lèi)型
  101.   FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;//存儲(chǔ)器數(shù)據(jù)寬度為16bit   --》數(shù)據(jù)總線寬度  8位/16位
  102.   FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable; --》是否進(jìn)行成組模式訪問(wèn)
  103.   FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;//等待信號(hào)有效級(jí)性
  104.         
  105.         FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;   //該位決定控制器是否支持把非對(duì)齊的AHB成組操作分割成2次線性操作;該位僅在存儲(chǔ)器的成組模式下有效。
  106.   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)。
  107.   FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;        //  存儲(chǔ)器寫(xiě)使能----》該位指示FSMC是否允許/禁止對(duì)存儲(chǔ)器的寫(xiě)操作。
  108.   FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;        //當(dāng)閃存存儲(chǔ)器處于成組傳輸模式時(shí),這一位允許/禁止通過(guò)NWAIT信號(hào)插入等待狀態(tài)。
  109.   FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;  //設(shè)置是否使能在同步傳輸時(shí)使用的等待信號(hào),在控制同步類(lèi)型的NOR或PSRAM時(shí),存儲(chǔ)器可以使用FSMC_NWAIT引腳通知STM32需要等待。
  110.         
  111.         FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
  112.         //FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; // 讀寫(xiě)使用不同的時(shí)序 --》該位允許FSMC使用FSMC_BWTR寄存器,即允許讀和寫(xiě)使用不同的時(shí)序。
  113.   FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; //對(duì)于處于成組傳輸模式的閃存存儲(chǔ)器,這一位允許/禁止通過(guò)NWAIT信號(hào)插入等待狀態(tài)。讀操作的同步成組傳輸協(xié)議使能位是FSMC_BCRx寄存器的BURSTEN位。
  114.         FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &writeTiming;  //寫(xiě)時(shí)序--->//寫(xiě)時(shí)序配置指針

  115.         FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming; //讀寫(xiě)時(shí)序--->//讀時(shí)序配置指針

  116.   FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  //初始化FSMC配置
  117.   FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);  // 使能BANK1
  118.                
  119. }



  120. //初始化lcd
  121. //該初始化函數(shù)可以初始化各種ILI93XX液晶,但是其他函數(shù)是基于ILI9320的!!!
  122. //在其他型號(hào)的驅(qū)動(dòng)芯片上沒(méi)有測(cè)試!
  123. void LCD_Init(void)
  124. {         

  125.   GPIO_InitTypeDef  GPIO_InitStructure;

  126.         //************************打開(kāi)相應(yīng)的時(shí)鐘使能***********************************/
  127.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG, ENABLE);//使能PD,PE,PF,PG時(shí)鐘  
  128.   RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE);//使能FSMC時(shí)鐘  
  129.         
  130.         //************************背光燈的設(shè)置***********************************/
  131.   
  132.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通輸出模式
  133.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽輸出
  134.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  135.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  136.         
  137.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//GPIOE  PE對(duì)應(yīng)IO口(背光燈)
  138.   GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIO
  139.         GPIO_SetBits(GPIOE,GPIO_Pin_5);//PE5   設(shè)置為高,
  140.         //BLK_OFF;
  141.         
  142.                 //************************LCD復(fù)位***********************************/
  143.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//GPIOG  PG對(duì)應(yīng)IO口(LCD復(fù)位)
  144.   GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化GPIO
  145.         GPIO_SetBits(GPIOG,GPIO_Pin_3);      //  設(shè)置為高,

  146.         
  147.         //************************數(shù)據(jù)總線與使能線的IO配置***********************************/

  148.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//復(fù)用輸出
  149.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽輸出
  150.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  151.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  152.         
  153.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_14|GPIO_Pin_15;
  154.   GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化  
  155.         
  156.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;
  157.   GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化  

  158.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_12;//PF12,FSMC_A6
  159.   GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化

  160. //************************相應(yīng)管腳映射到FSMC接口 數(shù)據(jù)總線+使能控制線***********************************/
  161.   GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC);    //-->D0
  162.   GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC);     //-->D1
  163.         GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FSMC);      //-->D2
  164.   GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FSMC);      //-->D3
  165.         
  166.   GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FSMC);      //-->D4
  167.   GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FSMC);      //-->D5
  168.   GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FSMC);      //-->D6
  169.   GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC);     //-->D7
  170.         
  171.   GPIO_PinAFConfig(GPIOD,GPIO_PinSource4,GPIO_AF_FSMC);      //-->RD
  172.   GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_FSMC);      //-->WR
  173.         
  174.   GPIO_PinAFConfig(GPIOG,GPIO_PinSource12,GPIO_AF_FSMC);     //   -->CS
  175.         GPIO_PinAFConfig(GPIOG,GPIO_PinSource2,GPIO_AF_FSMC);      //->CD(A12)

  176.              FSMC_Init();//FSMC_初始化
  177.         
  178.                                 LCD_RESET_L;
  179.                                 delay_ms(6);
  180.                                 LCD_RESET_H;
  181.                                 delay_ms(80);
  182. ……………………

  183. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

以上3個(gè)文件51hei下載,不含工程文件,請(qǐng)自行移植:
LCD_240128CFW顯示屏(FSMC).rar (19.85 KB, 下載次數(shù): 63)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:336670 發(fā)表于 2025-4-3 11:26 | 只看該作者
值得借鑒,謝謝
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表