色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

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

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

          作者: 時間:2016-12-01 來源:網(wǎng)絡 收藏
          如何構成一個顯示系統(tǒng):
          電源+MCU+TFT液晶屏
          呵呵,是不是覺得少了點什么?驅動IC那里去了?
          其實驅動IC我們是看不到的,它被集成在了液晶屏中,我們只要知道它的寄存器的定義,利用液晶屏的端口會進行讀寫即可。
          電源:3.3V的直流電源,呵呵,這個不用細說,小功率的可以利用ASM1117-3;大功率的可以利用LM2596S-3.3(最高3A的輸出)來構成一個電源。
          MCU:主要是3個要求。
          工作電壓,3.3V
          夠大,
          夠快。
          夠大才能存的下程序和數(shù)據(jù),夠快才會圖像流暢。
          本人手頭只有15L2K08S2這個單片機,8K程序存儲區(qū),2K的SRAM,最高時鐘33.1776MHz,最高輸出8MHz的外部時鐘,比起60S2的60KB的FLASH,小了不少,但是對于普通的不太復雜的應用已經(jīng)足夠了,主要是搞通應用的原理。
          液晶屏:
          以上列舉的液晶屏都是串口屏,所以屏的引出腳較少,除此之外還有引出管腳較多的并口屏,
          當然串口屏的數(shù)據(jù)是一位一位的送出的,速度相對是比較慢的。
          在操作上,串口和并口原理差不多。這里就先介紹串口屏的使用。
          好了,你有了上面的3大件下面在準備點輔料。
          1、數(shù)據(jù)線,USB轉串口數(shù)據(jù)線,用于燒寫MCU
          2、字符LCD點陣提取軟件:百度一下吧,zimo221.exe
          3、圖片點陣數(shù)據(jù)提取軟件:同樣百度,Image2Lcd.exe
          4、編程軟件:KEIL
          5、單片機燒寫軟件:這個不多說了,看你用的芯片而定。
          好的,齊活了,準備開工。
          用導線將單片機的電源接口和LCD的電源及LED端口同3.3V電源的輸出連接起來。供電的問題解決了。
          用導線將自己選擇的單片機的端口和LCD的REST、CS、SCL、AO、SDA一一對應的連接起來。數(shù)據(jù)輸出的問題解決。
          硬件問題解決,開始代碼的編寫
          TFT初始化函數(shù):
          也就是對液晶屏進行基本的配置。
          這個基本直接套用就行。(除了個別地方需要修改,后面會說)
          TFT驅動芯片的手冊還是有必要看看的,最好是看英文原版內(nèi)容比較詳細。
          也沒有必要全部看,但是下面初始化代碼中涉及到的指令及4wireSPI的時序圖,還是很有必要了解的,不然顯示的界面出了問題,就會感覺無從下手解決。
          寫數(shù)據(jù)和寫命令
          很明顯要想讓液晶屏顯示字符或圖像,必須要把要顯示的內(nèi)容轉換成數(shù)據(jù)寫到液晶屏的控制器,想寫內(nèi)容數(shù)據(jù)還要對液晶屏的控制寄存器進行設置,也就是寫命令數(shù)據(jù)。只有一條SDA串口數(shù)據(jù)線,怎么區(qū)分是內(nèi)容數(shù)據(jù)還是命令數(shù)據(jù)呢,那就要靠AO(RS):寄存器選擇信號(低電平:選擇命令寄存器;高電平:選擇數(shù)據(jù)寄存器)。
          寫命令
          voidwrite_command(ucharc)
          {
          cs=0;//片選有效
          rs=0;//選擇命令寄存器
          bitdata=c;//送數(shù)據(jù)
          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;//片選無效
          }
          寫數(shù)據(jù)
          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初始化函數(shù)***************/
          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);//對比度調節(jié)
          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);
          }
          在寫入數(shù)據(jù)時要先確定,圖像的起始坐標和終止坐標,可以用如下的代碼實現(xiàn)
          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);//寫存儲器
          }
          寫命令時,先將命令的地址寫入,然后在將設定的數(shù)據(jù)寫入寄存器。如
          write_command(0x2A);//列地址設置
          write_data(0x00);
          write_data(0x00);
          write_data(0x00);
          write_data(0x9F);
          至于這些寫入的數(shù)據(jù)的意義及數(shù)值大小,請查閱液晶屏對應的液晶屏的數(shù)據(jù)手冊。
          了解一下顏色代碼:
          幾種常用的顏色的代碼
          #defineWhite0xFFFF//白
          #defineBlack0x0000//黑
          #defineRed0x001F//紅
          #defineBlue0xF800//藍
          #defineMagenta0xF81F//紫
          #defineGreen0x07E0//綠
          #defineCyan0x07FF//青
          #defineYellow0xFFE0//黃
          好了說了這么多,一個字暈。好吧,來點實際的簡單的,咱先啥字符也不顯示,
          只是讓液晶屏顯示不同的顏色。
          刷整個屏幕的顏色
          可以用如下代碼實現(xiàn)
          /*********顯示色彩******************/
          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);
          }
          }
          延時函數(shù)
          /******延時函數(shù)************************/
          voiddelay(uinttime)
          {
          uinti,j;
          for(i=0;ifor(j=0;j<500;j++);
          }
          好了,將上面的函數(shù)組合起來,準備刷屏。
          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);

          評論


          技術專區(qū)

          關閉