液晶顯示模塊通常用來作為控制設備的人機交互的窗口,把機器/設備的內部參數顯示在液晶屏幕上,今天和大家來分享一下,如何利用單片機的總線來點亮液晶顯示模塊的; 通常情況下,拿到一個液晶屏幕要如何才能點亮他呢,首先得看懂用戶手冊,也不是要全看懂哈,看懂關鍵的幾個點就可以了: 第一, 接口定義; 第二, 時序圖; 第三, 指令表; 看懂這些就差不多了,這里就拿工業顯示屏幕里比較知名的拓普微的LM6063CCW的模塊(控制器是ST7565的,128x64液晶屏用的最多的控制器了)來做個講解,首先打開手冊(網上一搜一大把哈): 咱按著節奏來: 第一:接口定義
接口定義
全是英文的,不要被嚇到哈,其實這些都是比較簡單的英文,我四級都沒過都能看懂,相信你們也都可以哈;怕有些草根確實看不明白,我挑幾個關鍵點說一下,首先我們只看8080模式:1.手冊里說這個是默認的;2.AT89S52的總線就是8080的; A0 通道選擇信號,當A0=0時,選擇指令通道;A0=1時,選擇數據通道; /RD為讀信號,低電平有效; /WR為寫信號,低電平有效;注意:/WR和/RD 不能同時為底電平哈 /RES復位腳,低電平有效; /CS1片選型號,低電平有效;與模塊通訊都需要片選信號有效情況下; 第二:時序圖
時序圖
如何看懂時序圖在這里就不多說了在學校師傅應該是有教過的哈,如果已經還給師傅了的話,可以私聊我;
第三:指令表
指令表
英文的,我也就不多解釋了,最好是看ST7565的IC資料也是英文的,不過我找到了中文版的資料需要的童鞋可以私聊我;
好了接下來畫重點: 很多人都有用IO口點亮過液晶顯示模塊,今天咱來介紹一下更高級的點亮辦法,因為用IO口模擬時序,就需要一個一個信號的去操作,很耗費時間,從而會導致整幅圖片刷新時,能看出刷的效果;那么怎么樣才能夠避免出現刷的效果呢,可以通過節省送數據的時間,而51單片機設計的時候為了快速訪問外部存儲,帶有16根地址線可直接尋址既80總線,這種方式的好處是,他的讀寫時序都是單片機內部產生的時序,因此縮短模擬IO口所花費的時間,可能這么說你感覺不到什么,舉個實例:假設單片機的指令周期為1us,如果是IO口模擬的話至少需要7us,如果是用總線方式只需要1us,相差7倍!廢話少說,直接上干貨: 要使用總線方式,首先硬件要連接好,可參照下面的原理圖設計硬件:
原理圖
總線尋址方式是模塊的數據總線直接掛在89S52的數據總線上,/RD、/WR作為模塊的讀、寫控制信號,/CS信號和A0信號都由地址線譯碼產生,模塊的/RES接RC復位電路。 總線尋址方式驅動函數如下:(地址定義,根據用戶平臺接口修改) 1、指令代碼寫入函數 voidSdCmd(uchar Command) { uchar xdata *Com_addr; Com_addr =0x8000; // 指令通道地址 *Com_addr = Command; //寫指令操作 } 2、顯示數據寫入函數 voidSdData(uchar DData) { uchar xdata *DData_addr; DData_addr =0x8100; // 數據通道地址 *DData_addr = DData; //寫數據操作 } 3、顯示數據讀取函數 ucharRdData() { uchar DData; uchar xdata *DData_addr; DData_addr =0x8100; //數據通道地址 DData = DData_addr; //讀數據操作 return(DData); //返回數據值 } 其他的代碼就沒啥好說的了,參照附件
- #include <stdio.h>
- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char // 0~255
- #define uint unsigned int // 0~65535
- bit AutoRun; // 1 for auto run, 0 for manual run
- uchar ContrastLevel; // for contrast setting level
- //-----------------------------------
- // dispaly data (128x64)
- //-----------------------------------
- uchar code Logo[]={
- /*-- 調入了一幅圖像:D:\guoq files\technic support\pic\LM6063c-LOGO-128x64.bmp --*/
- /*-- 寬度x高度=128x64 --*/
- 0xFF,0x01,0x81,0x01,0x81,0x01,0x81,0x01,0x81,0x41,0x81,0x41,0x81,0x41,0x81,0x41,
- 0x81,0x41,0xA1,0x41,0xA1,0x41,0xA1,0x51,0xA1,0x51,0xA1,0x51,0xA9,0x51,0xA9,0x51,
- 0xA9,0x55,0xA9,0x55,0x29,0x15,0xAB,0x95,0xCB,0xC5,0xEB,0xE5,0xE3,0xF5,0xF3,0xF9,
- 0xFB,0xF9,0xF9,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0x01,0x01,0x41,0x81,0x01,0x81,0x81,
- 0x81,0x81,0x81,0x81,0x81,0x81,0x01,0x01,0x01,0xC1,0x01,0x01,0xC1,0x01,0x01,0x81,
- 0x01,0x01,0xC1,0x01,0x01,0x01,0xC1,0x01,0x01,0x81,0x81,0x81,0x81,0x81,0x81,0x81,
- 0x01,0x01,0x01,0x01,0x41,0x81,0x01,0x01,0x81,0x41,0x01,0x01,0x01,0x01,0x01,0x81,
- 0x41,0x81,0x01,0xC1,0x01,0x81,0x01,0xC1,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,
- 0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x80,0x41,0xA8,0x55,0xAA,0x55,0xAA,0x55,0x2A,0x95,0xCA,0xE5,0xF2,0xF9,
- 0xF8,0xFD,0xFC,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x42,0xE4,0x10,0x00,0x11,0x94,
- 0x52,0xFC,0x50,0x92,0x14,0x11,0x00,0x84,0x84,0xFF,0x44,0x44,0xFF,0x00,0x00,0xFF,
- 0x00,0x00,0xFF,0x00,0x22,0x22,0xFF,0x12,0x2A,0x10,0xFC,0x13,0x10,0x10,0xF0,0x00,
- 0x00,0x08,0x0B,0x0D,0xE9,0xAF,0xA9,0xA9,0xAF,0xA9,0xED,0x0B,0x09,0x00,0x11,0xF8,
- 0x04,0x0B,0xEA,0x2B,0xEA,0x8B,0x3C,0xC3,0x3E,0x02,0x00,0x00,0x00,0x00,0x00,0xFF,
- 0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,
- 0xA8,0x54,0x2A,0x95,0xCA,0xE5,0xF2,0xF9,0xFC,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x20,0x20,0x23,0x20,0x21,0x21,0x20,
- 0x20,0x23,0x20,0x20,0x21,0x21,0x20,0x20,0x21,0x20,0x22,0x21,0x20,0x20,0x20,0x20,
- 0x20,0x20,0x23,0x20,0x20,0x22,0x23,0x20,0x20,0x20,0x23,0x21,0x21,0x21,0x23,0x20,
- 0x20,0x20,0x20,0x20,0x23,0x22,0x22,0x22,0x22,0x22,0x23,0x20,0x20,0x20,0x20,0x23,
- 0x22,0x21,0x20,0x20,0x21,0x22,0x21,0x20,0x21,0x22,0x20,0x20,0x20,0x20,0x20,0xFF,
- 0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x20,0x14,0xCA,0xE1,
- 0xF8,0xFC,0xFF,0xFF,0xFB,0xFB,0xC3,0xFB,0xFB,0xFF,0xE7,0xDB,0xDB,0xDB,0xE7,0xFF,
- 0xC3,0xEB,0xEB,0xEB,0xF7,0xFF,0xE3,0xDF,0xEF,0xDF,0xE3,0xFF,0xCF,0xE7,0xEB,0xE7,
- 0xCF,0xFF,0xFB,0xF7,0xCF,0xF7,0xFB,0xFF,0xFF,0x00,0x01,0x01,0xFF,0x01,0x01,0x00,
- 0x3C,0x42,0x81,0x81,0x81,0x42,0x3C,0x00,0xFF,0x11,0x11,0x11,0x0E,0x03,0x3C,0xC0,
- 0x30,0x0E,0x01,0x0E,0x30,0xC0,0x3C,0x03,0xC0,0x30,0x2E,0x21,0x2E,0x30,0xC0,0x00,
- 0x01,0x06,0x08,0xF0,0x08,0x06,0x01,0x00,0x00,0x00,0x00,0xFF,0x80,0x80,0x80,0x80,
- 0x04,0xFF,0x84,0x00,0x78,0x84,0x84,0x48,0xFF,0x00,0x00,0x80,0x00,0x00,0x00,0xFF,
- 0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0xF0,0xF0,0xF0,0x70,0xF0,0xC0,0x00,0x00,0x00,0xC0,0xF0,0x70,0xF0,0xF0,
- 0xF0,0x00,0x00,0x80,0xE0,0xE0,0x70,0x30,0x30,0x70,0x60,0x40,0x00,0x00,0x80,0xE0,
- 0xE0,0x70,0x30,0x70,0xE0,0xE0,0x80,0x00,0x00,0x80,0xE0,0xE0,0x70,0x30,0x30,0x70,
- 0x60,0x40,0x00,0x00,0xC0,0xE0,0xF0,0x30,0x30,0x30,0xF0,0xE0,0xC0,0x00,0x00,0x00,
- 0xC0,0xE0,0xE0,0x70,0x70,0x70,0x70,0xF0,0xE0,0xE0,0x80,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
- 0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
- 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x07,0x7F,0xFC,0xC0,0xFC,0x7F,0x07,0x00,0xFF,0xFF,
- 0xFF,0x00,0x00,0x7F,0xFF,0xFF,0x86,0x03,0x87,0xFF,0xFE,0x7C,0x00,0x00,0x7F,0xFF,
- 0xFF,0x80,0x00,0x80,0xFF,0xFF,0x7F,0x00,0x00,0x7F,0xFF,0xFF,0x86,0x03,0x87,0xFF,
- 0xFE,0x7C,0x00,0x00,0xC0,0xC0,0xC0,0x00,0x06,0x06,0xFF,0xFF,0xF9,0x00,0x00,0x3F,
- 0xFF,0xFF,0xC0,0x80,0x80,0x80,0x80,0xC0,0xE1,0xE1,0x40,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
- 0xFF,0x00,0xE0,0x20,0x20,0x20,0x20,0x00,0xC0,0x20,0x20,0x20,0x20,0x40,0x00,0x20,
- 0x20,0xE0,0x20,0x20,0x00,0xE0,0x43,0x83,0x03,0x03,0xE3,0x03,0x03,0x03,0x03,0xE3,
- 0x00,0x00,0x03,0x03,0x03,0x80,0x40,0x20,0x23,0x23,0x43,0x00,0xE0,0x20,0x23,0x23,
- 0x43,0x80,0x00,0x00,0x01,0x01,0x83,0x43,0xE3,0x01,0x01,0x00,0x40,0x20,0x20,0x21,
- 0xC1,0x03,0xC3,0x23,0x21,0x21,0xC0,0x00,0x00,0x00,0x01,0x81,0x03,0x03,0x03,0x81,
- 0x01,0x00,0x00,0x00,0xC0,0x21,0x23,0x23,0x43,0x03,0x03,0x81,0x40,0xE0,0x00,0x00,
- 0x00,0x01,0x01,0xE3,0x23,0x23,0x23,0xC3,0x01,0xA1,0x00,0x80,0x00,0x00,0x00,0x80,
- 0x00,0x00,0x80,0x80,0x80,0x00,0x00,0xE0,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0xFF,
- 0xFF,0x80,0x9F,0x81,0x81,0x81,0x80,0x80,0x88,0x91,0x91,0x92,0x92,0x8C,0x80,0x80,
- 0x80,0x9F,0x80,0x80,0x80,0x9F,0x80,0x81,0x86,0x88,0x9F,0x80,0x80,0x80,0x80,0x9F,
- 0x90,0x90,0x90,0x90,0x80,0x87,0x88,0x90,0x90,0x90,0x88,0x80,0x9F,0x90,0x90,0x90,
- 0x88,0x87,0x80,0x80,0x80,0x80,0x80,0x80,0x9F,0x80,0x80,0x80,0x90,0x98,0x94,0x92,
- 0x91,0x80,0x8E,0x91,0x91,0x91,0x8E,0x80,0x80,0x80,0x80,0x90,0x89,0x86,0x89,0x90,
- 0x80,0x80,0x80,0x80,0x8F,0x91,0x91,0x91,0x8E,0x80,0x86,0x85,0x84,0x9F,0x84,0x80,
- 0x80,0x80,0x80,0x9F,0x82,0x82,0x82,0x81,0x80,0x9F,0x80,0x90,0x89,0x86,0x89,0x90,
- 0x80,0x8F,0x92,0x92,0x92,0x8B,0x80,0x9F,0x80,0x89,0x92,0x92,0x94,0x89,0x80,0xFF
- };
- //-----------------------------------
- // Delay Routine
- //-----------------------------------
- void delayms(uint m) // 12MHz Xtal, close to ms value
- {
- uint j;
- uint i;
-
- for(i=0; i<m; i++)
- for(j=0; j<109; j++)
- _nop_();
- }
- //--------------------------------------------
- //總線尋址方式驅動程序 (INTEL8080 時序)
- //-----指令代碼寫入函數----------------------
- void SdCmd(uchar Command)
- {
- uchar xdata *Com_addr;
- Com_addr =0x8000; // 指令口地址
- *Com_addr = Command; // 寫指令操作
- }
- //-----顯示數據寫入函數--------------------------
- void SdData(uchar DData)
- {
- uchar xdata *DData_addr;
- DData_addr =0x8100; // 數據口地址
- *DData_addr = DData; // 寫數據操作
- }
- //------顯示數據讀取函數-------------------------
- uchar RdData()
- {
- uchar DData;
- uchar xdata *DData_addr;
- DData_addr = 0x8100; // 讀數據地址
- DData = *DData_addr; // 讀數據操作
- return(DData); //返回數據值
- }
- //-----------------------------------
- // Write a Screen
- //-----------------------------------
- void WriteScreen(uchar *DisplayData) // DisplayData should be 164x64/8 = 1312byte
- {
- uchar TempData;
- uchar i, j;
- for(i=0;i<8;i++)
- {
- SdCmd(0xb0 | i); // select page 0~7
- SdCmd(0x10); // start form column 0
- SdCmd(0x00); // (2byte command)
- for(j=0;j<128;j++)
- {
- TempData=(*(DisplayData+(i*128)+j));
- SdData(TempData);
- }
- }
- }
- /*
- //-----------------------------------
- // Contrast control
- //-----------------------------------
- void LCD_Darker(void)
- {
- if (ContrastLevel<0x3F)
- {
- ContrastLevel++;
- }
- SdCmd(0x81); // E-Vol setting
- SdCmd(ContrastLevel); // (2byte command)
- }
- void LCD_Lighter(void)
- {
- if (ContrastLevel>0x00)
- {
- ContrastLevel--;
- }
- SdCmd(0x81); // E-Vol setting
- SdCmd(ContrastLevel); // (2byte command)
- }
- */
- //-----------------------------------
- // Init LCD module
- //-----------------------------------
- void initLCDM(void)
- {
- _RST=1; // hardware reset LCD module
- _RST=0;
- delayms(1);
- _RST=1;
- delayms(10);
-
- ContrastLevel=0x21; // default Contrast Level
- SdCmd(0xaf); // display on
- SdCmd(0x40); // display start line=0
- SdCmd(0xa1); // ADC=1
- SdCmd(0xa6); // normal display
- SdCmd(0xa4); // Display all point = off
- SdCmd(0xa2); // LCD bias = 1/9
- SdCmd(0xc0); // Common output mode select= reverse
- SdCmd(0x2f); // Power control = all on
- SdCmd(0x25); // RA/RB setting
- SdCmd(0xf8);SdCmd(0x00);// Booster Ratio Set= 2x,3x,4x (2byte command)
- SdCmd(0x81); // E-Vol setting
- SdCmd(ContrastLevel); // (2byte command)
- }
- //-----------------------------------
- // Main Program
- //-----------------------------------
- void main()
- {
- SP=0x60;
- EA = 0; // disable interrupts
-
- _RST = 1;
- initLCDM();
- WriteScreen(Logo);
- while(1)
- {
- }
- }
- //end of program
復制代碼
|