东南大学MCU综合课程设计_第1页
东南大学MCU综合课程设计_第2页
东南大学MCU综合课程设计_第3页
东南大学MCU综合课程设计_第4页
东南大学MCU综合课程设计_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、东南大学自动化学院MCU技术及课程设计数字钟设计报告姓 名: 学 号: 专 业: 自动化 实 验 室: 组 别: 同组人员: 设计时间: 2015年 6 月 1 日 2015年 6月 17日评定成绩: 审阅教师: 目 录一. 课程设计的目的与要求3二. 原理设计3三. 方案实现与测试,实验流程图,可采用c语言实现8四分析与总结9一. 课程设计的目的与要求1. 可设定时间初始值;2. 能够使用按键调整时间的时分位;3. 使用段式LCD显示。二. 原理设计MSP430的液晶显示有静态、2MUX、3MUX、4MUX四种显示模式,而最常用还是4MUX模式。通俗讲,就是有四个公共端(相当于数码管扫描显示

2、的位选端)、若干个驱动端的模式。这种模式的最大优点就是能使用最少的引脚提供最多的液晶显示段。图1表示了4MUX显示模式下的公共端与驱动端,其中(a)说明了一个”8”字的四个公共端,(b)说明了两个驱动端,当分别给公共端与驱动端液晶信号时,就显示对应的数码。图一在MSP430系列能驱动液晶显示的单片机中,专门开辟了一片存储空间(LCDMEM1LCDMEM20)存放要显示的信息,被称为液晶显示缓存,简称液晶显存。MSP430F6638共有20字节单元液晶显存,如果使用4MUX方式显示,可以显示160段液晶笔画。这时,每个显存将对应两个驱动端。图2表示了在4MUX方式下的液晶显存、液晶显示、液晶驱动

3、端之间的对应关系。PIN12345678910111213141516C1C11DX22DX33DX14D4P5D5P6D6PC2C21E1C2E2C3E3C4E4C5E5C6E6CC3C31G1B2G2B3G3B4G4B5G5B6G6BC4C41F1A2F2A3F3A4F4A5F5A6F6A图二段式LCD的驱动方法基本上和数码管是不太一样的,数码管只要给电和选通就亮。但是段式LCD的驱动是靠两部分组成的:第一部分是不间断的电压脉冲,这个电压脉冲还是被分为好几个电压等级了,如果你用的是1/4duty1/3偏压的话,那么就要有四个电压等级。也就是VCC-2/3VCC-1/3VCC-GND这几个电

4、压等级直接可以用电阻进行分压得到,然后直接和430单片机的R03-GND;R13-1/3VCC;R23-2/3VCC;R33-VCC这样直接连接就可以了。这样电压等级就有了,具体在里面生成的电压等级脉冲,MSP430是可以自己生成的,不用我们担心了。COM0-COM3就这些个电压等级的输出管脚。直接连上LCD屏的COM0-COM3就可以了。第二部分是选通管脚选通管脚也就是LCD上面的SEG1-SEG12,和MSP430F6638的SEG0-SEG11直接相连,硬件电路如下:JP5是用一个跳帽来控制背光(由于板卡IO口有限),把跳帽跳上段式LCD背光打开。² 段式LCD驱动编写步骤:首

5、先要明白每个输出管脚何时输出和输出什么,这样才能得到我们想要的字形。 MSP430F6638自带有对多达160图块进行对比度控制的集成LCD驱动器,有LCD段码寄存器,就是说你只要把这些你要显示的字形(当然如果你只想显示数字的话,只用存0-9这几个字码就可以了),段码寄存器的地址是从091H开始-到0A4H每个地址里面可以放一个8位,每一位对应于液晶上面的一段,所以说一个地址对应于液晶上面就是一个字。(一个字的段码也是8位的) 这样的话,我们只要将要显示的一个数字的编码发到这个单片机的断码寄存器里面,就可以直接显示了,是通过COM口的脉冲波形同时将寄存器里面的段进行耦合,产生压差,LCD只有产

