‘壹’ 编写51单片机实现液晶上字的循环显示和移动程序
在1602的第一行 循环显示 welcome to china
//用1602循环右移显示"Welcome to China"
#include<reg52.h> //包含单片机寄存器的头文件
#include<intrins.h> //包含_nop_()函数定义的头文件
sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚
sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚
sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚
sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚
unsigned char code string[ ]={"Welcome to China"};
/*****************************************************
函数功能:延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函数功能:延时若干毫秒
入口参数:n
***************************************************/
void delay(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
/*****************************************************
函数功能:判断液晶模块的忙碌状态
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
unsigned char BusyTest(void)
{
bit result;
RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1; //E=1,才允许读写
_nop_(); //空操作
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
result=BF; //将忙碌标志电平赋给result
E=0;
return result;
}
/*****************************************************
函数功能:将模式设置指令或显示地址写入液晶模块
入口参数:dictate
***************************************************/
void WriteInstruction (unsigned char dictate)
{
while(BusyTest()==1); //如果忙就等待
RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
// 就是让E从0到1发生正跳变,所以应先置"0"
_nop_();
_nop_(); //空操作两个机器周期,给硬件反应时间
P0=dictate; //将数据送入P0口,即写入指令或地址
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:指定字符显示的实际地址
入口参数:x
***************************************************/
void WriteAddress(unsigned char x)
{
WriteInstruction(x+0x80); //显示位置的确定方法规定为"80H+地址码x"
}
/*****************************************************
函数功能:将数据(字符的标准ASCII码)写入液晶模块
入口参数:y(为字符常量)
***************************************************/
void WriteData(unsigned char y)
{
while(BusyTest()==1);
RS=1; //RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
// 就是让E从0到1发生正跳变,所以应先置"0"
P0=y; //将数据送入P0口,即将数据写入液晶模块
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:对LCD的显示模式进行初始化设置
***************************************************/
void LcdInitiate(void)
{
delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间
WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
delay(5); //延时5ms
WriteInstruction(0x0f); //显示模式设置:显示开,有光标,光标闪烁
delay(5);
WriteInstruction(0x06); //显示模式设置:光标右移,字符不移
delay(5);
WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除
delay(5);
}
void main(void) //主函数
{
unsigned char i;
LcdInitiate(); //调用LCD初始化函数
delay(10);
while(1)
{
WriteInstruction(0x01);//清显示:清屏幕指令
WriteAddress(0x00); // 设置显示位置为第一行的第5个字
i = 0;
while(string[i] != '\0')
{ // 显示字符
WriteData(string[i]);
i++;
delay(150);
}
for(i=0;i<4;i++)
delay(250);
}
}
‘贰’ 单片机如何驱动LCD显示字符
首先你要确定你的LCD是什么型号,是否有字库 等等, 而后对应找这个型号的datasheet 查看怎么驱动他。一般都会有例子,多逛逛单片机论坛吧 有用的。别老来网络问些不知道怎么回答的问题
下面我给一个单片机驱动1602液晶的部分代码,希望有用。
/*******************************************************************************
1602LCD
*******************************************************************************/
#include <reg51.h>
#include <intrins.h>
#define unit unsigned int
#define char unsigned char
sbit rs = P2^1;
sbit rw = P2^2;
sbit ep = P2^0;
char code ask[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0xb0};
/* 0 1 2 3 4 5 6 7 8 9 - */
char code dis1[] = {"welcome!"};
char code dis2[] = {"pzowen love you!"};
//***********************************************//
//***********************************************//
///////////////////////////////////////////////////
///////////////////////////////////////////////////
delay(char ms)
{ // 延时子程序
char i;
while(ms--)
{
for(i = 0; i<250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
lcd_wcmd(char cmd)
{ // 写入指令数据到LCD
delay(1);
rs = 0;
rw = 0;
ep = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
lcd_pos(char pos)
{ //pos=0x40; //设定显示位置
lcd_wcmd(pos|0x80);
//lcd_wcmd(pos);
}
lcd_wdat(char dat)
{ //写入字符显示数据到LCD
delay(1);
rs = 1;
rw = 0;
ep = 0;
_nop_();
_nop_();
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
lcd_init()
{
delay(1); //LCD初始化设定
lcd_wcmd(0x38); //显示模式设置:单行,8字符,5x7点阵
delay(1);
delay(1);
lcd_wcmd(0x0c); //开显示,关光标,不闪烁
delay(1);
delay(1);
lcd_wcmd(0x06); //设置输入模式:光标增量移动,显示不移位
delay(1);
delay(1);
//lcd_wcmd(0x01); //清除LCD显示的内容
//delay(1);
}
void main()
{
char i;
char k;
lcd_init(); // 初始化LCD
delay(10);
lcd_pos(0x04); // 设置显示位置为第一行的第5个字符
i = 0;
while(dis1[i]!='\0')
{ // 显示字符"welcome!"
lcd_wdat(dis1[i]);
//lcd_wdat(ask[xianshi[i]]);
delay(30);
i++;
}
//lcd_wdat(xianshi[1]);
//delay(30);
delay(20);
lcd_init();
delay(10);
lcd_pos(0x40); // 设置显示位置为第二行第二个字符
delay(10);
i = 0;
while(dis2[i]!='\0')
{
lcd_wdat(dis2[i]); // 显示字符" "
//lcd_wdat(ask[xianshi[i]]);
delay(30);
i++;
}
‘叁’ 单片机LCD左移显示字符显示不全
#include<reg52.h>
unsigned char code s[]={"Hello everyone! Welcome to Beijing"}; //显示字符
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
void delay(int i)//延时函数
{
while(i--);
}
void w_command(unsigned char w) //写入指令
{
rs=0;
rw=0;
P3=w;
e=1;
delay(3000);
e=0;
}
void init_lcd() //1602液晶初始化设定
{
w_command(0x38);// 16*2显示,5*7点阵,8位数据接口
w_command(0x0c);// 开显示,关光标,不闪烁
w_command(0x06);// 指针加1,显示不移动
w_command(0x01);// 清屏
}
void w_data(unsigned char num)//写入字符显示
{
rs=1;
rw=0;
P3=num;
e=1;
delay(3000);
e=0;
}
void main()
{
int i;
init_lcd();
while(1)
{
w_command(0x80);
i=0;
while(s[i]!='\0')
{
w_data(s[i]);
delay(6000);
w_command(0x1c);
i++;
if(i==16)w_command(0xc0);
}
}
}
‘肆’ 用单片机如何调整液晶的显示位置
先写显示地址,在写显示数据0x80是第一行第一位,0xC0是第二行第一位
0x80加n就在第n位显示了,1602液晶n<16