完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
首先,这次实验设计中我们实现的是在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);//液晶写指令程序 硬件部分: 我画的图,大家按这张图连应该没问题的嗷,嘿嘿。 |
|
|
|
只有小组成员才能发言,加入小组>>
791 浏览 0 评论
1151 浏览 1 评论
2527 浏览 5 评论
2860 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2710 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1070浏览 3评论
193浏览 2评论
455浏览 2评论
368浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
453浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 14:19 , Processed in 1.079169 second(s), Total 77, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号