6、生压差才能点亮。一直提供一个不变的高电平是要烧坏液晶的,这就是和数码管区别的地方。不过这些脉冲430单片机已经帮我们做好了。 总体的步骤就是 ,我们将LCD的段码先整理好,然后放在一边备用,等到你想显示某个数据的时候,只要将这个8位的段码直接写入单片机留给你的LCD寄存器写入端口数组就可以了。 在MSP430F6638里面也就是LCDMEM ; 中应该写的是要显示的位,这个位是数码管上面的位置,比如你想显示液晶上面的第2位数,先不说要显示的内容是什么,这里的位选应该是LCDMEM1,因为是从0开始的,所以第二位应该是LCDMEM1.(从091H开始-到0A4H每个地址都可以存一个8段)然后说显

7、示的内容:显示的内容的段码很关键,这个要看你所拥有的LCD参数手册,一般都是这样的一张表:PIN12345678910111213141516C1C11DX22DX33DX14D4P5D5P6D6PC2C21E1C2E2C3E3C4E4C5E5C6E6CC3C31G1B2G2B3G3B4G4B5G5B6G6BC4C41F1A2F2A3F3A4F4A5F5A6F6A这个表给我们的信息就是, 第5和第6列显示一个8字,第7和第8列显示一个8字.一共可以显示6个8字。(1) 至于里面的X2、X3、X1是三个电池符号,4P、5P和6P是三个小数点。 (2) 本板卡段式LCD有四个COM和12个SEG,

8、可满屏显示888.8.8.8 (3) 驱动电压3-5V 1/3偏压方式,可由MSP430直接驱动或者用HT1621芯片(4) 外形尺寸长57.5mm*宽25mm*厚度2.7mm 可视区域14.4*50(5) 屏位半透屏,最好配合背光使用,不要背光也可在 屏后面贴白纸或者PCB 做白色丝印,否则屏会透光看到PCB,所以加上了背光板。(6) 该段式LCD是16脚封装,PIN1-PIN4对应COM1-COM4,PIN5-PIN16对应SEG1-SEG12 下图是内部走线,仅供参考:因为LCD段码的等级脉冲方式是从COM1-COM4,所以我们将这些第5和第6列的段码也要按照这个方式编码。假如我们想显示

9、第一个8字上面的内容:即:第一次脉冲出来 COM1 COM2 COM3 COM4,那么寄存器里面输出来的段选也应该按照COM1 COM2 COM3 COM4所对应的段码输出,这样才行显示出你想要的结果,那么我们在第一轮的COM1COM4输出时匹配寄存器的段选应该1D-1E-1G-1F,第二轮的COM-COM4输出时,匹配寄存器的段选应该是X2-1C-1B-1A,这样第一个8字的显示才完全了,至于这个寄存器是怎样把这些段码读并且写出去呢?COM口在启动后总是从COM1COM4,COM1COM4,COM1COM4,一直不停的这样脉冲着.排序方法应该根据COM1-COM4的连续输出方式排。一个8字的

10、段码排序从高到低排,因为我两轮COM1COM4的输出所以得这样排第二轮COM4-COM3-COM2-COM1 1A-1B-1C-X2(电池符号) 第一轮COM4-COM3-COM2-COM1 1F-1G-1E-1D然后可以理解为寄存器里的一个8位段码保存的段就是这样的1A-1B-1C-X2(电池符号)-1F-1G-1E-1D到此我们如果想显示一个数字2,我们该如何保存段码呢按照数码管的方法应该是显示a,b,d,e,g这五段。那么对于寄存器里面的这8个段不是按照ABCDEFGH来排的,怎么整呢?显示哪一段就把哪一段置“1”,不显示的就置零。那么2出来了,有高到低就是11000111这里的小数点暂

11、时不显示。其中的fcdp0不显示,所以写0就可以啦!所以2的最终段码就是C7H以此类推,你可以把任意个段码全部写出来,然后组成一个通用的数组/ LCD segment definitions.#define d 0x01#define c 0x20#define b 0x40#define a 0x80#define dp 0x10#define g 0x04#define f 0x08#define e 0x02const char char_gen = / As used in 430 Day Watch Demo board a+b+c+d+e+f, / Displays "0

