stc89c52,lcd1602c语言滚动显示字符
1个回答
2016-04-28 · 百度知道合伙人官方认证企业
兄弟连教育
兄弟连教育成立于2006年,11年来专注IT职业教育,是国内专业的IT技术培训学校。2016年成功挂牌新三板(股票代码:839467)市值过亿。开设专注程序员培训专注php、Java、UI、云计算、Python、HTML5、
向TA提问
关注
展开全部
/********************************************************
***********************************************
LCD1602液晶显示实验
说明: 用杜邦线: 1.将P0口与LCD的D0-D7连接起来
2.将P2.0 接到
P2.1 P2.2 分别与RS WR E分别连接
********************************************************/
#include"AT89S52.H"
#define uchar unsigned char
#define uint unsigned int
#define LCD_DATA P2 //定义LCD的D0-D7所在端口
#define LCD_EN P1_4
#define LCD_RW P1_5 //LCD读写控制引脚
#define LCD_RS P1_6 //LCD指令或数据选择引脚
void nus_delay(uint nus);
void nms_delay(uint nms);
void mcu_io_init(void);
void lcd_init(void);
void LCD_en_write(void);
void wait_LCD_Ready(void);
void set_LCD_xy(uchar x, uchar y );
void LCD_write_onechar(uchar COMM,uchar DAT);
void LCD_write_string(uchar X,uchar Y,uchar *string);
/****************************************************
函数名称:main
功能描述:主函数
输 入: 无
输 出: 无
*****************************************************/
void main(void)
{
uchar START_DISPLAY1[]={"welcome to wtu"};
uchar START_DISPLAY2[]={" thank you "};
mcu_io_init();
lcd_init();
nms_delay(10);
while(1)
{
LCD_write_string(1,0,START_DISPLAY1);
nms_delay(100);
LCD_write_string(1,1,START_DISPLAY2);
nms_delay(1000);
}
}
/****************************************************
函数名称:mcu_io_init
功能描述:上电CPU IO口初始化
输 入: 无
输 出: 无
*****************************************************/
void mcu_io_init(void)
{
LCD_DATA=0xff;
LCD_EN=1;
LCD_RW=1;
LCD_RS=1;
}
/****************************************************
函数名称:lcd_init
功能描述:LCD初始化
输 入: 无
输 出: 无
说明:注意初始化过程并加上适当延时
后面LCD的显示方式可按实际需要修改
*****************************************************/
void lcd_init(void)
{
nms_delay(15);
LCD_write_onechar(0x38,0);
nms_delay(1);
LCD_write_onechar(0x38,0);
nms_delay(1);
LCD_write_onechar(0x38,0);
nms_delay(1);
LCD_write_onechar(0x38,0);
LCD_write_onechar(0x08,0); /*显示关闭*/
LCD_write_onechar(0x01,0); /*显示清屏*/
LCD_write_onechar(0x06,0); /*显示光标移动设置*/
nms_delay(1);;
LCD_write_onechar(0x0C,0); /*显示开及光标设置*/
}
/****************************************************
函数名称:LCD_en_write
功能描述:EN端产生一个脉冲,写LCD
输 入: 无
输 出: 无
*****************************************************/
void LCD_en_write(void)
{
LCD_EN=1;
nus_delay(150); //E脉冲周期最小150ns
LCD_EN=0;
}
/****************************************************
函数名称:wait_LCD_Ready
功能描述:判断LCD忙标志
输 入: 无
输 出: 无
*****************************************************/
void wait_LCD_Ready(void)
{
uchar temp1;
LCD_DATA=0XFF;
//判断LCD忙标志
//1为忙 0为空闲
LCD_RS=0;
LCD_RW=1; //读
LCD_EN=1;
nus_delay(2);
do
{
temp1=LCD_DATA;
temp1&=0x80;
}while(temp1);
LCD_EN=0;
LCD_RS=1;
}
/****************************************************
函数名称:LCD_write_onechar
功能描述:写一个字节到LCD
输 入: COMM(指令) DAT(显示数据)
输 出: 无
*****************************************************/
void LCD_write_onechar(uchar COMM,uchar DAT)
{
wait_LCD_Ready(); //等待LCD空闲
LCD_RW=0; //写
//写数据
if(COMM==0)
{
LCD_RS=1; //RS高电平向LCD写数据
LCD_DATA=DAT;
}
//写命令
else
{
LCD_RS=0;
LCD_DATA=COMM;
}
LCD_en_write();
nus_delay(2);
LCD_RW=1;
LCD_RS=1;
}
/****************************************************
函数名称:LCD_write_string
功能描述:LCD字符串显示函数
输 入: x/y(X与Y坐标) *string(字符串首地址)
输 出: 无
*****************************************************/
void LCD_write_string(uchar X,uchar Y,uchar *string)
{
set_LCD_xy( X, Y ); //设置LCD显示坐标
while (*string)
{
LCD_write_onechar(0,*string );
string ++; //指向下一显示字符地址
}
}
/****************************************************
函数名称:set_LCD_xy
功能描述:设置显示坐标
输 入: x/y(X与Y坐标)
输 出: 无
说明: LMB1602第一行首地址为0x80
第二行为0xC0
*****************************************************/
void set_LCD_xy(uchar x, uchar y )
{
uchar DIS_address;
if (y == 0)
DIS_address = 0x80 + x; //第一行X列
else
DIS_address = 0xc0 + x;
LCD_write_onechar( DIS_address, 0 ); //第二行X列
}
/****************************************************
函数名称:nus_delay
功能描述:微秒级延时子程序
输 入: 无
输 出: 无
说明:
晶振为11.0592M时
*****************************************************/
void nus_delay(uint nus)
{
int j=10;
while(nus--)
{
while(j--);
j=10;
}
}
/****************************************************
函数名称:nms_delay
功能描述:毫秒级延时子程序
输 入: 无
输 出: 无
说明:
晶振为11.0592M时
*****************************************************/
void nms_delay(uint nms)
{
while(nms--)
nus_delay(300);
}
***********************************************
LCD1602液晶显示实验
说明: 用杜邦线: 1.将P0口与LCD的D0-D7连接起来
2.将P2.0 接到
P2.1 P2.2 分别与RS WR E分别连接
********************************************************/
#include"AT89S52.H"
#define uchar unsigned char
#define uint unsigned int
#define LCD_DATA P2 //定义LCD的D0-D7所在端口
#define LCD_EN P1_4
#define LCD_RW P1_5 //LCD读写控制引脚
#define LCD_RS P1_6 //LCD指令或数据选择引脚
void nus_delay(uint nus);
void nms_delay(uint nms);
void mcu_io_init(void);
void lcd_init(void);
void LCD_en_write(void);
void wait_LCD_Ready(void);
void set_LCD_xy(uchar x, uchar y );
void LCD_write_onechar(uchar COMM,uchar DAT);
void LCD_write_string(uchar X,uchar Y,uchar *string);
/****************************************************
函数名称:main
功能描述:主函数
输 入: 无
输 出: 无
*****************************************************/
void main(void)
{
uchar START_DISPLAY1[]={"welcome to wtu"};
uchar START_DISPLAY2[]={" thank you "};
mcu_io_init();
lcd_init();
nms_delay(10);
while(1)
{
LCD_write_string(1,0,START_DISPLAY1);
nms_delay(100);
LCD_write_string(1,1,START_DISPLAY2);
nms_delay(1000);
}
}
/****************************************************
函数名称:mcu_io_init
功能描述:上电CPU IO口初始化
输 入: 无
输 出: 无
*****************************************************/
void mcu_io_init(void)
{
LCD_DATA=0xff;
LCD_EN=1;
LCD_RW=1;
LCD_RS=1;
}
/****************************************************
函数名称:lcd_init
功能描述:LCD初始化
输 入: 无
输 出: 无
说明:注意初始化过程并加上适当延时
后面LCD的显示方式可按实际需要修改
*****************************************************/
void lcd_init(void)
{
nms_delay(15);
LCD_write_onechar(0x38,0);
nms_delay(1);
LCD_write_onechar(0x38,0);
nms_delay(1);
LCD_write_onechar(0x38,0);
nms_delay(1);
LCD_write_onechar(0x38,0);
LCD_write_onechar(0x08,0); /*显示关闭*/
LCD_write_onechar(0x01,0); /*显示清屏*/
LCD_write_onechar(0x06,0); /*显示光标移动设置*/
nms_delay(1);;
LCD_write_onechar(0x0C,0); /*显示开及光标设置*/
}
/****************************************************
函数名称:LCD_en_write
功能描述:EN端产生一个脉冲,写LCD
输 入: 无
输 出: 无
*****************************************************/
void LCD_en_write(void)
{
LCD_EN=1;
nus_delay(150); //E脉冲周期最小150ns
LCD_EN=0;
}
/****************************************************
函数名称:wait_LCD_Ready
功能描述:判断LCD忙标志
输 入: 无
输 出: 无
*****************************************************/
void wait_LCD_Ready(void)
{
uchar temp1;
LCD_DATA=0XFF;
//判断LCD忙标志
//1为忙 0为空闲
LCD_RS=0;
LCD_RW=1; //读
LCD_EN=1;
nus_delay(2);
do
{
temp1=LCD_DATA;
temp1&=0x80;
}while(temp1);
LCD_EN=0;
LCD_RS=1;
}
/****************************************************
函数名称:LCD_write_onechar
功能描述:写一个字节到LCD
输 入: COMM(指令) DAT(显示数据)
输 出: 无
*****************************************************/
void LCD_write_onechar(uchar COMM,uchar DAT)
{
wait_LCD_Ready(); //等待LCD空闲
LCD_RW=0; //写
//写数据
if(COMM==0)
{
LCD_RS=1; //RS高电平向LCD写数据
LCD_DATA=DAT;
}
//写命令
else
{
LCD_RS=0;
LCD_DATA=COMM;
}
LCD_en_write();
nus_delay(2);
LCD_RW=1;
LCD_RS=1;
}
/****************************************************
函数名称:LCD_write_string
功能描述:LCD字符串显示函数
输 入: x/y(X与Y坐标) *string(字符串首地址)
输 出: 无
*****************************************************/
void LCD_write_string(uchar X,uchar Y,uchar *string)
{
set_LCD_xy( X, Y ); //设置LCD显示坐标
while (*string)
{
LCD_write_onechar(0,*string );
string ++; //指向下一显示字符地址
}
}
/****************************************************
函数名称:set_LCD_xy
功能描述:设置显示坐标
输 入: x/y(X与Y坐标)
输 出: 无
说明: LMB1602第一行首地址为0x80
第二行为0xC0
*****************************************************/
void set_LCD_xy(uchar x, uchar y )
{
uchar DIS_address;
if (y == 0)
DIS_address = 0x80 + x; //第一行X列
else
DIS_address = 0xc0 + x;
LCD_write_onechar( DIS_address, 0 ); //第二行X列
}
/****************************************************
函数名称:nus_delay
功能描述:微秒级延时子程序
输 入: 无
输 出: 无
说明:
晶振为11.0592M时
*****************************************************/
void nus_delay(uint nus)
{
int j=10;
while(nus--)
{
while(j--);
j=10;
}
}
/****************************************************
函数名称:nms_delay
功能描述:毫秒级延时子程序
输 入: 无
输 出: 无
说明:
晶振为11.0592M时
*****************************************************/
void nms_delay(uint nms)
{
while(nms--)
nus_delay(300);
}
意法半导体(中国)投资有限公司
2023-06-12 广告
2023-06-12 广告
单片机是一种集成电路芯片。又称单片微控制器,是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。一块芯片就成了一台计算机。特点是体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。
单...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |