资源简介
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
相关资源
- DSP2812的LCD1602显示程序
- STC12C5A60S2内部AD+LCD1602显示
- msp430f149单路AD采样电压值并在lcd1602上
- AT89C52扩展外部双口RAM(IDT7132)
- AT89C52单片机开发板完整Proteus仿真图
- LCD1602封装LCD1602封装
- LCD1602最好最详细的中文资料带字库
- NRF24l01收发程序带LCD1602液晶及串口通
- LCD1602液晶完整中文资料
- 单片机和LCD1602实现的简易计算器
- 基于89c51的等精度频率计lcd1602显示
- 51+bmp180+lcd1602+proteus.zip
- keil程序stc89c52/51rc读取rfid rc522射频卡
- 5Kg电子秤程序LCD1602显示
- 51单片机的步进电机控制,lcd1602显示
- STC89c52驱动
- LCD1602显示实时温度代码
- C51单片机密码锁4×4矩阵键盘+LCD1602液
- 基于adc0832的数字电压表
- lcd1602显示时分秒
- 基于AT89C52单片机的步进电机控制系统
- STC89C52RC使用电位器控制WS2812B调光
- 51单片机 lcd1602测试C程序
- 基于LCD1602读取DS18B20序列号proteus仿真
- 基于LCD1602与LED同时的proteus仿真温度测
- 基于cyclone II驱动LCD1602的电子时钟设计
- stc89c52蜂鸣器音乐栀子花开
- LCD1602液晶显示函数
- Stc89C52 超声波测距 并且 1602显示
- Proteus仿真AT89C52——计数
评论
共有 条评论