初始学习单片机,LCD1602的滚动只能实现2行同时移动,就改了哈,写了个滚动的程序。在测试的时候发现了一个问题,在学习板上能正常运行的代码放到Proteus上问题出错,不能正常显示,最后在网上搜索原因时发现可能是Proteus仿真时对端口有要求,最后将商品修改到PORTB和PORTD就正常了。
这是显示效果https://v.youku.com/v_show/id_XNDI5MDEwOTg4NA==.html?spm=a2h3j.8428770.3416059.1
LCD1602.c
//---------------------------------------------------------------
//LCD1602液晶控制与显示程序
//---------------------------------------------------------------
#include #include #include #include "LCD1602.h" //--------------------------------------------------------------- //LCD忙等待 //--------------------------------------------------------------- void LCD_BUSY_WAIT() { INT8U status; TRIS_LCD_DAT=0xFF; //将端口设为输入 RS=0;RW=1; //读寄存器状态 do { E=1;NOP();status=PORT_LCD_DAT;E=0; //读取忙信号 }while(status & 0x80); //如果为0x80就是忙,继续进入循环 } //---------------------------------------------------------------- //写LCD命令 //---------------------------------------------------------------- void Write_LCD_Command(INT8U cmd) { TRIS_LCD_DAT=0x00; //LCD数据端口设为输出 PORT_LCD_DAT=cmd; //发送命令 PORT_LCD_CTL=TRIS_LCD_CTL=0x00; //控制端口设为输出,初值为0x00 RS=0;RW=0;E=1;NOP();E=0; //写命令 LCD_BUSY_WAIT(); //LCD忙等待 } //---------------------------------------------------------------- //写LCD数据寄存器 //---------------------------------------------------------------- void Write_LCD_Data(INT8U dat) { TRIS_LCD_DAT=0x00; //LCD数据端口设为输出 PORT_LCD_DAT=dat; //发送数据 RS=1;RW=0;E=1;NOP();E=0; //写数据 LCD_BUSY_WAIT(); //LCD忙等待 } //---------------------------------------------------------------- //LCD初始化 //---------------------------------------------------------------- void LCD_Initialize() { Write_LCD_Command(0x38);__delay_ms(2); //置功能,8位,双行,5*7 Write_LCD_Command(0x01);__delay_ms(2); //清屏 Write_LCD_Command(0x06);__delay_ms(2); //字符进入模式:屏幕不动,字符后移 Write_LCD_Command(0x0c);__delay_ms(2); //显示开,关光标 } //---------------------------------------------------------------- //在r行(0-1) C列(0-15)显示字符串 //---------------------------------------------------------------- void LCD_ShowString(INT8U r,INT8U c,char *str) { INT8U i=0; //设置字符地址,第一行首地址为0x80,第二行首地址为0xc0 if(r==0) Write_LCD_Command(0x80 | c);else if(r==1) Write_LCD_Command(0xc0 | c); //从字符串的第一个字符车起,如果大于16个字符或者碰到'