液晶顯示模塊通常用來(lái)作為控制設(shè)備的人機(jī)交互的窗口,把機(jī)器/設(shè)備的內(nèi)部參數(shù)顯示在液晶屏幕上,今天和大家來(lái)分享一下,如何利用單片機(jī)的總線來(lái)點(diǎn)亮液晶顯示模塊的; 通常情況下,拿到一個(gè)液晶屏幕要如何才能點(diǎn)亮他呢,首先得看懂用戶手冊(cè),也不是要全看懂哈,看懂關(guān)鍵的幾個(gè)點(diǎn)就可以了: 第一, 接口定義; 第二, 時(shí)序圖; 第三, 指令表; 看懂這些就差不多了,這里就拿工業(yè)顯示屏幕里比較知名的拓普微的LM6063CCW的模塊(控制器是ST7565的,128x64液晶屏用的最多的控制器了)來(lái)做個(gè)講解,首先打開(kāi)手冊(cè)(網(wǎng)上一搜一大把哈): 咱按著節(jié)奏來(lái): 第一:接口定義
接口定義.jpg (79.78 KB, 下載次數(shù): 35)
下載附件
接口定義
2020-3-4 18:52 上傳
全是英文的,不要被嚇到哈,其實(shí)這些都是比較簡(jiǎn)單的英文,我四級(jí)都沒(méi)過(guò)都能看懂,相信你們也都可以哈;怕有些草根確實(shí)看不明白,我挑幾個(gè)關(guān)鍵點(diǎn)說(shuō)一下,首先我們只看8080模式:1.手冊(cè)里說(shuō)這個(gè)是默認(rèn)的;2.AT89S52的總線就是8080的; A0 通道選擇信號(hào),當(dāng)A0=0時(shí),選擇指令通道;A0=1時(shí),選擇數(shù)據(jù)通道; /RD為讀信號(hào),低電平有效; /WR為寫(xiě)信號(hào),低電平有效;注意:/WR和/RD 不能同時(shí)為底電平哈 /RES復(fù)位腳,低電平有效; /CS1片選型號(hào),低電平有效;與模塊通訊都需要片選信號(hào)有效情況下; 第二:時(shí)序圖
時(shí)序圖.jpg (47.73 KB, 下載次數(shù): 33)
下載附件
時(shí)序圖
2020-3-4 18:53 上傳
如何看懂時(shí)序圖在這里就不多說(shuō)了在學(xué)校師傅應(yīng)該是有教過(guò)的哈,如果已經(jīng)還給師傅了的話,可以私聊我;
第三:指令表
指令表.jpg (67.05 KB, 下載次數(shù): 34)
下載附件
指令表
2020-3-4 18:53 上傳
英文的,我也就不多解釋了,最好是看ST7565的IC資料也是英文的,不過(guò)我找到了中文版的資料需要的童鞋可以私聊我;
好了接下來(lái)畫(huà)重點(diǎn): 很多人都有用IO口點(diǎn)亮過(guò)液晶顯示模塊,今天咱來(lái)介紹一下更高級(jí)的點(diǎn)亮辦法,因?yàn)橛肐O口模擬時(shí)序,就需要一個(gè)一個(gè)信號(hào)的去操作,很耗費(fèi)時(shí)間,從而會(huì)導(dǎo)致整幅圖片刷新時(shí),能看出刷的效果;那么怎么樣才能夠避免出現(xiàn)刷的效果呢,可以通過(guò)節(jié)省送數(shù)據(jù)的時(shí)間,而51單片機(jī)設(shè)計(jì)的時(shí)候?yàn)榱丝焖僭L問(wèn)外部存儲(chǔ),帶有16根地址線可直接尋址既80總線,這種方式的好處是,他的讀寫(xiě)時(shí)序都是單片機(jī)內(nèi)部產(chǎn)生的時(shí)序,因此縮短模擬IO口所花費(fèi)的時(shí)間,可能這么說(shuō)你感覺(jué)不到什么,舉個(gè)實(shí)例:假設(shè)單片機(jī)的指令周期為1us,如果是IO口模擬的話至少需要7us,如果是用總線方式只需要1us,相差7倍!廢話少說(shuō),直接上干貨: 要使用總線方式,首先硬件要連接好,可參照下面的原理圖設(shè)計(jì)硬件:
原理圖.jpg (49.55 KB, 下載次數(shù): 46)
下載附件
原理圖
2020-3-4 18:53 上傳
總線尋址方式是模塊的數(shù)據(jù)總線直接掛在89S52的數(shù)據(jù)總線上,/RD、/WR作為模塊的讀、寫(xiě)控制信號(hào),/CS信號(hào)和A0信號(hào)都由地址線譯碼產(chǎn)生,模塊的/RES接RC復(fù)位電路。 總線尋址方式驅(qū)動(dòng)函數(shù)如下:(地址定義,根據(jù)用戶平臺(tái)接口修改) 1、指令代碼寫(xiě)入函數(shù) voidSdCmd(uchar Command) { uchar xdata *Com_addr; Com_addr =0x8000; // 指令通道地址 *Com_addr = Command; //寫(xiě)指令操作 } 2、顯示數(shù)據(jù)寫(xiě)入函數(shù) voidSdData(uchar DData) { uchar xdata *DData_addr; DData_addr =0x8100; // 數(shù)據(jù)通道地址 *DData_addr = DData; //寫(xiě)數(shù)據(jù)操作 } 3、顯示數(shù)據(jù)讀取函數(shù) ucharRdData() { uchar DData; uchar xdata *DData_addr; DData_addr =0x8100; //數(shù)據(jù)通道地址 DData = DData_addr; //讀數(shù)據(jù)操作 return(DData); //返回?cái)?shù)據(jù)值 } 其他的代碼就沒(méi)啥好說(shuō)的了,參照附件
- #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[]={
- /*-- 調(diào)入了一幅圖像: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_();
- }
- //--------------------------------------------
- //總線尋址方式驅(qū)動(dòng)程序 (INTEL8080 時(shí)序)
- //-----指令代碼寫(xiě)入函數(shù)----------------------
- void SdCmd(uchar Command)
- {
- uchar xdata *Com_addr;
- Com_addr =0x8000; // 指令口地址
- *Com_addr = Command; // 寫(xiě)指令操作
- }
- //-----顯示數(shù)據(jù)寫(xiě)入函數(shù)--------------------------
- void SdData(uchar DData)
- {
- uchar xdata *DData_addr;
- DData_addr =0x8100; // 數(shù)據(jù)口地址
- *DData_addr = DData; // 寫(xiě)數(shù)據(jù)操作
- }
- //------顯示數(shù)據(jù)讀取函數(shù)-------------------------
- uchar RdData()
- {
- uchar DData;
- uchar xdata *DData_addr;
- DData_addr = 0x8100; // 讀數(shù)據(jù)地址
- DData = *DData_addr; // 讀數(shù)據(jù)操作
- return(DData); //返回?cái)?shù)據(jù)值
- }
- //-----------------------------------
- // 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
復(fù)制代碼
|