51单片机 1602显示程序 C语言

51单片机 1602显示程序 C语言
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(); //闪动二次

}

}

相关主题
相关文档
最新文档