12、" b+c, / Displays "1" a+b+d+e+g, / Displays "2" a+b+c+d+g, / Displays "3" b+c+f+g, / Displays "4" a+c+d+f+g, / Displays "5" a+c+d+e+f+g, / Displays "6" a+b+c, / Displays "7" a+b+c+d+e+f+g, / Displays "8" a+b+c+d+f+g

13、, / Displays "9" a+b+c+e+f+g, / Displays "A" c+d+e+f+g, / Displays "b" a+d+e+f, / Displays "c" b+c+d+e+g, / Displays "d" a+d+e+f+g, / Displays "E" a+e+f+g, / Displays "f" a+b+c+d+f+g, / Displays "g" c+e+f+g, / Displays &

14、quot;h" b+c, / Displays "i" b+c+d, / Displays "j" b+c+e+f+g, / Displays "k" d+e+f, / Displays "L" a+b+c+e+f, / Displays "n" a+b+c+d+e+f+g+dp / Displays "full"以上是段式LCD的基本原理,想显示还要先设置,就像定时器一样,要先设置好相关的寄存器,它才会按照你的思想来运行。1. 先配置TS3A5017DR 因为仔细

15、查看电路图后,该段式LCD的引脚SEG12、SEG11、SEG10,中间经过了两片TS3A5017DR模拟开关切换(U22、U24),直接配置IN1和IN2引脚即可。2. 初始化LCD/lcd初始化void Init_lcd(void) LCDBCTL0 =LCDDIV0 + LCDPRE0 + LCDMX1 + LCDSSEL + LCDMX1 + LCD4MUX ; LCDBPCTL0 = LCDS0 + LCDS1 + LCDS2 + LCDS3 + LCDS4 + LCDS5 + LCDS6+ LCDS7 + LCDS8 + LCDS9 + LCDS10 + LCDS11 ; P5SE

16、L = 0xfc;/用作LCD驱动3. 开启LCD void LcdGo(unsigned char doit)if(doit=1)/打开液晶显示LCDBCTL0 |= LCDON;else if(doit=0)/关闭液晶显示LCDBCTL0 &= LCDON;4. LCD清屏 LCDMEM0 = 0; 这个就是在第0位 不显示任何东西,清屏! 当然清屏是在要改变显示数据前清的。void LCD_Clear(void)/清屏 unsigned char index; for (index=0; index<12; index+) LCDMEMindex = 0; 5写数据 LCD

17、MEM0 = char_gen 0; 这个就是把char_gen 0数组中的的第一个段码0xE7发给显示寄存器。并且显示的地址是LCD屏上的第0位,LCDMEMn,这个n是几,就是在第几位显示。当然的屏幕只有6位,那就是最多只有5了。三. 方案实现与测试,实验流程图,可采用c语言实现实验步骤:1. 将PC与开发板相连;2. 建立CCS工程;3. 选择对该工程进行编译链接,生成.out 文件。然后选择 ,将程序下载到实验板中。程序下载完毕之后,可以选择全速运行程序,也可以选择单步调试程序,选择 F3 查看具体函数。也可以程序下载之后,按下,软件界面恢复到原编辑程序的画面。再按下实验板的复位键,运

18、行程序。四分析与总结 在本次实验中,我只实现了数字钟的最简单功能,由于时间原因,并未将我原本想加的闹铃功能加入。 通过本次实验,对于段式LCD的使用有了一定的了解,能够熟练掌握应用。 本次大实验为单人作业,相对于以前组队实验,单人的实验更能挑战本人的独立性与创新性,当然也意味着更多的付出。但是在单人实验中学习到的知识和对突发情况的应对,也是团队实验中无法体会到的。 MSP430单片机最显著的特点是能够超低功耗运行,正是由于这一特点,用MSP430来做日期时间显示器,可以很有效地降低功耗,节约电能。参考书目:1 沈建华,杨艳琴,MSP430 超低功耗单片机原理与应用第二版,北京,清华大学 出版社

19、,2004 年原代码:#include <msp430f6638.h>/* Private define -*/#define CPU_F (double)1000000)#define delay_us(x) _delay_cycles(long)(CPU_F*(double)x/1000000.0)#define delay_ms(x) _delay_cycles(long)(CPU_F*(double)x/1000.0)/ LCD segment definitions.#define d 0x01#define c 0x20#define b 0x40#define a 0

