PIC单片机实现LCD1602滚动显示字符串

发布者:JoyfulSerenade最新更新时间:2020-01-23 来源: eefocus关键字:PIC单片机  LCD1602  滚动显示  字符串 手机看文章 扫描二维码
随时随地手机看文章

初始学习单片机,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个字符或者碰到''结束

    for(i=0;i<16 && str[i]!='';i++)

        Write_LCD_Data(str[i]);                //循环写入字符,地址自动增加

}

 

//----------------------------------------------------------------

//滚动显示字符串

//----------------------------------------------------------------

void LCD_ScrolShow(INT8U r,INT8U c,char *str)

{

    char tmp[]="                ";            //定义空字符串

    char tmp1[]="                ";

    INT8U k=0;

    INT8U len=strlen(str)-1;                  //字符总长度

    

//  循环显示

    do

    {

        LCD_ShowString(r,c,tmp);

        CopyString(tmp,str,k++);

        __delay_ms(500);

    }while(len--);

    

    //全部显示完后再显示16个空格,实现滚动

    for(k=0;k<16;k++)

    {

        CopyString(tmp,tmp1,k);

        LCD_ShowString(r,c,tmp);

        __delay_ms(500);

    }

}

 

//-----------------------------------------------------------------

//拷贝字符串来实现滚动 ds目标字符串,ss源字符串,c每次拷贝一个

//-----------------------------------------------------------------

void CopyString(char *ds,char *ss,INT8U c)

{

    INT8U i;

    

    for(i=0;i<16;i++)

    {

        ds[i]=ds[i+1];          //字符依次向前进一个

    }

   

    ds[i-1]=ss[c];             //加入新字符 

    ds[i]='';

}

LCD1602.h 


/* 

 * File:   LCD1602.h

 * Author: 5510

 *

 * Created on 2019年7月16日, 下午10:29

 */

 

#ifndef LCD1602_H

#define LCD1602_H

 

#ifdef __cplusplus

extern "C" {

#endif

 

#ifdef __cplusplus

}

#endif

 

#endif /* LCD1602_H */

 

#define INT8U unsigned char

#define INT16U unsigned char

#define _XTAL_FREQ 4000000UL            //定义晶振为4M

 

#define LCD_CLS           0x01          //清屏

#define LCD_HOME          0x02          //光标移到左上角

#define LCD_SETMODE       0x04

#define LCD_SETVISIBLE    0x08

#define LCD_SHIFT         0x10

#define LCD_SETFUNCTION   0x20

#define LCD_SETCGADDR     0x40

#define LCD_SETDDADDR     0x80

 

//仿真用端口定义

#define PORT_LCD_DAT      PORTB

#define PORT_LCD_CTL      PORTD

#define TRIS_LCD_DAT      TRISB

#define TRIS_LCD_CTL      TRISD

 

#define RS    RD0

#define RW    RD1

#define E     RD2

 

//开发板端口定义

//#define PORT_LCD_DAT      PORTD

//#define PORT_LCD_CTL      PORTB

//#define TRIS_LCD_DAT      TRISD

//#define TRIS_LCD_CTL      TRISB

//

//#define RS    RB5

//#define RW    RB4

//#define E     RB3

 

void LCD_Initialize();

void LCD_BUSY_WAIT();

void Write_LCD_Command(INT8U data);

void Write_LCD_Data(INT8U data);

void LCD_ShowString(INT8U r,INT8U c,char *str);

void LCD_ScrolShow(INT8U r,INT8U c,char *str);

void CopyString(char *ds,char *ss,INT8U c);

main.c 


/* 

 * 文件:   main.c

 * 编写:   金伟

 * 用途:   LCD1602测试程序

 * 时间:   2019年7月16日, 下午10:56

 */

 

// PIC16LF877A Configuration Bit Settings

 

// 'C' source line config statements

 

// CONFIG

#pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator)

#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)

#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)

#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)

#pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)

#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)

#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)

#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

 

// #pragma config statements should precede project file includes.

// Use project enums instead of #define for ON and OFF.

 

#include

#include "LCD1602.h"

 

//显示的字符串

const char demo[]="----LCD DEMO----";            

const char tel[]="Welcome To PIC World  TEL:18627238500";

const char tel1[]="apple inc";

const char tel2[]="HUAWEI P10";

 

void main()

{

    LCD_Initialize();

    LCD_ShowString(0,0,demo);

    

//    LCD_ShowString(0,0,(char*)"----LCD DEMO----");

    

    while(1)

    {

        LCD_ScrolShow(1,0,tel);

        LCD_ScrolShow(1,0,tel1);

        LCD_ScrolShow(1,0,tel2);

    }

}

关键字:PIC单片机  LCD1602  滚动显示  字符串 引用地址:PIC单片机实现LCD1602滚动显示字符串

上一篇:PIC单片机学习2
下一篇:PIC单片机之关于超大数组问题

推荐阅读最新更新时间:2024-11-10 18:45

