资源简介
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\ob
文件 2012 2018-03-17 11:32 LCD1602\ob
文件 6376 2009-05-07 14:37 LCD1602\STARTUP.A51
相关资源
- [免费]msp430f149控制PS2键盘并用1602显示
- vhdl与lcd1602实现的多控制电子钟
- ADC0809数字电压表 LCD1602显示 汇编程序
- 数字电压表(源程序 protues仿真)
- EESkill NRF24L01 无线模块用户手册
- 基于STC89C52的瓦斯检测及红外控制系统
- 基于51单片机的智能十字路口交通灯系
- LCD1602显示程序
- RC522读写MI卡程序,STC89C52RC调试通过,
- STC89C52+LCD12864+18B20+1302万年历
- 第四章 畅学多功能实验箱液晶资源详
- 单片机89c52与MLX90614红外的测温程序
- proteus仿真、keil4、DHT11、LCD1602
- [Altium_Designer]_STC89C52单片机最小系统原
- 51单片机控制步进电机软硬件实现
- DS18B20温度+DHT11湿度+LCD1602
- 基于STC89C52的GSM智能家居报警系统
- 基于STC89C52单片机的数字时钟
- 基于STC89C52单片机空气PM2.5系统设计资
- 基于FPGA的LCD1602实时显示DS18b20温度
- STM32+ZE08-CH2O甲醛传感器+LCD1602显示.r
- 基于51单片机的电机转速监测
- FPGA VGA lcd1602 显示时钟 闹钟 按键控制
- STM32f103电压采样并用LCD1602显示
- STC89C52中文资料
- 基于STC89C52单片机智能温控风扇设计资
- STM32CubeMX+LCD1602 + PCF8574AT
- 内含RC522与51单片机硬件设计与程序,
- 单片机89c52rc最小系统电路图资料
- 基于STC89C52和DS18B20的温控系统
评论
共有 条评论