20、x80#define dp 0x10#define g 0x04#define f 0x08#define e 0x02#define M 6 /液晶屏显示个数#define Y 10 /分秒个位每位液晶屏显示字数#define X 6 /分秒十位每位液晶屏显示字数/* Private macro -*/* Private variables -*/const char char_gen = / As used in 430 Day Watch Demo board a+b+c+d+e+f, / Displays "0" b+c, / Displays "1&qu

21、ot; a+b+d+e+g, / Displays "2" a+b+c+d+g, / Displays "3" b+c+f+g, / Displays "4" a+c+d+f+g, / Displays "5" a+c+d+e+f+g, / Displays "6" a+b+c, / Displays "7" a+b+c+d+e+f+g, / Displays "8" a+b+c+d+f+g, / Displays "9" a+b+c+

22、e+f+g, / Displays "A" c+d+e+f+g, / Displays "b" a+d+e+f, / Displays "c" b+c+d+e+g, / Displays "d" a+d+e+f+g, / Displays "E" a+e+f+g, / Displays "f" a+b+c+d+f+g, / Displays "g" c+e+f+g, / Displays "h" b+c, / Displays &quo

23、t;i" b+c+d, / Displays "j" b+c+e+f+g, / Displays "k" d+e+f, / Displays "L" a+b+c+e+f, / Displays "n" a+b+c+d+e+f+g+dp / Displays "full"/* Private function prototypes -*/void Init_lcd(void); / LCD初始化void LcdGo(unsigned char Dot); /打开或关闭液晶void Lcd

24、Blink(unsigned char doit); / 显示或者消隐显示内容void LCD_Clear(void); / 清屏void Init_TS3A5017DR(void); / Configure TS3A5017DR IN1 and IN2void Backlight_Enable(void); / 打开背光/* Private functions -*/*!*函数功能:配置LCD segment output功能*输入参数:无*返回值: 无*/void Init_lcd(void) LCDBCTL0 =LCDDIV0 + LCDPRE0 + LCDMX1 + LCDSSEL +

25、 LCDMX1 + LCD4MUX ; LCDBPCTL0 = LCDS0 + LCDS1 + LCDS2 + LCDS3 + LCDS4 + LCDS5 + LCDS6+ LCDS7 + LCDS8 + LCDS9 + LCDS10 + LCDS11 ; P5SEL = 0xfc;/*打开或关闭液晶1:打开 0:关闭*/*!*函数功能:打开或者关闭液晶*输入参数:Dot* Dot为1时:打开液晶显示* Dot为0时:关闭液晶显示*返回值: 无*/void LcdGo(unsigned char Dot)if(Dot=1)/打开液晶显示LCDBCTL0 |= LCDON;else if(Dot

26、=0)/关闭液晶显示LCDBCTL0 &= LCDON;/*!*函数功能:显示或者消隐显示内容*输入参数:无*返回值: 无*/void LcdBlink(unsigned char doit)if(doit=0)LCDBCTL0 &= LCDSON;else if(doit=1)LCDBCTL0 |= LCDSON;/*!*函数功能:清除LCD的显示内容*输入参数:无*返回值: 无*/void LCD_Clear(void)/清屏 unsigned char index; for (index=0; index<12; index+) LCDMEMindex = 0; /

27、*!*函数功能:配置TS3A5017DR通道*输入参数:无*返回值: 无*/void Init_TS3A5017DR(void) / Configure TS3A5017DR IN1 and IN2 P1DIR |= BIT6 + BIT7; /P3.4 : IN1 ; P3.5 : IN2 set as output P1OUT &= BIT7; /IN1 = 0 P1OUT |= BIT6; /IN2 = 1/*!*函数功能:LCD segment 背光使能*输入参数:无*返回值: 无*/void Backlight_Enable(void) P8DIR |= BIT0; P8OU

28、T |= BIT0;/*!*函数功能:LCD segment相应的值加1*输入参数:LCDMEM地址*返回值: LCDMEM内容*/char add1(char * addr) char z; addr+; z=*addr; return z;int main( ) int i=10,j,k,s,t,u,w,x,y; WDTCTL = WDTPW + WDTHOLD; / Stop WDT Init_lcd(); / LCD初始化 LcdGo(1); /打开或关闭液晶 LcdBlink(1); / 显示或者消隐显示内容 LCD_Clear(); / 清屏 Init_TS3A5017DR();