PIC单片机CCP模块
CCP是Capture(捕捉)、Compare(比较)、PWM(脉宽调制)缩写。
[单片机]
<font color='red'>PIC单片机</font>CCP模块
大神对PIC单片机的简单入门时如何讲解的
这个8条腿的小螃蟹就是我们的第一顿饭,只要把它吃下去,以后的大餐就好办了。 第1、8条腿接电源 +5V 和 地线。头两条腿是螃蟹钳子,好吃的很。 现在剩下了 6 条腿 第2、3条腿 使用时外接一个晶振的东西 我们接一个 4 MHz的。 第4条腿是复位脚,是一个信号输入脚。单片机正常运行时接高电平。当有一个低电平脉冲输入到这个脚时单片机就复位。所谓复位就是单片机内部所有的工作部件统统回到规定的状态,程序也复位到头一句上开始逐条运行。例如,你设计的一个报警锁定的 LED红灯亮后,当需要解除报警时,用一个按钮给这个脚瞬时接地一下,相当于给它一个夫脉冲,系统就复位了,led灯就熄灭了,程序从头开始。 以上5个脚,几乎所有单片机
[单片机]
大神对<font color='red'>PIC单片机</font>的简单入门时如何讲解的
减少空间提高效率:PIC单片机A/D转换数据打包
  PIC 单片机A/D 转换后的数据通常需要占用两个8 位宽的RAM 单元, 而PIC 单片机的存储单元有限,因此造成了单片机的存储单元不能被有效利用, 同时通过串口向上位机传送数据时也需要花费较多的时间。   为此提出一种数据打包的方法, 使得相同的数据量占用较少的存储空间, 并可提高传输效率。   引言   在由单片机和PC 机构成的检测系统中, 通常会由多个单片机采集数据并将经过A/D 转换的数据通过串口送往上位PC 机进行数据处理。PIC 单片机A/D 转换后的结果大多是8 位或10 位的, 8 位的A/D转换不涉及该问题。以10 位的数据为例, 在单片机内进行存储时需要占用2 个8 位的字节, 低8 位和高2位分
[单片机]
PIC单片机开发的一些经验和技巧解析
PIC单片机在国内日益流行,本文介绍MicroChipPIC系列单片机开发过程中软、硬件设计的一些经验、技巧。 由美国Microchip公司生产的PIC系列单片机,由于其超小型、低功耗、低成本、多品种等特点,已广泛应用于工业控制、仪器、仪表、通信、家电、玩具等领域,本文总结了作者在PIC单片机开发过程中的一些经验、技巧,供同行参考。 1 怎样进一步降低功耗 功耗,在电池供电的仪器仪表中是一个重要的考虑因素。PIC16C××系列单片机本身的功耗较低(在5V,4MHz振荡频率时工作电流小于2mA)。为进一步降低功耗,在保证满足工作要求的前提下,可采用降低工作频率的方法,工作频率的下降可大大降低功耗(如PIC16C××在3V,3
[单片机]
<font color='red'>PIC单片机</font>开发的一些经验和技巧解析
PIC单片机模拟开关程序
程序介绍:简单的按键按下,相应的灯亮,按键弹起,灯灭。只有一个按键哦,相应的也只是一个灯亮。 #define MX_PIC //Defines for microcontroller #define P16F690 #define MX_EE #define MX_EE_SIZE 256 #define MX_SPI #define MX_SPI_BCB #define MX_SPI_SDI 4 #define MX_SPI_SDO 7 #define MX_SPI_SCK 6 #define MX_UART #define MX_UART_B #define MX_UART_TX 7 #define MX_UART_RX
[单片机]
<font color='red'>PIC单片机</font>模拟开关程序
PIC16F877A+18B10温度测量+LCD1602显示温度
;18B10温度测量+ LCD 1602显示温度 ;实战目的 ;1、学习18B20单总线温度 传感器 的使用。 ;2、学习LCD的使用。 ;3、学习10进制转10进制的方法。 ;所有资源: ;1、TMRO定时器。产生温度转换所需要的延时时间。 ;2、PORTA口。即做LCD显示时可控制端口,RA2同时做18B20的数据接口 ;3、PORTC口。做LCD显示时的数据口。 ;功能说明 ;1、通过18B20采集当前环境 ;最高温度可显示127.9375,最低温度可显示0.0625(无负温度处理部分) ;2、将温度在LCD上显示(3位整数,4位小数) ;硬件连接 ;1,在18B20按DEMO板上的标识插在插座U8上 ;2,拨码开关S13第
[单片机]
STM32F302 驱动 LCD1602
平台:stm32f302, 屏幕: LCD1602 1 #ifndef __LCD1602_H__ 2 #define __LCD1602_H__ 3 #include stm32f30x.h 4 void lcd1602_init(void); 5 void lcd1602_display(u8*string); 6 void lcd1602_display_pos(int row,int column, u8*string); 7 #endif 1 #include LCD1602.h 2 3 #define L_SHIFT 0X0 4 #define R_SHIFT 0X1 5 6 #d
[单片机]
Proteus仿真51单片机C语言-单片机向主机发送字符串
简介:单片机向主机发送字符串:单片机按一定的时间间隔向主机发送字符串,发送内容在虚拟终端显示。
[单片机]
Proteus仿真51单片机C语言-单片机向主机发送<font color='red'>字符串</font>
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved