一、实验目的
1. 掌握keil C51软件与protues软件联合仿真调试的方法; 2. 掌握LCM1602液晶模块显示西文的原理及使用方法;
3. 掌握用8位数据模式驱动LCM1602液晶的C语言编程方法;
二、实验内容
1. 用protues设计一LCM1602液晶显示接口电路。要求利用P0接LCM1602液晶的数据端,P2.0~P2.2做LCM1602液晶的控制信号输入端。P3.0~P3.4口扩展4个功能键K1~K4,电路如下 2. 编写程序,实现字符的静态和动态显示,字符为第一行“姓名全拼”第二行“专业全拼+学号”。液晶的初始化,字符显示程序可参考的程序文件。
3. 编写程序,利用功能键实现字符的纵向滚动和横向滚动等效果显示,主程序静态显示“My Informatiom”,显示字符如下:
1. 姓名全拼
2. 专业全拼+学号
3. MCS-51 EXP8
4. LCD DISPLAY ”
三.实验步骤
1.用Protues设计1602液晶显示接口电路;
自动点火器2.在Keil51中编写液晶显示控制程序,编译通过后,与Protues联合调试;
3.按功能键,观察字符及效果是否正确显示;
四.实验电路
2
五.实验程序
1静态
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="1.wanglin";
uchar code table1[]="2.tongxin 517";
sbit lcden=P2^2;
sbit lcdrs=P2^0;
uchar num;
void delay(uint z)网络滤波器
{ uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{ lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{ lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{ lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80+0x1);
}
void main()
{ init();
while(1)
{
write_com(0x80);
for(num=0;num<10;num++)
{
write_data(table[num]);
delay(300);
}
write_com(2);
write_com(0x80+0x40);
for(num=0;num<13;num++)
{
write_data(table1[num]);
delay(300);
}
}
}
1动态
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="1.wanglin";
uchar code table1[]="2.tongxin 517";
sbit lcden=P2^2;
sbit lcdrs=P2^0;
uchar num;
void delay(uint z)
{ uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{ lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)室内垃圾桶
{ lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{ lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80+0x1);
}
void main()
{ init();
while(1)
{
write_com(0x80);
for(num=0;num<10;num++)
{
write_data(table[num]);
delay(300);
}
write_com(2);
write_com(0x80+0x40);
for(num=0;num<13;num++)
{
write_data(table1[num]);
delay(300);
}
write_com(1);
}
}
2
#include<reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P2^2;
sbit lcdrs=P2^0;
sbit lcdrw=P2^1;
sbit busy=P0^7;
sbit K1=P3^0;
sbit K2=P3^1;
bit flag1,flag2,flag3,flag4;
uchar num,i;
uchar code tab[]="My information!";
uchar code tab1[]="1.wanglin";
uchar code tab2[]="2.tongxin 517";
uchar code tab3[]="3.MCS-51 EXP8";
uchar code tab4[]="4.LCD DISPLAY";
void LCD_check_busy()
{
while(1)
{
lcden=0;
lcdrs=0;
lcdrw=1;
P0=0xff;
lcden=1;
if(busy==0) break;
}
lcden=0;
}
void delay(uint x)
{
while(x--);
}
void delay_ms(uint x)
{
int a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void write_com(uchar com)
{
LCD_check_busy();
lcdrs=0;
lcden=0;
lcdrw=0;
P0=com;
lcden=1;
lcden=0;
}
void write_dat(uchar dat)
{
LCD_check_busy();
lcdrs=1;
P0=dat;
delay(5);
lcdrw=0;
lcden=1;
lcden=0;
}
void lcd_init()
{
lcden=0;
write_com(0x38);
write_com(0x0f);
write_com(0x06);
}
void write_str(uchar *str)
{
while(*str!='\0')
{
while(flag3);
if(flag4)
{ write_com(0x01); break; }
write_dat(*str) ;
str++;
delay_ms(50);
}
}
void main()
{
uchar *ptr=tab;
uchar *p=tab1,*q=tab2,*m=tab3,*n=tab4;
TMOD=0x00;
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
TR0=1;
ET0=1;
EX0=1;
EX1=1;
IT0=IT1=1;
EA=1;
PX1=1;
lcd_init();
while(1)
{
write_com(01);
write_com(0x80+0x00);
for(i=0;i<15;i++)
{
if(flag1|flag2) break;
write_dat(tab[i]);
delay_ms(100);
}
while(flag1==1)
{
write_com(0x01);
write_com(0x80+0x00);
write_str(p);
if(flag4)
{ flag4=0; break;}
write_com(0xc0+0x00);
write_str(q);
if(flag4)
{ flag4=0; break;}
delay_ms(800);
电解制水机 write_com(0x01);
write_com(0x80+0x00);
write_str(q);
if(flag4)
{ flag4=0; break;}
write_com(0xc0+0x00);
write_str(m);
if(flag4)
{ flag4=0; break;}
delay_ms(800);
write_com(0x01);
write_com(0x80+0x00);
write_str(m);
if(flag4)
{flag4=0; break;}
write_com(0xc0+0x00);
write_str(n);
if(flag4)
{flag4=0; break;}
delay_ms(800);
write_com(0x01);
write_com(0x80+0x00);
write_str(n);纳米导光板
if(flag4)
{ flag4=0; break;}
write_com(0xc0+0x00);
write_str(p);
if(flag4)
{ flag4=0; break;}
delay_ms(800);
}
while(flag2==1)
{
write_com(0x01);
write_com(0x80+0x00);
write_str(p);
if(flag4)在公交车上释放
{ flag4=0; break;}
write_com(0x80+0x15);
write_str(q);
if(flag4)
{ flag4=0; break;}