29、/ Configure TS3A5017DR IN1 and IN2 Backlight_Enable(); / 打开背光 P4DIR&=(BIT2+BIT3); P2IE|=BIT7+BIT6+BIT5; P2IFG&=(BIT7+BIT6+BIT5); _enable_interrupt();loop:while(1) for(s=0;s<3;) /小时十位循环 for(t=0;t<Y;) /小时个位循环 for(u=0;u<X;) /分十位循环 for(w=0;w<Y;) /分个位循环 for(x=0;x<X;) /秒十位循环 for(y=0

30、;y<Y;y+) /秒个位循环 k=y; /k为保护i的中间变量 if(y=0&&x=0&&w=0&&u=0&t=0&&s=0) /初始化为00:00:00 for(j=0;j<M;j+) LCDMEMj=char_geny; else for(j=0;j<3;j+) /寻找并保存第一位小时十位的值 if(LCDMEM0=char_genj) s=j; for(j=0;j<Y;j+) /寻找并保存第二位小时个位的值 if(LCDMEM1=char_genj) t=j; for(j=0;j<X;

31、j+) /寻找并保存第三位分钟十位的值 if(LCDMEM2=char_genj) u=j; for(j=0;j<Y;j+) /寻找并保存第四位分钟个位的值 if(LCDMEM3=char_genj) w=j; for(j=0;j<X;j+) /寻找并保存第五位秒十位的值 if(LCDMEM4=char_genj) x=j; LCDMEM0=char_gens; LCDMEM1=char_gent; LCDMEM2=char_genu; LCDMEM3=char_genw; if(LCDMEM5=char_gen0&&i=y-1) x=0; y=0; k=y; y+

32、; LCDMEM4=char_genx; LCDMEM5=char_geny; for(j=0;j<=42;j+) /延时25*43即1075ms,检测是否进入中断 if(P4IN&BIT2)=0) /判断是否进入中断 i=y; /求出进入中断前,y的值,以供出中断后(上面第四行)判断所用 P2IFG|=BIT7; delay_ms(25); P2IFG&=BIT7; /LCDMEM2=char_genu; /LCDMEM3=char_genw; /LCDMEM4=char_genx; /LCDMEM5=char_geny; y=k; if(LCDMEM5=char_ge

33、nY-1) x+; LCDMEM4=char_genx; LCDMEM5=char_gen0; if(LCDMEM4=char_genX&&LCDMEM5=char_gen0) w+; LCDMEM3=char_genw; LCDMEM4=char_gen0; LCDMEM4=char_gen0; if(LCDMEM3=char_genY&&LCDMEM4=char_gen0&&LCDMEM5=char_gen0) u+; LCDMEM2=char_genu; LCDMEM3=char_gen0; LCDMEM4=char_gen0; LCDME

34、M5=char_gen0; if(LCDMEM2=char_genX&&LCDMEM3=char_gen0&&LCDMEM0!=char_gen2) t+; LCDMEM1=char_gent; LCDMEM2=char_gen0; LCDMEM3=char_gen0; LCDMEM4=char_gen0; LCDMEM5=char_gen0; else if(LCDMEM2=char_genX&&LCDMEM3=char_gen0&&LCDMEM1!=char_gen3&&LCDMEM0=char_gen2) t

35、+; LCDMEM1=char_gent; LCDMEM2=char_gen0; LCDMEM3=char_gen0; LCDMEM4=char_gen0; LCDMEM5=char_gen0; else if(LCDMEM2=char_genX&&LCDMEM3=char_gen0&&LCDMEM1=char_gen3&&LCDMEM0=char_gen2) LCDMEM0=char_gen0; LCDMEM1=char_gen0; LCDMEM2=char_gen0; LCDMEM3=char_gen0; LCDMEM4=char_gen0; LCDMEM5=char_gen0; goto loop; /for(j=0;j<M;j+) 等同上语句 /LCDMEMj=char_geny; if(LCDMEM1=char_genY&&LCDMEM2=char_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论