标题:
在学单片机LCD1602整屏移动时遇到问题,显示的与预期不符
[打印本页]
作者:
机械嗷嗷嗷
时间:
2021-10-3 21:48
标题:
在学单片机LCD1602整屏移动时遇到问题,显示的与预期不符
为什么本来应该显示在第二行的句子显示到了第一行,而且本来应该显示16格结果只显示了8格?
51hei图片20211003214102.jpg
(3.16 MB, 下载次数: 47)
下载附件
2021-10-3 21:41 上传
单片机源程序如下:
#include "reg52.h"
#define LCD_DB P0
sbit LCD_EN = P2^7;
sbit LCD_RS = P2^6;
sbit LCD_RW = P2^5;
unsigned char T0RH = 0;
unsigned char T0RL = 0;
bit flag500ms = 0;
unsigned char code str1[] = "Hello CuiWencan";
unsigned char code str2[] = "I am your srevant";
void InitLCD();
void WaitReady();
void ConfigTimer(unsigned int ms);
void WriteCmd(unsigned char cmd);
void WriteDat(unsigned char dat);
void SetCursor(unsigned char x,unsigned char y);
void ShowStr(unsigned char x,unsigned char y,unsigned char *str,unsigned char len);
void main()
{
unsigned char i;
unsigned char index1 = 0;
unsigned char index2 = 0;
unsigned char j = 0;
unsigned char k = 0;
unsigned char pdata bufMove1[16+sizeof(str1)+16];
unsigned char pdata bufMove2[16+sizeof(str2)+16];
EA = 1;
ConfigTimer(10);
InitLCD();
for(i = 0;i < 16;i++)
{
bufMove1[i] = ' ';
bufMove2[i] = ' ';
}
for(j = 0;j<(sizeof(str1)-1);j++)
bufMove1[16+j] = str1[j];
for(k = 0;k<(sizeof(str2)-1);k++)
bufMove2[16+k] = str2[k];
for(i = (16+sizeof(str1)-1);i<sizeof(bufMove1);i++)
bufMove1[i] = ' ';
for(i = (16+sizeof(str2)-1);i<sizeof(bufMove2);i++)
bufMove2[i] = ' ';
while(1)
{
if(flag500ms)
{
flag500ms = 0;
ShowStr(0,0,bufMove1+index1,16);
ShowStr(0,1,bufMove2+index2,16);
index1++;
index2++;
if(index1 >= (16+sizeof(str1)-1))
{
index1 = 0;
}
if(index2 >= (16+sizeof(str2)-1))
{
index2 = 0;
}
}
}
}
void ConfigTimer(unsigned int ms)
{
unsigned int tmq;
EA = 1;
TMOD &= 0xf0;
TMOD |= 0x01;
tmq = (ms*(11059200/12))/1000;
tmq = 65536 - tmq;
T0RH = (unsigned char)(tmq>>8);
T0RL = (unsigned char)(tmq);
TH0 = T0RH;
TL0 = T0RL;
ET0 = 1;
TR0 = 1;
}
void WaitReady()
{
unsigned char sta;
LCD_DB = 0xFF;
LCD_RS = 0;
LCD_RW = 1;
do
{
LCD_EN = 1;
sta = LCD_DB;
LCD_EN = 0;
}while(sta & 0x80);
}
void WriteCmd(unsigned char cmd)
{
WaitReady();
LCD_RS = 0;
LCD_RW = 0;
LCD_DB = cmd;
LCD_EN = 1;
LCD_EN = 0;
}
void WriteDat(unsigned char dat)
{
WaitReady();
LCD_RS = 1;
LCD_RW = 0;
LCD_DB = dat;
LCD_EN = 1;
LCD_EN = 0;
}
void SetCursor(unsigned char x,unsigned char y)
{
unsigned char addr;
if(y == 0)
addr = 0x00 + x;
else
addr = 0x40 + x;
WriteCmd(addr | 0xf0);
}
void ShowStr(unsigned char x,unsigned char y,unsigned char *str,unsigned char len)
{
SetCursor(x,y);
while(len--)
{
WriteDat(*str++);
}
}
void InitLCD()
{
WriteCmd(0x38); //16*2 显示,5*7 点阵,8 位数据接口
WriteCmd(0x0C); //显示器开,光标关闭
WriteCmd(0x06); //文字不动,地址自动+1
WriteCmd(0x01); //清屏
}
void InterruptTimer0() interrupt 1
{
static unsigned char tmr500ms = 0;
TH0 = T0RH; //重新加载重载值
TL0 = T0RL;
tmr500ms++;
if (tmr500ms >= 50)
{
tmr500ms = 0;
flag500ms = 1;
}
}
复制代码
作者:
chenyinhu
时间:
2021-10-9 17:16
把所有的16+sizeof(str1)+16改成8+试试呢
作者:
chenyinhu
时间:
2021-10-9 17:17
for(i = 0;i < 16;i++)
{
bufMove1[i] = ' ';
bufMove2[i] = ' ';
}这部分也去掉,估计是位置已经超了
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1