新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 關于8位單片機驅動液晶屏的應用總結

        關于8位單片機驅動液晶屏的應用總結

        作者: 時間:2016-12-01 來源:網絡 收藏
        如何構成一個顯示系統:
        電源+MCU+TFT液晶屏
        呵呵,是不是覺得少了點什么?驅動IC那里去了?
        其實驅動IC我們是看不到的,它被集成在了液晶屏中,我們只要知道它的寄存器的定義,利用液晶屏的端口會進行讀寫即可。
        電源:3.3V的直流電源,呵呵,這個不用細說,小功率的可以利用ASM1117-3;大功率的可以利用LM2596S-3.3(最高3A的輸出)來構成一個電源。
        MCU:主要是3個要求。
        工作電壓,3.3V
        夠大,
        夠快。
        夠大才能存的下程序和數據,夠快才會圖像流暢。
        本人手頭只有15L2K08S2這個單片機,8K程序存儲區,2K的SRAM,最高時鐘33.1776MHz,最高輸出8MHz的外部時鐘,比起60S2的60KB的FLASH,小了不少,但是對于普通的不太復雜的應用已經足夠了,主要是搞通應用的原理。
        液晶屏:
        以上列舉的液晶屏都是串口屏,所以屏的引出腳較少,除此之外還有引出管腳較多的并口屏,
        當然串口屏的數據是一位一位的送出的,速度相對是比較慢的。
        在操作上,串口和并口原理差不多。這里就先介紹串口屏的使用。
        好了,你有了上面的3大件下面在準備點輔料。
        1、數據線,USB轉串口數據線,用于燒寫MCU
        2、字符LCD點陣提取軟件:百度一下吧,zimo221.exe
        3、圖片點陣數據提取軟件:同樣百度,Image2Lcd.exe
        4、編程軟件:KEIL
        5、單片機燒寫軟件:這個不多說了,看你用的芯片而定。
        好的,齊活了,準備開工。
        用導線將單片機的電源接口和LCD的電源及LED端口同3.3V電源的輸出連接起來。供電的問題解決了。
        用導線將自己選擇的單片機的端口和LCD的REST、CS、SCL、AO、SDA一一對應的連接起來。數據輸出的問題解決。
        硬件問題解決,開始代碼的編寫
        TFT初始化函數:
        也就是對液晶屏進行基本的配置。
        這個基本直接套用就行。(除了個別地方需要修改,后面會說)
        TFT驅動芯片的手冊還是有必要看看的,最好是看英文原版內容比較詳細。
        也沒有必要全部看,但是下面初始化代碼中涉及到的指令及4wireSPI的時序圖,還是很有必要了解的,不然顯示的界面出了問題,就會感覺無從下手解決。
        寫數據和寫命令
        很明顯要想讓液晶屏顯示字符或圖像,必須要把要顯示的內容轉換成數據寫到液晶屏的控制器,想寫內容數據還要對液晶屏的控制寄存器進行設置,也就是寫命令數據。只有一條SDA串口數據線,怎么區分是內容數據還是命令數據呢,那就要靠AO(RS):寄存器選擇信號(低電平:選擇命令寄存器;高電平:選擇數據寄存器)。
        寫命令
        voidwrite_command(ucharc)
        {
        cs=0;//片選有效
        rs=0;//選擇命令寄存器
        bitdata=c;//送數據
        sda=bit7;scl=0;scl=1;
        sda=bit6;scl=0;scl=1;
        sda=bit5;scl=0;scl=1;
        sda=bit4;scl=0;scl=1;
        sda=bit3;scl=0;scl=1;
        sda=bit2;scl=0;scl=1;
        sda=bit1;scl=0;scl=1;
        sda=bit0;scl=0;scl=1;
        cs=1;//片選無效
        }
        寫數據
        voidwrite_data(uchard)
        {
        cs=0;
        rs=1;
        bitdata=d;
        sda=bit7;scl=0;scl=1;
        sda=bit6;scl=0;scl=1;
        sda=bit5;scl=0;scl=1;
        sda=bit4;scl=0;scl=1;
        sda=bit3;scl=0;scl=1;
        sda=bit2;scl=0;scl=1;
        sda=bit1;scl=0;scl=1;
        sda=bit0;scl=0;scl=1;
        cs=1;
        }
        初始化
        /*****************TFT初始化函數***************/
        voidlcd_initial()
        {
        reset=0;
        delay(100);
        reset=1;
        delay(100);
        //------------------------------------------------------------------//
        //-------------------SoftwareReset-------------------------------//
        write_command(0x2A);//列地址設置
        write_data(0x00);//列起始地址低8位
        write_data(0x00);//列起始地址高8位
        write_data(0x00);//列終止地址高8位
        write_data(0x9F);//列終止地址低8位
        //上面的列終止地址為什么設置成0x9f,0x9f=十進制的159,1.8寸的屏的分辨率是128*160.
        //也就是說有0-159共160列。下面的同樣的道理,只不過是說明行的起始和終止地址。
        write_command(0x2B);//行地址設置
        write_data(0x00);
        write_data(0x00);
        write_data(0x00);
        write_data(0x7F);
        write_command(0xCB);//功耗控制A
        write_data(0x39);
        write_data(0x2C);
        write_data(0x00);
        write_data(0x34);
        write_data(0x02);
        write_command(0xCF);//功耗控制B
        write_data(0x00);
        write_data(0XC1);
        write_data(0X30);
        write_command(0xE8);//驅動時序控制A
        write_data(0x85);
        write_data(0x00);
        write_data(0x78);
        write_command(0xEA);//驅動時序控制B
        write_data(0x00);
        write_data(0x00);
        write_command(0xED);//電源序列控制
        write_data(0x64);
        write_data(0x03);
        write_data(0X12);
        write_data(0X81);
        write_command(0xF7);//泵比控制
        write_data(0x20);
        write_command(0xC0);//Powercontrol功耗控制1
        write_data(0x23);//VRH[5:0]`
        write_command(0xC1);//Powercontrol功耗控制2
        write_data(0x10);//SAP[2:0];BT[3:0]
        write_command(0xC5);//VCMcontrol
        write_data(0x3e);//對比度調節
        write_data(0x28);
        write_command(0xC7);//VCMcontrol2
        write_data(0x86);//--
        write_command(0x36);//MemoryAccessControl存儲器訪問控制
        write_data(0x68);//C8//4868豎屏//28E8橫屏
        //cc同c8
        write_command(0x3A);//像素格式設置
        write_data(0x55);
        write_command(0xB1);//幀速率控制
        write_data(0x00);
        write_data(0x18);
        write_command(0xB6);//DisplayFunctionControl
        write_data(0x08);
        write_data(0x82);
        write_data(0x27);
        write_command(0xF2);//3GammaFunctionDisable
        write_data(0x00);
        write_command(0x26);//Gammacurveselected
        write_data(0x01);//共4條曲線供選擇,分別是1248;這里選擇1,
        write_command(0xE0);//SetGamma
        write_data(0x0F);
        write_data(0x31);
        write_data(0x2B);
        write_data(0x0C);
        write_data(0x0E);
        write_data(0x08);
        write_data(0x4E);
        write_data(0xF1);
        write_data(0x37);
        write_data(0x07);
        write_data(0x10);
        write_data(0x03);
        write_data(0x0E);
        write_data(0x09);
        write_data(0x00);
        write_command(0XE1);//SetGamma
        write_data(0x00);
        write_data(0x0E);
        write_data(0x14);
        write_data(0x03);
        write_data(0x11);
        write_data(0x07);
        write_data(0x31);
        write_data(0xC1);
        write_data(0x48);
        write_data(0x08);
        write_data(0x0F);
        write_data(0x0C);
        write_data(0x31);
        write_data(0x36);
        write_data(0x0F);
        write_command(0x11);//ExitSleep
        delay(120);
        write_command(0x29);//Displayon
        write_command(0x2c);
        }
        在寫入數據時要先確定,圖像的起始坐標和終止坐標,可以用如下的代碼實現
        staticvoidLCD_SetPos(unsignedintx0,unsignedintx1,unsignedinty0,unsignedinty1)//設置位置
        {
        write_command(0x2A);//列地址設置
        write_data(x0>>8);//列起始地址高8位
        write_data(x0);//列起始地址低8位
        write_data(x1>>8);//列終止地址高8位
        write_data(x1);//列終止地址低8位
        write_command(0x2B);//頁地址設置
        write_data(y0>>8);
        write_data(y0);
        write_data(y1>>8);
        write_data(y1);
        write_command(0x2c);//寫存儲器
        }
        寫命令時,先將命令的地址寫入,然后在將設定的數據寫入寄存器。如
        write_command(0x2A);//列地址設置
        write_data(0x00);
        write_data(0x00);
        write_data(0x00);
        write_data(0x9F);
        至于這些寫入的數據的意義及數值大小,請查閱液晶屏對應的液晶屏的數據手冊。
        了解一下顏色代碼:
        幾種常用的顏色的代碼
        #defineWhite0xFFFF//白
        #defineBlack0x0000//黑
        #defineRed0x001F//紅
        #defineBlue0xF800//藍
        #defineMagenta0xF81F//紫
        #defineGreen0x07E0//綠
        #defineCyan0x07FF//青
        #defineYellow0xFFE0//黃
        好了說了這么多,一個字暈。好吧,來點實際的簡單的,咱先啥字符也不顯示,
        只是讓液晶屏顯示不同的顏色。
        刷整個屏幕的顏色
        可以用如下代碼實現
        /*********顯示色彩******************/
        voiddsp_single_colour(DH,DL)//前景顏色,背景顏色
        {
        unsignedinti,j;
        for(i=0;i<128;i++)
        for(j=0;j<160;j++)
        {
        write_data(DH>>8);
        write_data(DH);
        write_data(DL>>8);
        write_data(DL);
        }
        }
        延時函數
        /******延時函數************************/
        voiddelay(uinttime)
        {
        uinti,j;
        for(i=0;ifor(j=0;j<500;j++);
        }
        好了,將上面的函數組合起來,準備刷屏。
        main()
        {
        lcd_initial();//TFT初始化
        while(1)
        {
        LCD_SetPos(0,159,0,10);//設置位置
        dsp_single_colour(Blue,Black);//
        delay(2000);
        LCD_SetPos(0,159,10,20);//設置位置
        dsp_single_colour(Blue,Blue);//
        delay(2000);
        LCD_SetPos(0,159,20,30);//設置位置
        dsp_single_colour(Green,White);//
        delay(2000);
        LCD_SetPos(0,159,30,40);//設置位置
        dsp_single_colour(Green,Green);//
        delay(2000);
        LCD_SetPos(0,159,40,50);//設置位置
        dsp_single_colour(Yellow,White);//
        delay(2000);
        LCD_SetPos(0,159,50,60);//設置位置
        dsp_single_colour(Yellow,Yellow);//
        delay(2000);
        LCD_SetPos(0,159,60,70);//設置位置
        dsp_single_colour(Black,White);//
        delay(2000);
        LCD_SetPos(0,159,70,80);//設置位置
        dsp_single_colour(Black,Black);//
        delay(2000);
        LCD_SetPos(0,159,80,90);//設置位置
        dsp_single_colour(Red,White);//
        delay(2000);
        LCD_SetPos(0,159,90,100);//設置位置
        dsp_single_colour(Red,Red);//
        delay(2000);
        LCD_SetPos(0,159,100,110);//設置位置
        dsp_single_colour(Magenta,Black);//
        delay(2000);
        LCD_SetPos(0,159,110,120);//設置位置
        dsp_single_colour(Magenta,Magenta);//
        delay(2000);
        LCD_SetPos(0,159,0,120);//設置位置
        dsp_single_colour(White,White);//只刷到第121行留下了7行
        delay(2000);

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 鄂尔多斯市| 洪雅县| 凭祥市| 蒲城县| 韩城市| 广德县| 孟州市| 合阳县| 岳普湖县| 交城县| 英德市| 甘孜县| 安多县| 雷山县| 改则县| 灵山县| 夏邑县| 武义县| 汪清县| 兰坪| 雅安市| 义马市| 山阴县| 隆德县| 洪湖市| 庆安县| 双柏县| 青川县| 山阴县| 宣威市| 辽中县| 嘉义市| 虹口区| 文昌市| 蓝田县| 广西| 历史| 邢台市| 木里| 广平县| 道真|