文档库 最新最全的文档下载
当前位置:文档库 › 单片机与LCD液晶显示器应用程序举例

单片机与LCD液晶显示器应用程序举例

单片机与LCD液晶显示器应用程序举例
单片机与LCD液晶显示器应用程序举例

/*******************************************************************

智能温控器

问题描述:当温控开关打开时,若测得环境温度大于设定温度,则继电器吸合,启动压缩机工作;若测得环境温度小于设定温度,则继电器释放,

压缩机停止工作。

该实验可以应用于对温度控制精度要求不是很高的场合,例如,粮仓,

电冰箱,空调,电饭锅等。如果配以通讯接口,可以做成多点温度检

测监控系统。具有极强的扩展性。

作者:yiwei "shannxi university of technolog "

日期:2007.4.1在proteus上仿真成功;

2007.4.3电路板焊接调试成功

参考资料:[1] 周兴华编著《单片机智能产品c语言设计实例祥解》

[2]《电子制作》2006.11

[3] https://www.wendangku.net/doc/6810634022.html,

注意:此文档为仿真程序,若要在试验板上验证,需要须改一下函数

void lcd_wait(void)

{

DA TAPORT=0xff;

LCM_EN=1;

LCM_RS=0;

LCM_RW=1;

_nop_();

while(DATAPORT&BUSY);

LCM_EN=0;

}

*******************************************************************/

#include

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define BUSY 0x80 //lcd忙检测标志

#define DATAPORT P0 //定义P0口为LCD通讯端口#define PLAYE_ADDR XBYTE[0XBFFF] //语音报警地址

sbit RED_ALARM=P1^0; //红色指示灯

sbit WRITE_ALARM=P1^1; //白色指示灯

sbit GREEN_ALARM=P1^2; //绿色指示灯

sbit P1_4=P1^4; //时钟调整

sbit P1_5=P1^5; //时钟加

sbit P1_6=P1^6; //时钟减

sbit DQ = P2^4; //定义ds18b20通信端口

sbit LCM_RS=P2^0; //数据/命令端

sbit LCM_RW=P2^1; //读/写选择端

sbit LCM_EN=P2^2; //LCD使能信号

sbit ad_busy=P3^2; //adc中断方式接口

sbit RECLED_EOC=P3^5; //ISD1420放音结束查询标志

sbit OUT=P3^7;

uchar ad_data; //ad采样值存储

uchar seconde=0; //定义并初始化时钟变量

uchar minite=0;

uchar hour=12;

uchar mstcnt=0;

uchar temp1,temp2,temp; //温度显示变量

uchar t,set;

uchar K;

bit ON_OFF=0;

bit outflag;

uchar code str0[]={"--- : : --- "};

uchar code str1[]={"SET: C SA: . C"};

void delay_LCM(uint); //LCD 延时子程序

void initLCM( void);

//LCD初始化子程序

void lcd_wait(void); //LCD 检测忙子程序

void WriteCommandLCM(uchar WCLCM,uchar BusyC); //写指令到ICM子函数

void WriteDataLCM(uchar WDLCM); //写数据到LCM子函数

void DisplayOneChar(uchar X,uchar Y,uchar DData); //显示指定坐标的一个字符子函数

void DisplayListChar(uchar X,uchar Y,uchar code *DData); //显示指定坐标的一串字符子函数

void init_timer0(void); //定时器初始化

void displayfun1(void);

void displayfun2(void);

void displayfun3(void);

void displayfun4(void);

void keyscan(void ); //键盘扫描子程序

void set_adj(void);

void inc_key(void);

void dec_key(void);

void delay_18B20(unsigned int i);

void Init_DS18B20(void) ;

uchar ReadOneChar(void);

void WriteOneChar(unsigned char dat);

void ReadTemperature(void);

void ad0809(void);

void playalarm(void);

/*********延时K*1ms,12.000mhz**********/

void delay_LCM(uint k)

