嵌入式学习小组
登录
直播中
张超
7年用户
1295经验值
私信
关注
如何去实现在MSP430G2553与LCD1602上的字符滚动设计呢
开启该帖子的消息推送
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);//液晶写指令程序
硬件部分:
我画的图,大家按这张图连应该没问题的嗷,嘿嘿。
首先,这次实验设计中我们实现的是在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);//液晶写指令程序
硬件部分:
我画的图,大家按这张图连应该没问题的嗷,嘿嘿。
举报
更多回帖
rotate(-90deg);
回复
相关问答
LCD1602
字符串
MSP430G2553
通过I2C总线控制
LCD1602
输出
2015-05-23
3574
请问有
msp430g2553
的
lcd
程序吗?
2019-09-12
1185
基于
msp430g2553
,利用pcf8574驱动
1602
液晶
2017-03-29
5579
请问有
MSP430G2553
入门视频教程吗?
2019-07-15
1635
为什么我的
msp430g2553
接
1602
没显示?求大神帮忙
2014-07-19
3153
MSP430g2553
在protues7.8
上
怎么弄?求大神来帮忙解答下
2014-07-17
7397
请问有关于
MSP430G2553
的中文资料吗?
2019-03-14
3095
基于
msp430G2553
的流水灯
2015-11-07
6176
在WIN 7 64位系统
上
安装
MSP430G2553
的驱动问题
2015-06-02
3970
为什么
msp430g2553
在仿真的时候程序能执行,脱机无法执行
2014-07-28
2314
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
英国威廉希尔公司网站
william hill官网 版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分