完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
/******************************************************** *********************************************** 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); } |
|
相关推荐
3个回答
|
|
滚动字符你就操作坐标就行了啊,你把整个字符串的坐标逐步增加或者减小就是了
|
|
|
|
|
|
这个可以对1602进行配置的吧,滚动显示模式,我记得是有的,你看看。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-使用AHT20进行环境监测之AHT20传感器介绍
828 浏览 0 评论
824 浏览 0 评论
861 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
836 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
1292 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11821 浏览 31 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-29 09:18 , Processed in 0.951727 second(s), Total 79, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号