{

uint i,j;

for(i=0;i

{

for(j=0;j<60;j++)

{;}

}

}

/**********写指令到ICM子函数************/

void WriteCommandLCM(uchar WCLCM,uchar BusyC) {

if(BusyC)lcd_wait();

DA TAPORT=WCLCM;

LCM_RS=0; // 选中指令寄存器LCM_RW=0; // 写模式

LCM_EN=1;

_nop_();

_nop_();

_nop_();

LCM_EN=0;

}

/**********写数据到LCM子函数************/

void WriteDataLCM(uchar WDLCM)

{

lcd_wait( ); //检测忙信号

DA TAPORT=WDLCM;

LCM_RS=1; // 选中数据寄存器

LCM_RW=0; // 写模式

LCM_EN=1;

_nop_();

_nop_();

_nop_();

LCM_EN=0;

}

/***********lcm内部等待函数*************/

void lcd_wait(void)

{

DA TAPORT=0xff;

LCM_EN=1;

LCM_RS=0;

LCM_RW=1;

_nop_();

while(DATAPORT&BUSY)

{ LCM_EN=0;

_nop_();

_nop_();

LCM_EN=1;

_nop_();

_nop_();

}

LCM_EN=0;

}

/**********LCM初始化子函数***********/

void initLCM( )

{

DA TAPORT=0;

delay_LCM(15);

WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号

delay_LCM(5);

WriteCommandLCM(0x38,0);

delay_LCM(5);

WriteCommandLCM(0x38,0);

delay_LCM(5);

WriteCommandLCM(0x38,1); //8bit数据传送,2行显示,5*7字型,检测忙信号WriteCommandLCM(0x08,1); //关闭显示,检测忙信号

WriteCommandLCM(0x01,1); //清屏,检测忙信号

WriteCommandLCM(0x06,1); //显示光标右移设置,检测忙信号

WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号}

/****************显示指定坐标的一个字符子函数*************/

void DisplayOneChar(uchar X,uchar Y,uchar DData)

{

Y&=1;

X&=15;

if(Y)X|=0x40; //若y为1(显示第二行),地址码+0X40

X|=0x80; //指令码为地址码+0X80

WriteCommandLCM(X,0);

WriteDataLCM(DData);

}

/***********显示指定坐标的一串字符子函数***********/

void DisplayListChar(uchar X,uchar Y,uchar code *DData)

{

uchar ListLength=0;

Y&=0x01;

X&=0x0f;

while(X<16)

{

DisplayOneChar(X,Y,DData[ListLength]);

ListLength++;

X++;

}

}

/***********ds18b20延迟子函数(晶振12MHz )*******/

void delay_18B20(unsigned int i)

{

while(i--);

}

/**********ds18b20初始化函数**********************/

void Init_DS18B20(void)

{

unsigned char x=0;

DQ = 1; //DQ复位

delay_18B20(8); //稍做延时

DQ = 0; //单片机将DQ拉低

delay_18B20(80); //精确延时大于480us

DQ = 1; //拉高总线

delay_18B20(14);

x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay_18B20(20);

}

/***********ds18b20读一个字节**************/

unsigned char ReadOneChar(void)

{

uchar i=0;

uchar dat = 0;

for (i=8;i>0;i--)

{

DQ = 0; // 给脉冲信号

dat>>=1;

DQ = 1; // 给脉冲信号

if(DQ)

dat|=0x80;

delay_18B20(4);

}

return(dat);

}

/*************ds18b20写一个字节****************/

void WriteOneChar(uchar dat)

{

unsigned char i=0;

for (i=8; i>0; i--)

{

DQ = 0;

DQ = dat&0x01;

delay_18B20(5);

DQ = 1;

dat>>=1;

}

}

/**************读取ds18b20当前温度************/

void ReadTemperature(void)

{

unsigned char a=0;

unsigned char b=0;

unsigned char t=0;

Init_DS18B20();

WriteOneChar(0xCC); // 跳过读序号列号的操作

WriteOneChar(0x44); // 启动温度转换

delay_18B20(100); // this message is wery important

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作

WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度delay_18B20(100);

a=ReadOneChar(); //读取温度值低位

b=ReadOneChar(); //读取温度值高位

temp1=b<<4;

temp1+=(a&0xf0)>>4;

temp2=a&0x0f;

temp=((b*256+a)>>4); //当前采集温度值除16得实际温度值

}

/***************液晶显示子函数1正常显示*****************/

void displayfun1(void)

{

WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号

DisplayListChar(0,0,str0);

DisplayListChar(0,1,str1);

DisplayOneChar(3,0,hour/10+0x30); //液晶上显示小时

DisplayOneChar(4,0,hour%10+0x30);

DisplayOneChar(6,0,minite/10+0x30); //液晶上显示分

DisplayOneChar(7,0,minite%10+0x30);

DisplayOneChar(9,0,seconde/10+0x30); //液晶上显示秒

DisplayOneChar(10,0,seconde%10+0x30);

DisplayOneChar(4,1,K/10+0x30); //液晶上显示设定的温度

DisplayOneChar(5,1,K%10+0x30);

DisplayOneChar(11,1,temp1/10+0x30); //液晶上显示测得的温度

DisplayOneChar(12,1,temp1%10+0x30);

DisplayOneChar(14,1,temp2/10+0x30);

if(ON_OFF==0) //若温控标志为0

{

DisplayOneChar(14,0,0x4f); // 液晶上显示不控温的标志

DisplayOneChar(15,0,0x46);

}

else

{

DisplayOneChar(14,0,0x4f); // 液晶上显示控温的标志

DisplayOneChar(15,0,0x4e);

if(outflag==1)

DisplayOneChar(0,0,0x7c);

else

DisplayOneChar(0,0,0xef);

}

}

/************液晶显示子函数2***************/

void displayfun2(void)

{

WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号

DisplayListChar(0,0,str0);

DisplayListChar(0,1,str1);

DisplayOneChar(6,0,minite/10+0x30);

DisplayOneChar(7,0,minite%10+0x30);

DisplayOneChar(9,0,seconde/10+0x30);

DisplayOneChar(10,0,seconde%10+0x30);

DisplayOneChar(4,1,K/10+0x30);

DisplayOneChar(5,1,K%10+0x30);

DisplayOneChar(11,1,temp1/10+0x30);

DisplayOneChar(12,1,temp1%10+0x30);

DisplayOneChar(14,1,temp2/10+0x30);

WriteCommandLCM(0x0f,1); //显示屏打开,光标显示,闪烁,检测忙信号

DisplayOneChar(3,0,hour/10+0x30);

DisplayOneChar(4,0,hour%10+0x30);

}

/**************液晶显示子函数3*****************/

void displayfun3(void)

{

WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号

DisplayListChar(0,0,str0);

DisplayListChar(0,1,str1);

DisplayOneChar(3,0,hour/10+0x30);

DisplayOneChar(4,0,hour%10+0x30);

DisplayOneChar(9,0,seconde/10+0x30);

DisplayOneChar(10,0,seconde%10+0x30);

DisplayOneChar(4,1,K/10+0x30);

DisplayOneChar(5,1,K%10+0x30);

DisplayOneChar(11,1,temp1/10+0x30);

DisplayOneChar(12,1,temp1%10+0x30);

DisplayOneChar(14,1,temp2/10+0x30);

WriteCommandLCM(0x0f,1); //显示屏打开,光标显示,闪烁,检测忙信号

DisplayOneChar(6,0,minite/10+0x30);

DisplayOneChar(7,0,minite%10+0x30);

}

/**************液晶显示子函数4 *****************/

void displayfun4(void)

{

WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号

DisplayListChar(0,0,str0);

DisplayListChar(0,1,str1);

DisplayOneChar(3,0,hour/10+0x30);

DisplayOneChar(4,0,hour%10+0x30);

DisplayOneChar(6,0,minite/10+0x30);

DisplayOneChar(7,0,minite%10+0x30);

DisplayOneChar(9,0,seconde/10+0x30);

DisplayOneChar(10,0,seconde%10+0x30);

DisplayOneChar(11,1,temp1/10+0x30);

DisplayOneChar(12,1,temp1%10+0x30);

DisplayOneChar(14,1,temp2/10+0x30);

WriteCommandLCM(0x0f,1); //显示屏打开,光标显示,闪烁,检测忙信号

DisplayOneChar(4,1,K/10+0x30);

DisplayOneChar(5,1,K%10+0x30);

}

/**************键盘扫描子函数******************/

void keyscan(void)

{

uchar xx; //局部变量

P1=0xff;

if(P1!=0xff)

{

delay_LCM(50);

if(P1!=0xff)

{

xx=P1;

switch(xx) // 根据按键状态,调用不同的子函数

{

case 0xfe:set_adj(); break;

case 0xfd:inc_key(); break;

case 0xfb:dec_key(); break;

case 0xf7:ON_OFF=!ON_OFF; break;

default:break;

}

}

}

}

/**************设定工作模式子函数****************/

void set_adj(void)

{

delay_LCM(100);

set++;

if(set>=4)set=0;

}

/****************按键加法子函数******************/

void inc_key(void)

{

delay_LCM(100);

switch(set)

{

case 0:if(P1==0xf7)ON_OFF=!ON_OFF; break;

case 1:hour++; if(hour>=23)hour=23; break;

case 2:minite++; if(minite>=59)minite=59;break;

case 3:K++;if(K>=99)K=99; break;

default:break;

}

}

/****************按键减法子函数*****************/

void dec_key(void)

{

delay_LCM(100);

switch(set)

{

case 0:if(P1==0xf7)ON_OFF=!ON_OFF; break;

case 1:hour--; if(hour<=0)hour=0; break;

case 2:minite--;if(minite<=0)minite=0;break;

case 3:K--;if(K<=1)K=1; break;

default:break;

}

}

/***************定时器t0初始化*******************/

void init_timer0(void)

{

TMOD=0x01; //time0为定时器,方式1 TH0=0x3c; //预置计数初值

TL0=0xb0;

EA=1;

ET0=1;

TR0=1;

}

/***********定时器t0中断子函数**************/

void timer0(void) interrupt 1 using 0 //定时器0方式1,50ms中断一次{

TH0=0x3c;

TL0=0xb0;

mstcnt++;

if(mstcnt>=20 ) {seconde++; mstcnt=0; }

if(seconde>=60) {minite++; seconde=0;}

if(minite>=60 ) {hour++; minite=0; }

if(hour>=24 ) {hour=0;}

keyscan( ); //按键扫描

}

/***********the main funtion*************/

void main(void)

{

P1=0xff; //初始化p1口,全设为1

delay_LCM(500); //延时500ms启动initLCM( ); //LCD初始化

init_timer0( ); //时钟定时器0初始化

Init_DS18B20( ) ; //DS18B20初始化DisplayListChar(0,0,str0);

DisplayListChar(0,1,str1);

while (1)

{

keyscan(); //按键扫描

ReadTemperature(); //温度采集

switch(set) //LCD根据工作模式显示

{

case 0:displayfun1();delay_LCM(1000);break; //正常工作显示

case 1:displayfun2();delay_LCM(1000);break; //调整时显示

case 2:displayfun3();delay_LCM(1000);break; //调整分显示

case 3:displayfun4();delay_LCM(1000);break; //温度设定

default:break;

}

keyscan( ); //相当于延时

if(ON_OFF==1) //若温控标志位1,控制LAMP动作

{

if(temp1>=K+1){outflag=1;OUT=0;}

if(temp1

{

delay_LCM(1000);

if(temp1

}

}

else{outflag=0;OUT=1;}

}

}

单片机之LCD显示原理

5.自制单片机之五LCD1602的驱动 LCD1602已很普遍了,具体介绍我就不多说了,市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,定义如下表所示: 字符型LCD的引脚定义 HD44780内置了DDRAM、CGROM和CGRAM。 DDRAM就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,其地址和屏幕的对应关系如下表: 也就是说想要在LCD1602屏幕的第一行第一列显示一个"A"字,就要向DDRAM的00H地址写入“A”字的代码就行了。但具体的写入是要按LCD模块的指令格式来进行的,后面我会说到的。那么一行可有40个地址呀?是的,在1602中我们就用前16个就行了。第二行也一样用前16个地址。对应如下: DDRAM地址与显示位置的对应关系 我们知道文本文件中每一个字符都是用一个字节的代码记录的。一个汉字是用两个字节的代码记录。在PC上我们只要打开文本文件就能在屏幕上看到对应的字符是因为在操作系统里和BIOS里都固化有字符字模。什么是字模?就代表了是在点阵屏幕上点亮和熄灭的信息数据。例如“A” 字的字模: 01110 ○■■■○ 10001 ■○○○■ 10001 ■○○○■ 10001 ■○○○■ 11111 ■■■■■ 10001 ■○○○■

10001 ■○○○■ 上图左边的数据就是字模数据,右边就是将左边数据用“○”代表0,用“■”代表1。看出是个“A”字了吗?在文本文件中“A”字的代码是41H,PC收到41H的代码后就去字模文件中将代表A字的这一组数据送到显卡去点亮屏幕上相应的点,你就看到“A”这个字了。 刚才我说了想要在LCD1602屏幕的第一行第一列显示一个"A"字,就要向DDRAM的00H地址写入“A”字的代码41H就行了,可41H这一个字节的代码如何才能让LCD模块在屏幕的阵点上显示“A”字呢?同样,在LCD模块上也固化了字模存储器,这就是CGROM和CGRAM。 HD44780内置了192个常用字符的字模,存于字符产生器CGROM(Character Generator ROM)中,另外还有8个允许用户自定义的字符产生RAM,称为CGRAM(Character Generator RAM)。下图说明了CGROM和CGRAM与字符的对应关系。 从上图可以看出,“A”字的对应上面高位代码为0100,对应左边低位代码为0001,合起来就是01000001,也就是41H。可见它的代码与我们PC中的字符代码是基本一致的。因此我们在向DDRAM写C51字符代码程序时甚至可以直接用P1='A'这样的方法。PC在编译时就把“A”先转为41H代码了。 字符代码0x00~0x0F为用户自定义的字符图形RAM(对于5X8点阵的字符,可以存放8组,5X10点阵的字符,存放4组),就是CGRAM了。后面我会详细说的。 0x20~0x7F为标准的ASCII码,0xA0~0xFF为日文字符和希腊文字符,其余字符码(0x10~0x1F及0x80~0x9F)没有定义。 那么如何对DDRAM的内容和地址进行具体操作呢,下面先说说HD44780的指令集及其设置说明,请浏览该指令集,并找出对DDRAM的内容和地址进行操作的指令。 共11条指令: 1.清屏指令 功能:<1> 清除液晶显示器,即将DDRAM的内容全部填入"空白"的ASCII码20H; <2> 光标归位,即将光标撤回液晶显示屏的左上方; <3> 将地址计数器(AC)的值设为0。 2.光标归位指令 功能:<1> 把光标撤回到显示器的左上方; <2> 把地址计数器(AC)的值设置为0; <3> 保持DDRAM的内容不变。

LCD与单片机的连接电路图和LCD显示程序

LCD与单片机的连接电路图和LCD显示程序/LCD测试程序 3.2.5 LCD显示电路 液晶显示器简称LCD显示器,它是利用液晶经过处理后能改变光线的传输方向的特性来显示信息的。要使用点阵型LCD显示器,必须有相应的LCD控制器、驱动器来对LCD显示器进行扫描、驱动,以及一定空间的ROM和RAM来存储写入的命令和显示字符的点阵。现在往往将LCD控制器、驱动器、RAM、ROM和LCD显示器连接在一起,称为液晶显示模块。 液晶显示模块是一种常见的人机界面,在单片机系统中的应用极其广泛。液晶显示模块既可以显示字符,又可以显示简单的图形。本系统采用的是1602的LCD接口。1602是一种点阵字符型液晶显示模块,可以显示两行共32个字符。根据LCD型号的不同,所需要的背光电阻大小会不同,可自行调节。 本系统采用的LCD为RT-1602C,其主要引脚的功能如下: RS:数据/命令选择端,高电平时选择数据寄存器,低电平时选择指令寄存器。 RW:读/写选择端,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时,可以写入指令或者显示地址;当RS为低电平、RW为高电平时,可以读忙信号;当RS 为高电平、RW为低电平时,可以写入数据。 E:使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

图3-9 LCD显示电路 LCD测试程序 #include /********IO引脚定义***********************************************************/ sbit LCD_RS=P2^7;//定义引脚 sbit LCD_RW=P2^6; sbit LCD_E=P2^5; /********宏定义***********************************************************/ #define LCD_Data P0 #define Busy 0x80 //用于检测LCD状态字中的Busy标识 /********数据定义*************************************************************/ unsigned char code uctech[] = {"Happy every day"}; unsigned char code net[] = {"https://www.wendangku.net/doc/6810634022.html,"}; /********函数声明*************************************************************/

基于51单片机的液晶显示器控制电路设计_本科论文

XXXXXXX 毕业设计 题目GPRS无限通讯数据系统的设计与应用姓名xxx 学号xxx 专业班级xxx 分院xxx

指导教师xxx xxxx年xxx月xxx日

目录 摘要............................................... 错误!未定义书签。ABSTRACT........................................................... I I 第一章概述 (1) §1.1系统背景 (1) §1.2 系统概述 (2) 第二章方案论证 (3) §2.1字模数据的存储 (3) §2.2 通信电路 (3) 第三章液晶显示模块简介 (4) §3.1 显示控制器 (5) §3.2 列驱动方式 (10) §3.3 行驱动方式 (11) 第四章硬件设计 (13) §4.1硬件电路设计要求 (13) §4.2 总体电路设计构架 (13) §4.3 单片机与液晶显示模块接口 (13) §4.4 单片机与计算机的通信接口 (14) §4.5 电源电路 (15) 第五章系统软件设计 (15) §5.1 内置T6963C控制器软件特性 (15) §5.2初始化子程序设计 (19) §5.3 串行通信子程序设计 (20) §5.4 显示控制子程序设计 (21) 第六章系统调试 (22) §6.1 分步调试 (22) §6.2 系统统一调试 (23) 结束语 (24) 附录 (25)

参考文献 (30) 致谢............................................. 错误!未定义书签。

单片机与液晶显示器接口

单片机与液晶显示器接口 宋铎 1101014222 摘要: 单片机(Single chip microcomputer)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。本文介绍了单片机对图形点阵型液晶显示模块控制的硬件接口电路以及模块化的程序编写方法,着重说明了KS0108液晶控制器的特点、使用方法,图形点阵型液晶显示模块的内部结构、时序、控制命令及其与单片机的接口电路。 KS0 108 液晶显示控制驱动器是一种带有驱动输出的图形液晶显示驱动器, 它可直接与8 位微处理器相连, 它可与KS01 07 配合对液晶屏进行行、列驱动。 1. 1 KS0 108 的特点 ( 1 ) 内藏6 4* 64 = 409 6位显示RAM, RAM 中每位 数据对应LCD 屏上的一个点的亮、暗状态。 ( 2 ) KS0 108 是列驱动器, 具有64 路列驱动输出。 ( 3 ) KS0 108 读、写操作时序与68 系列微处理器相 符, 因此它可直接与68 系列微处理器接口相连。 ( 4 ) KS0 108 的占空比为1 / 48 - - 1 / 6 1.2 KS0 108 与微处理器的接口信息

1. 3 KS0108的指令系统 ( 1) 显示开/关指令 D isp lay ON /OFF Injunction 当DB0= 1 时, LCD显示RAM 中的内容; DB0= 0 时, 关 闭显示。 ( 2) 显示起始行( ROW ) 设置指令Se t Display Sta rt line Injunction 该指令设置了对应液晶屏最上一行的显示RAM 的行号, 有规律地改变显示起始行, 可以使LCD 实现显示滚屏的效果。 ( 3) 页( PAGE )设置指令Set Pag e In junction 显示RAM 共64行, 分8页, 每页8行。 ( 4) 列地址( Y Address)设置指令Set Y Address Injunc-tion 设置了页地址和列地址, 就唯一确定了显示RAM 中的一个单元, 这样MPU 就可以用读、写指令读出该单元中的内容或向该单元写进一个字节数据。 ( 5) 读状态指令 Sta tus Read In junction 该指令用来查询KS0108的状态, 各参量含义如下: BUSY: 1- 内部在工作 0- 正常状态 ON /OFF: 1- 显示关闭0- 显示打开 REST: 1- 复位状态0- 正常状态 在BUSY和REST状态时, 除读状态指令外, 其它指令均不对KS0108产生作用。在对KS0108操作之前要查询BUSY状态, 以确定是否可以对KS0108进行操作。( 6) 写数据指令W rite Data In junction

单片机与LCD液晶显示器应用程序举例

/******************************************************************* 智能温控器 问题描述:当温控开关打开时,若测得环境温度大于设定温度,则继电器吸合,启动压缩机工作;若测得环境温度小于设定温度,则继电器释放, 压缩机停止工作。 该实验可以应用于对温度控制精度要求不是很高的场合,例如,粮仓, 电冰箱,空调,电饭锅等。如果配以通讯接口,可以做成多点温度检 测监控系统。具有极强的扩展性。 作者:yiwei "shannxi university of technolog " 日期:2007.4.1在proteus上仿真成功; 2007.4.3电路板焊接调试成功 参考资料:[1] 周兴华编著《单片机智能产品c语言设计实例祥解》 [2]《电子制作》2006.11 [3] https://www.wendangku.net/doc/6810634022.html, 注意:此文档为仿真程序,若要在试验板上验证,需要须改一下函数 void lcd_wait(void) { DA TAPORT=0xff; LCM_EN=1; LCM_RS=0; LCM_RW=1; _nop_(); while(DATAPORT&BUSY); LCM_EN=0; } *******************************************************************/ #include #include #include #define uchar unsigned char #define uint unsigned int #define BUSY 0x80 //lcd忙检测标志 #define DATAPORT P0 //定义P0口为LCD通讯端口#define PLAYE_ADDR XBYTE[0XBFFF] //语音报警地址 sbit RED_ALARM=P1^0; //红色指示灯 sbit WRITE_ALARM=P1^1; //白色指示灯 sbit GREEN_ALARM=P1^2; //绿色指示灯 sbit P1_4=P1^4; //时钟调整 sbit P1_5=P1^5; //时钟加 sbit P1_6=P1^6; //时钟减

相关文档
相关文档 最新文档