液晶显示模块通常用来作为控制设备的人机交互的窗口,把机器/设备的内部参数显示在液晶屏幕上,今天和大家来分享一下,如何利用单片机的总线来点亮液晶显示模块的; 通常情况下,拿到一个液晶屏幕要如何才能点亮他呢,首先得看懂用户手册,也不是要全看懂哈,看懂关键的几个点就可以了: 第一, 接口定义; 第二, 时序图; 第三, 指令表; 看懂这些就差不多了,这里就拿工业显示屏幕里比较知名的拓普微的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
复制代码
|