新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 普通51單片機驅動3.5寸TFT的應用實例

        普通51單片機驅動3.5寸TFT的應用實例

        作者: 時間:2016-11-19 來源:網絡 收藏
        目前市場流行的3.5寸屏基本上都是只內置了驅動器,而不帶控制器,這樣給用戶的使用造成了一些難度。基本上很多朋友在用彩屏時選擇一些帶LCD控制器的ARM7或ARM9去開發,對于不會ARM開發的朋友來說,只使用普通MCU,這樣可以選擇的3.5寸TFT模塊,就很難找到了。

        本文就是基于市場上一款比較使用的3.5寸TFT模塊編寫的,用戶只需要幫該TFT模塊當作普通的單色液晶的開發思路來使用,就可以很容易去編程。

        本文引用地址:http://www.104case.com/article/201611/318170.htm

        一、硬件選擇

        1、MCU:AT89S51

        2、開發編譯環境:Keil C51

        3、3.5寸TFT模塊型號:MzT35C1

        二、TFT模塊基本性能:

        1、基本參數

        模塊結構:內置控制器

        屏幕大小:3.5英寸

        屏幕分辯率:320*240

        屏幕顏色數:65536色(16位真彩色)

        工作電壓:3.3V/5V可選

        總線結構:Intel8080

        總線寬度:8Bit

        背光形式:LED;可指令控制,0-127可調

        連接方式:排針插座

        觸摸屏:標準配置不帶觸摸屏;模組留有觸摸屏芯片焊盤和觸摸屏接口

        2、接口引腳說明

        接口引腳

        說明

        VCC

        模塊供電電源輸入(一般無特殊要求為5V)

        D0~D7

        8位數據總線

        CS

        片選(低電平有效)

        RST

        Reset復位(低電平復位)

        A0

        控制寄存器/數據寄存器選擇(低電平選擇控制寄存器)

        WE

        寫信號(低電平有效)

        RD

        讀信號(低電平有效)

        GND

        接地

        S_CS

        預留有ADS7846的片選

        S_SCK

        預留有ADS7846的SPI時鐘輸入

        S_SDO

        預留有ADS7846的SPI數據輸出

        S_SDI

        預留有ADS7846的SPI數據輸入

        S_INT

        預留有ADS7846的INT信號

        S_BUSY

        預留有ADS7846的BUSY信號

        3、操作時序(8位并行Intel 8080總線)

        MzT35C1模塊支持intel8080總線,總線的最高速度可達20MHz(當然總線的速度能否達到最高接口速度,還與用戶的總線布線、線長等有關),也就是說,如果控制MCU速度足夠快的話,是可以支持視頻的顯示的。

        注意:MzT35C1模塊的總線接口是8位的,也就意味著對顯存的數據操作時,需要連續進行兩次操作方可完成,先傳高字節再傳低字節;但對于寄存器的操作(寫入寄存器地址,即A0為低時的寫入操作)8位的操作方可。

        三、MzT35C1與51硬件接口連接圖

        本例程使用GPIO來模擬總線時序。上圖的模塊供電為5V的模塊,而模塊的端口電平為3.3V的,所以在所有的51端口與模塊間的連接串入了一個100歐的電阻,有關MCS51的其它電路不在圖中畫出,請用戶具體參考其它的開發板文檔進行了解。而圖中的MzT35C1模塊的相關引腳請以實物為準,圖中僅示意對應的名稱的端口,請用戶在參考使用時注意。

        三、底層驅動代碼編寫方法

        1、端口配置

        #i nclude "REG52.h"

        #i nclude "intrins.h"http://包含此頭文件可直接操作內核的寄存器以及一些定義好的宏

        #define LCD_Ctrl_GPIO()//無定義

        #define LCD_Ctrl_Out()LCD_CS_SET();LCD_RD_SET();LCD_RW_SET();

        #define LCD_Ctrl_Set(n)//無定義

        #define LCD_Ctrl_Clr(n)//無定義

        sbit LCD_CS = P2^6;

        #define LCD_CS_SET()LCD_CS = 1

        #define LCD_CS_CLR()LCD_CS = 0

        sbit LCD_RE = P3^5;

        #define LCD_RE_SET()LCD_RE = 1

        #define LCD_RE_CLR()LCD_RE = 0

        sbit LCD_A0 = P2^5;

        #define LCD_A0_SET()LCD_A0 = 1

        #define LCD_A0_CLR()LCD_A0 = 0

        sbit LCD_RW = P3^6;

        #define LCD_RW_SET()LCD_RW = 1

        #define LCD_RW_CLR()LCD_RW = 0

        sbit LCD_RD = P3^7;

        #define LCD_RD_SET()LCD_RD = 1

        #define LCD_RD_CLR()LCD_RD = 0

        #define LCD_Data_GPIO()//51的端口是雙向的,無需特意規定方向,故無定義

        #define LCD_Data_Out()//51的端口是雙向的,無需特意規定方向,故無定義

        #define LCD_Data_In()P0 = 0xff//51的端口要讀數據前需要先輸出0xff

        #define LCD_Data_BUS_Clr()//無定義

        #define LCD_Data_BUS_Set(n)P0 = n

        #define LCD_Data_Read()P0

        2、寫數據和指令操作

        //==============================================

        //函數: void LCD_DataWrite(unsigned int Data)

        //描述:寫一個字(16bit)的顯示數據至LCD中的顯示緩沖RAM當中

        //參數: Data寫入的數據

        //=============================================

        #defineLCD_DataWrite(n) LCD_A0_SET();LCD_CS_CLR();LCD_Data_BUS_Clr();LCD_Data_BUS_Set((unsigned char)(n>>8));/

        LCD_RW_CLR();LCD_RW_SET();LCD_Data_BUS_Clr();LCD_Data_BUS_Set((unsigned char)n);LCD_RW_CLR();/ LCD_RW_SET();LCD_CS_SET()

        //=====================================================

        //函數: void LCD_RegWrite(unsigned char Addr,unsigned int Command)

        //描述:寫一個字節的數據至LCD中的控制寄存器當中

        //參數: Addr要寫入的寄存器的地址,低八位有效(byte)

        //Command寫入的數據

        //=====================================================

        #define LCD_RegWrite(n)

        LCD_A0_CLR();LCD_CS_CLR();LCD_Data_BUS_Clr();LCD_Data_BUS_Set(n);/

        LCD_RW_CLR();LCD_RW_SET();LCD_CS_SET()

        2、讀數據操作

        //=============================================

        //函數: LCDBYTE LCD_DataRead(void)

        //描述:從LCD中的顯示緩沖RAM當中讀一個字節的顯示數據

        //參數:無

        //返回:讀出的數據,

        //備注: Mz通用版LCD驅動程序標準子函數

        //===========================================

        LCDBYTE LCD_DataRead(void)

        {

        LCDBYTE Read_Data;

        LCD_Data_In();

        LCD_A0_SET();

        LCD_CS_CLR();

        LCD_RD_CLR();

        LCD_RD_SET();

        LCD_RD_CLR();

        LCD_RD_SET();//前面的操作是要完成一次完整的空讀操作后方能讀取到數據

        //如果用戶需要連續讀取顯存,側僅需要在第一次讀數據時作一

        //次空讀操作即可

        LCD_RD_CLR();

        Read_Data = LCD_Data_Read();

        Read_Data = Read_Data<<8;

        LCD_RD_SET();

        LCD_RD_CLR();

        Read_Data |= LCD_Data_Read();

        LCD_RD_SET();

        LCD_CS_SET();

        LCD_Data_Out();

        return Read_Data;

        }

        3、初始化TFT操作

        void LCD_Init(void)

        {

        //FLASH *Init_String;

        //LCD驅動所使用到的端口的初始化

        LCD_PortInit();

        //根據LCD顯示的配置,設置LCD的數據地址指針自動增加特性

        //end

        LCD_RE_CLR();

        TimeDelay(5);

        LCD_RE_SET();

        LCD_RegWrite(0x03);

        LCD_DataWrite((1<<7)|(0x60<<0));//設置背光控制使能、背光亮度等級為60(0~127)

        LCD_RegWrite(0x04);//寫系統寄存器

        //LCD_DataWrite((0<<7)|//當前顯示頁

        //(0<<6)|//當前讀寫頁設置

        //(1<<0));//顯示開關

        LCD_DataWrite(MzT35_Ctrl_Reg);

        /*Init_String = Initial_Tab;

        while(Init_String!=0xffff)

        {

        LCD_RegWrite(0x05);LCD_DataWrite(*Init_String++);

        LCD_RegWrite(0x06);LCD_DataWrite(*Init_String++);

        }*/

        LCD_Fill(LCD_INITIAL_COLOR);

        }

        本文章只列出底層主要的函數,其中涉及的相關函數沒有一一列出



        關鍵詞: 51單片機3.5寸TF

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 宣武区| 临泽县| 色达县| 武冈市| 铜川市| 灌南县| 秦皇岛市| 珠海市| 丰原市| 芦山县| 宕昌县| 昆山市| 通海县| 镇远县| 嘉峪关市| 额尔古纳市| 巫溪县| 佛冈县| 上思县| 上蔡县| 霞浦县| 沈阳市| 甘泉县| 揭西县| 尤溪县| 松阳县| 哈巴河县| 简阳市| 伊川县| 兴海县| 石阡县| 高碑店市| 勐海县| 郸城县| 顺平县| 谷城县| 甘谷县| 砀山县| 江门市| 清涧县| 新晃|