51单片机 1602显示程序 C语言
/****************************************************************************** **
* 描述: LCD1602 滚动显示*
* 显示方式:* * 1、从左到右逐字显示,闪动二次,清屏。* * 2、再从右到左逐字显示,闪动二次,清屏。* * 3、周期性地重复上述显示方式。* ******************************************************************************* */
#include
#include
typedef unsigned char BYTE;
typedef bit BOOL;
sbit LCD_RS = P2^6;
sbit LCD_RW = P2^5;
sbit LCD_EP = P2^7;
BYTE code dis1[] = {" WELCOME TO "};
BYTE code dis2[] = {" https://www.360docs.net/doc/6313994160.html, "};
BYTE code dis3[] = {" OT EMOCLEW "};
BYTE code dis4[] = {" MOC.NIHCERP.WWW "};
delay(int ms)
{ // 延时子程序
int i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
BOOL lcd_bz()
{ // 测试LCD忙碌状态
BOOL result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EP = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (BOOL)(P0 & 0x80);
LCD_EP = 0;
return result;
}
lcd_wcmd(BYTE cmd)
{ // 写入指令数据到LCD while(lcd_bz());
LCD_RS = 0;
LCD_RW = 0;
LCD_EP = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 0;
}
lcd_pos(BYTE pos)
{ //设定显示位置
lcd_wcmd(pos | 0x80);
}
lcd_wdat(BYTE dat)
{ //写入字符显示数据到LCD while(lcd_bz());
LCD_RS = 1;
LCD_RW = 0;
LCD_EP = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 0;
}
lcd_init()
{ //LCD初始化设定
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
delay(1);
lcd_wcmd(0x0c); //显示开,关光标
delay(1);
lcd_wcmd(0x06); //移动光标
delay(1);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(1);
}
main()
{
BYTE i;
lcd_init(); // 初始化LCD
delay(10);
while(1)
{
lcd_wcmd(0x06); //向右移动光标
lcd_pos(0); //设置显示位置为第一行的第1个字符
i = 0;
while(dis1[ i ] != '\0')
{ //显示字符"WLCOME TO"
lcd_wdat(dis1[ i ]);
i++;
delay(30); //控制两字之间显示速度
}
lcd_pos(0x40); //设置显示位置为第二行第1个字符
i = 0;
while(dis2[ i ] != '\0')
{
lcd_wdat(dis2[ i ]); //显示字符" https://www.360docs.net/doc/6313994160.html, "
i++;
delay(30); //控制两字之间显示速度
}
delay(800); //控制停留时间
lcd_wcmd(0x01); //清除LCD的显示内容
delay(1);
lcd_wcmd(0x04); //向左移动光标
lcd_pos(15); //设置显示位置为第一行的第16个字符
i = 0;
while(dis3[ i ] != '\0')
{ //显示字符"WLCOME TO"
lcd_wdat(dis3[ i ]);
i++;
delay(30); //控制两字之间显示速度
}
lcd_pos(0x4F); //设置显示位置为第二行的第16个字符
i = 0;
while(dis4[ i ] != '\0')
{
lcd_wdat(dis4[ i ]); //显示字符" https://www.360docs.net/doc/6313994160.html, "
i++;
delay(30); //控制两字之间显示速度
}
delay(800); //控制停留时间
lcd_wcmd(0x01); //清除LCD的显示内容
delay(200); //控制两屏转换时间
}
}
/****************************************************************************** *
* 描述: *
* 1602字符型LCD显示演示程序*
* 在第一行显示welcome
*
* 在第二行显示https://www.360docs.net/doc/6313994160.html, *
*
*
******************************************************************************* */
#include
#include
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ;
sbit rs = P2^6; //
sbit rw = P2^5;
sbit ep = P2^7;
BYTE code dis1[] = {"welcome!"};
BYTE code dis2[] = {"https://www.360docs.net/doc/6313994160.html,"};
delay(BYTE ms)
{ // 延时子程序
BYTE i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
BOOL lcd_bz()
{ // 测试LCD忙碌状态
BOOL result;
rs = 0;
rw = 1;
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (BOOL)(P0 & 0x80);
ep = 0;
return result;
}
lcd_wcmd(BYTE cmd)
{ // 写入指令数据到LCD while(lcd_bz());
rs = 0;
rw = 0;
ep = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
lcd_pos(BYTE pos)
{ //设定显示位置
lcd_wcmd(pos | 0x80);
}
lcd_wdat(BYTE dat)
{ //写入字符显示数据到LCD while(lcd_bz());
rs = 1;
rw = 0;
ep = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
lcd_init()
{ //LCD初始化设定
lcd_wcmd(0x38); //
delay(1);
lcd_wcmd(0x0c); //
delay(1);
lcd_wcmd(0x06); //
delay(1);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(1);
}
main()
{
BYTE i;
lcd_init(); // 初始化LCD
delay(10);
lcd_pos(4); // 设置显示位置为第一行的第5个字符
i = 0;
while(dis1[i] != '\0')
{ // 显示字符"welcome!"
lcd_wdat(dis1[i]);
i++;
}
lcd_pos(0x41); // 设置显示位置为第二行第二个字符
i = 0;
while(dis2[i] != '\0')
{
lcd_wdat(dis2[i]); // 显示字符" https://www.360docs.net/doc/6313994160.html, "
i++;
}
while(1); //
}
/****************************************************************************** **
* 描述: LCD1602 移动显示*
* 显示方式:* * 1、LCD第一行显示:BIG BIG WORLD *
* LCD第二行显示:I LOVE PUZHONG *
* 2、先将两行字符写入DDRAM中,然后从右至左逐字移出显示。*
* 3、在指定位置停留1.6秒后,闪烁2次,清屏。* * 4、反复循环上述显示方式。* ******************************************************************************* */
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit LCD_RS = P2^6;
sbit LCD_RW = P2^5;
sbit LCD_EN = P2^7;
uchar code dis1[] = {"BIG BIG WORLD"};
uchar code dis2[] = {"I LOVE PUZHONG"};
/*******************************************************************/
/*
/* 延时子程序
/*
/*******************************************************************/
void delay(int ms)
{
int i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*******************************************************************/ /*
/*检查LCD忙状态
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。
/*
/*******************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (bit)(P0&0x80);
LCD_EN = 0;
return result;
}
/*******************************************************************/ /*
/*写指令数据到LCD
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
/*
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN = 0;
}
/*******************************************************************/ /*
/*写显示数据到LCD
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。
/*
/*******************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN = 0;
}
/*******************************************************************/ /*
/* 设定显示位置
/*
/*******************************************************************/
void lcd_pos(uchar pos)
{
lcd_wcmd(pos|0x80); //数据指针=80+地址变量
}
/*******************************************************************/ /*
/* LCD初始化设定
/*
/*******************************************************************/
void lcd_init()
{
delay(15); //等待LCD电源稳定
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x0c); //显示开,关光标
delay(5);
lcd_wcmd(0x06); //移动光标
delay(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(5);
}
/*******************************************************************/ /*
/* 清屏子程序
/*
/*******************************************************************/
void lcd_clr()
{
lcd_wcmd(0x01); //清除LCD的显示内容
delay(5);
}
/*******************************************************************/ /*
/* 闪动子程序
/*
/*******************************************************************/
void flash()
{
delay(600); //控制停留时间
lcd_wcmd(0x08); //关闭显示
delay(200); //延时
lcd_wcmd(0x0c); //开显示
delay(200);
lcd_wcmd(0x08); //关闭显示
delay(200); //延时
lcd_wcmd(0x0c); //开显示
delay(200);
}
/*******************************************************************/ /*
/* 主程序
/*
/*******************************************************************/
main()
{
uchar i,j;
delay(10);
lcd_init(); //初始化LCD
while(1)
{
lcd_clr();
lcd_pos(0x10); //设置显示位置为第一行第17列
i = 0;
while(dis1[i] != '\0')
{ //显示字符" "
lcd_wdat(dis1[i]);
i++;
}
lcd_pos(0x50); //设置显示位置为第二行第17列
i = 0;
while(dis2[i] != '\0')
{
lcd_wdat(dis2[i]); //显示字符" "
i++;
}
for(j=0;j<16;j++) //向左移动16格
{
lcd_wcmd(0x18); //字符同时左移一格
delay(100); //控制移动时间
}
flash(); //闪动二次
}
}