设计思路:
第一行显示,设定的英文拼音
第二行显示,设定的数组
仿真器件:
AT89C51
BUTTON
CAP
CRYSTAL
LM016L
RES
RESPACK-8
实现程序:
#include<reg51.h>
#include<intrins.h>
sbit RS=P3^0;
sbit RW=P3^1;
sbit E=P3^2;
#define LCD_DB P1
unsigned char name[] = {"san guo sha"};
unsigned char number[] = {"110 119 120"};
extern unsigned char lcd_r_start();
extern void lcd_w_cmd(unsigned char com);
extern void lcd_w_dat(unsigned char dat);
extern void lcd_init();
extern void delayms(unsigned int i);
extern void delayus();
void delayms(unsigned int i)//延时函数
{
unsigned char k;
while(i--)
for(k=0;k<120;k++);
}
void delayus()
{
_nop_();
_nop_();
_nop_();
}
void main()//主函数
{
int i;
int j;
lcd_init();
lcd_w_cmd(0x81);
for(i=0;i<11;i++)
{
lcd_w_dat(name[i]);
}
lcd_w_cmd(0xc1);
for(j=0;j<11;j++)
{
lcd_w_dat(number[j]);
}
while(1);
}
unsigned char lcd_r_start()//读取函数
{
unsigned char s;
RW=1;
delayus();
RS=0;
delayus();
E=1;
delayus();
s=LCD_DB;
delayus();
E=0;
delayus();
RW=0;
delayus();
return(s);
}
void lcd_w_cmd(unsigned char com)//写命令函数
{
unsigned char i;
do
{
i=lcd_r_start();
i=i&0x80;
delayms(1);
}
while(i!=0);
RW=0;
delayus();
RS=0;
delayus();
E=1;
delayus();
LCD_DB =com;
delayus();
E=0;
delayus();
RW=1;
delayms(50);
}
void lcd_w_dat(unsigned char dat)//写入数据函数
{
unsigned char i;
do
{
i=lcd_r_start();
i=i&0x80;
delayms(1);
}
while(i!=0);
RW=0;
delayus();
RS=1;
delayus();
E=1;
delayus();
LCD_DB =dat;
delayus();
E=0;
delayus();
RW=1;
delayms(50);
}
void lcd_init()
{
lcd_w_cmd(0x3c); // 设置工作方式
lcd_w_cmd(0x0e); // 设置光标
lcd_w_cmd(0x01); // 清屏
lcd_w_cmd(0x06); // 设置输入方式
}
实现仿真图:
实现视频效果:
进阶程序:
//程序:ex4_10.c
//功能:LCD液晶显示程序,采用8位数据接口
#include <reg51.h> //包含头文件reg51.h,定义了51单片机的专用寄存器
#include <intrins.h> //包含头文件intrins.h,代码中引用了_nop_()函数
//定义控制信号端口
sbit RS=0xb0; //P3.0
sbit RW=0xb1; //P3.1
sbit E=0xb2; //P3.2
//声明调用函数
void lcd_w_cmd(unsigned char com); //写命令字函数
void lcd_w_dat(unsigned char dat); //写数据函数
unsigned char lcd_r_start(); //读状态函数
void lcd_int(); //LCD初始化函数
void delay(unsigned int i); //可控延时函数
void delay1(); //软件延时函数,大约几个机器周期
void main() //主函数
{
unsigned char lcd[]="SHEN ZHEN";
unsigned char i;
P1=0xff; //送全1到P0口
lcd_int(); //初始化LCD
delay(255);
lcd_w_cmd(0x83); //设置显示位置
delay(255);
for(i=0;lcd[i]!='\0';i++) //显示字符串,字符串结束符为'\0'
{
lcd_w_dat(lcd[i]);
delay(200);
}
while(1); //原地踏步,待机命令
}
//函数名:delay1
//函数功能:采用软件实现延时,大约几个机器周期
//形式参数:无
//返回值:无
void delay1()
{
_nop_();
_nop_();
_nop_();
}
//函数名:lcd_int
//函数功能:lcd初始化
//形式参数:无
//返回值:无
void lcd_int()
{
lcd_w_cmd(0x3c); //设置工作方式
lcd_w_cmd(0x0e); //设置光标
lcd_w_cmd(0x01); //清屏
lcd_w_cmd(0x06); //设置输入方式
lcd_w_cmd(0x80); //设置初始显示位置
}
//函数名:lcd_r_start
//函数功能:读状态字
//形式参数:无
//返回值:返回状态字,最高位D7=0,LCD控制器空闲;D7=1,LCD控制器忙
unsigned char lcd_r_start()
{
unsigned char s;
RW=1; //RW=1,RS=0,读LCD状态
delay1();
RS=0;
delay1();
E=1; //E端时序
delay1();
s=P1; //从LCD的数据口读状态
delay1();
E=0;
delay1();
RW=0;
delay1();
return(s); //返回读取的LCD状态字
}
//函数名:lcd_w_cmd
//函数功能:写命令字
//形式参数:命令字已存入com单元中
//返回值:无
void lcd_w_cmd(unsigned char com)
{
unsigned char i;
do{ //查LCD忙操作
i=lcd_r_start(); //调用读状态字函数
i=i&0x80; //"与"操作屏蔽掉低7位
delay(2);
}while(i!=0); //LCD忙,继续查询,否则退出循环
RW=0;
delay1();
RS=0; //RW=0,RS=0,写LCD命令字
delay1();
E=1; //E端时序
delay1();
P1=com; //将com中的命令字写入LCD数据口
delay1();
E=0;
delay1();
RW=1;
delay(255);
}
//函数名:lcd_w_dat
//函数功能:写数据
//形式参数:数据已存入dat单元中
//返回值:无
void lcd_w_dat(unsigned char dat)
{
unsigned char i;
do{ //查忙操作
i=lcd_r_start(); //调用读状态字函数
i=i&0x80; //"与"操作屏蔽掉低7位
delay(2);
}while(i!=0); //LCD忙,继续查询,否则退出循环
RW=0;
delay1();
RS=1; //RW=0,RS=1,写LCD命令字
delay1();
E=1; //E端时序
delay1();
P1=dat; //将dat中的显示数据写入LCD数据口
delay1();
E=0;
delay1();
RW=1;
delay(255);
}
//函数名:delay
//函数功能:实现软件延时
//形式参数:无符号整型变量i,控制空循环的循环次数
//返回值:无
void delay(unsigned int i) //延时函数
{
unsigned int k;
for(k=0;k<i;k++);
}
Comments NOTHING