• 大小: 23KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-26
  • 语言: 其他
  • 标签: LCD1602  89C52  

资源简介

89C52单片机通过LCD1602显示任意长度字符串,如果需要显示的字符串长度超过16个字符,则字符串会从LCD右边往左边移动,直到显示完全。

资源截图

代码片段和文件信息

/*-----------------------------------------------
  名称:LCD1602
  内容:通过标准程序移屏滚动显示字符
  引脚定义如下:
1-VSS 2-VDD
3-V0
4-RS
5-R/W
6-E
7-14
DB0-DB7
15-BLA
16-BLK
------------------------------------------------*/
#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include
#include

sbit rs = P2 ^ 0;
sbit rw = P2 ^ 1;
sbit en = P2 ^ 2;
#define LCD_DAT P1    /* 数据口 */
#define LINE_MAX_NUM 16 /* 每行最多显示16字符 */

#define uchar unsigned char
//uchar code table[]={}

void delus(uchar t)
{
while(--t);
}
void delms(uchar t)
{
while(t--)
{
delus(245);
delus(245);
}
}
void lcd_write_com(uchar com)
{
delms(5);
rs = 0;
rw = 0;
en = 1;
LCD_DAT = com;
_nop_();
en = 0;
}
void lcd_write_dat(uchar dat)
{
delms(5);
rs = 1;
rw = 0;
en = 1;
LCD_DAT = dat;
_nop_();
en = 0;
}
void lcd_clear()
{
lcd_write_com(0x01);
delms(5);
}
void lcd_write_char(uchar x uchar y uchar dat)
{
if(y == 0)
lcd_write_com(0x80 + x);
else
lcd_write_com(0xc0 + x);
lcd_write_dat(dat);
}

void lcd_write_string(uchar x uchar y uchar *s)
{
int pos = 0/* 当前读取的字符在字符串中的位置 */ start = x/* 字符串在液晶屏中开始显示的位置 */ back = 0/* 字符串移出屏幕的长度 */ len = 0/* 字符串长度 */ i = 0;

uchar *tmps = s *tmpchar = s;
len = strlen(s);
if(y == 0)
lcd_write_com(0x80 + x);
else
lcd_write_com(0xc0 + x);

while(pos < len)
{
if(pos < LINE_MAX_NUM - start) //如果字符串第一个字符到字符串当前下标的长度小于lcd可显示的范围就直接显示到屏幕上
{

lcd_write_dat(*s);
s++;

}//超出可显示的范围之后,整个字符串向右移动,则第一个字符从从边移出屏幕
else
{

if(start > 0)//如果字符串显示的初始位置不是液晶屏的第一个字符的位置,这种情况下第一个字符就不需要移出屏幕,而是向左移动一位
{
start--;//液晶屏起始位置左移一位

//设置起始位置
if(y == 0)
{
lcd_write_com(0x80 + start);
}
else
{
lcd_write_com(0xc0 + start);
}
//直接写进去
s = tmps;
i = 0;//决定显示多少个字符,太多了造成液晶屏溢出,显示有问题一般往显示屏写入16+10个字符的话会有问题。
while(i < LINE_MAX_NUM - start && *s)
{
lcd_write_dat(*s);
s++;//字符串指针移到下一位
i++;
}

}
else
{
back++;//大循环每循环一次就加1字符串位置右移一位
if(y == 0)
{
lcd_write_com(0x80);
}
else
{
lcd_write_com(0xc0);
}
s = tmps;
s = s + back;//决定字符串从哪开始显示
i = 0;
while(i < LINE_MAX_NUM && *s)
{
lcd_write_dat(*s);
i++;
s++;//字符串指针移到下一位
}
}
delms(500);

}
pos++;

}



}
void lcd_init()
{
lcd_write_com(0x38);
delms(5);
lcd_write_com(0x38);
delms(5);
lcd_write_com(0x08);
lcd_write_com(0x01);
lcd_write_com(0x06);


delms(5);
lcd_write_com(0x0c);
}
void main()
{

uchar i;
P0 = 0;
P1 = 0;
lcd_init();
lcd_clear();

while(1)
{
lcd_clear();
lcd_write_string(6 0 “123456789abcdefghijklmnopq9s123456789“);
// lcd_write_string(0 0 “123456789abcdefghi“);
//lcd_write_string(6 0 “12345“);

for(i = 9; i > 0; i--)
{
lcd_write_string(i 15 “123456 “);
delms(500);
}
//lcd_

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2018-03-17 11:32  LCD1602\
     文件       71165  2018-03-16 22:23  LCD1602\lcd1602.uvgui.Administrator
     文件        5541  2018-03-13 23:09  LCD1602\lcd1602.uvopt
     文件       14141  2018-03-13 23:09  LCD1602\lcd1602.uvproj
     目录           0  2018-03-17 11:32  LCD1602\Listings\
     文件       13154  2018-03-17 11:32  LCD1602\Listings\lcd1602.m51
     文件        8025  2018-03-17 11:32  LCD1602\Listings\main.lst
     文件       14164  2018-03-17 11:32  LCD1602\Listings\STARTUP.lst
     文件        3741  2018-03-17 11:32  LCD1602\main.c
     目录           0  2018-03-17 11:32  LCD1602\objects\
     文件        2012  2018-03-17 11:32  LCD1602\objects\lcd1602.hex
     文件        6376  2009-05-07 14:37  LCD1602\STARTUP.A51

评论

共有 条评论