嵌入式学习小组
直播中

张超

7年用户 1295经验值
私信 关注

如何去实现在MSP430G2553与LCD1602上的字符滚动设计呢

如何去实现在MSP430G2553与LCD1602上的字符滚动设计呢?其软件程序部分与硬件威廉希尔官方网站 该如何去实现呢?

回帖(1)

高敏兰

2021-12-23 10:29:02
首先,这次实验设计中我们实现的是在LCD1602上进行的字符滚动,用的单片机是MSP430G2553,跑的软件是CCS。是一个非常简单的程序设计,但是我C语言和单片机这部分都学得很差哈哈,放上来给大家参考参考,同时鼓舞一下大家的信心。
软件程序部分
该程序主要由主程序源程序main.c、子程序源程序LCD.c和子程序头文件LCD.h构成。采用这种程序结构,使程序更加清晰,一目了然,减少程序错误的机会,增强了程序的可移植性。在程序设计中MSP430G2553中P1口作为并行数据输出端,P2.0、P2.1、P2.2分别作为LCD1602液晶的RS、RW、E端。
1)主函数main.c

#include
#include "LCD.h"


#define uint unsigned int
#define uchar unsigned char


void main(void)
  {
    WDTCTL = WDTPW | WDTHOLD;
    P1DIR=0xff;
    P2DIR=0xff;
    uchar *table0="Lanzhou         ";
    uchar *table1="University      ";
    while(1)
    {
        Display(table0,table1);
        Delay_1s();
        Cycling(table0,table1);
    }
      }


2)子函数LCD.c

#include
#include"LCD.h"


#define uint unsigned int
#define uchar unsigned char


//延时1ms程序
void Delay_1ms(void)
{
    uchar i,j;
    for(i=0;i<10;i++)
    {
        for(j=0;j<20;j++);
    }
}


//延时1s程序
void Delay_1s(void)
{
    int i,j;
    for(i=0;i<100;i++)
    {
        for(j=0;j<1000;j++);
    }
}


//液晶显示程序
void Display(uchar *table0,uchar *table1)
{
    uchar i,j;//定义计数值
    Reset();//初始化


    Instruction(0x80);//写指令
    for(i=0;i<16;i++)//发送数据第一行
    {
        DataWrite(table0);
    }
    Instruction(0xc0);
    for(j=0;j<16;j++)//发送数据第二行
    {
        DataWrite(table1[j]);
    }
}


//循环显示程序
void Cycling(uchar *table0,uchar *table1)
{
    int m,n;
    //当一次循环完成时,跳回到初始状态
    for (n=0;n<17;n++)
    {
        if (n==16)
                {
                    uchar *table0="Lanzhou         ";
                    uchar *table1="University      ";
                }
        else
        {
                for(m=1;m<16;m++)
                {
                    table0[m-1]=table0[m];
                    table1[m-1]=table1[m];
                    table0[15]=" ";
                    table1[15]=" ";
                }//移位循环程序
        }
    }
}


//查询忙碌标志信号程序
void Busy(void)
{
    do
    {
        CLR_EN;
        SET_RW;
        CLR_RS;
        SET_EN;
        busy=dat;
        CLR_EN;
        Delay_1ms();
    }
    while(busy&&0x80==1);
}


//写指令到LCM程序
void Instruction(uchar a)
{
    Busy();
    CLR_EN;
    CLR_RW;
    CLR_RS;
    SET_EN;
    dat=a;
    CLR_EN;
}


//写数据到LCM程序
void DataWrite(uchar a)
{
    Busy();
    CLR_EN;
    CLR_RW;
    SET_RS;
    SET_EN;
    P1OUT=a;
    CLR_EN;
}


//启动LCM程序
void Reset(void)
{
    Instruction(0x38);
    Instruction(0x0c);
    Instruction(0x06);
}
3)子函数头文件LCD.h

#define uchar unsigned char
#define dat P1OUT
#define CLR_RS P2OUT&=~BIT0;//RS=P2.0
#define SET_RS P2OUT|=BIT0;
#define CLR_RW P2OUT&=~BIT1;//RW=P2.1
#define SET_RW P2OUT|=BIT1;
#define CLR_EN P2OUT&=~BIT2;//EN=P2.2
#define SET_EN P2OUT|=BIT2;
uchar busy;
void Delay_1ms(void);//延时程序
void Delay_1s(void);//延时程序
void Display(uchar* table0,uchar* table1);//显示程序
void Cycling(uchar *table0,uchar *table1);//循环程序
void Busy(void);//液晶查忙程序
void DataWrite(uchar a);//液晶写数据程序
void Reset(void);//液晶初始化
void Instruction(uchar a);//液晶写指令程序


硬件部分:

我画的图,大家按这张图连应该没问题的嗷,嘿嘿。
举报

更多回帖

×
20
完善资料,
赚取积分