ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:33.88KB ,
资源ID:11697540      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11697540.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(MSP430单片机课程设计实时时钟与键盘控制.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

MSP430单片机课程设计实时时钟与键盘控制.docx

1、MSP430单片机课程设计实时时钟与键盘控制MSP430单片机课程设计实时时钟与键盘控制 一、设计思路该算法的流程简图如下:由于LCD无法完全显示时间日期,故采用page翻页的方式设计,每页6位显示。设定page为奇数时表示当前在时间页面,page为偶数时表示当前在日期页面。在修改时间时,采用的是输入字符串进行修改的方式。1、显示当前时间time=hour*10000+min*100+sec。在page为偶数时,前两位显示小时,中间两位显示分钟,最低两位显示秒。2、显示当前日期date=year*10000+mon*100+day,并能与时间切换。 在page为奇数时,前两位显示年份,中间两位

2、显示月份,最低两位显示天。键盘上的up、down修改page的值,实现两页显示的切换。2、能够读取键盘值进行修改键盘通过中断的方式读取键值,每个键都有相应的操作。具体的方案如下:键值在0F之间为对应的十六进制数。按下UP键,page加1。按下DOWN键,page加1,以上两键能使page奇偶变化。按下L键,p加1,用于修改数据时修改位置的更改。按下R键,p减1,用于修改数据时修改位置的更改。按下ESC键,使set置1,进入修改模式,并在首位显示E。按下START键,修改的数据生效,set置0。按下STOP键,取消修改,set置0,清除首位显示。按下ENTER键,确认当前位的修改,注意是单个位的

3、修改。3、体现430系列单片机的超低功耗的特性。在中断处理结束,以及循环结束,或者等待键盘按键时,会进入低功耗工作模式,同时编程时也尽量减少函数的调用,并将一些变量定义为寄存器变量,提高运行效率。二、参数计算 设计时钟时,应能做到分秒的60进1,时的24进1 ,年以两位数表示满100进1 ,月满12进1;关于天的计数较为复杂:先根据年月判断该月的最大天数,实现进位。三、编程步骤1、编写时间显示函数,测试以确认函数功能正常。2、设置初始值为04年2月28日。利用定时器A控制秒信号的自加,并用LCD显示判断算法是否正确。3、已经得到正确的秒信号,根据算法实现时间的进位。4、设计键盘,使键盘能正确输

4、入,读取键值。5、设计翻页功能,实现时间和日期的切换。6、设计时间的修改功能,以串输入修改数据的形式进行修改。7、程序存档,测试检验基本功能。8、优化程序算法,精简变量与函数调用,实现超低功耗,测试检验,提交最后成果。四、实践感受五、源程序 /实时时钟+键盘控制(串输入修改方式)#include #include /定义液晶显示笔画#define a (0x01) #define b (0x02)#define c (0x10)#define d (0x08)#define e (0x40) #define f (0x20)#define g (0x04) /#define h (0x80)/

5、显示字符的指针 const unsigned char LCD_Tab = a+b+c+d+e+f ,/显示 0, LCD_Tab00 b+c ,/显示 1, LCD_Tab01 a+b+d+e+g ,/显示 2, LCD_Tab02 a+b+c+d+g ,/显示 3, LCD_Tab03 b+c+f+g ,/显示 4, LCD_Tab04 a+c+d+f+g ,/显示 5, LCD_Tab05 a+c+d+e+f+g ,/显示 6, LCD_Tab06 a+b+c ,/显示 7, LCD_Tab07 a+b+c+d+e+f+g ,/显示 8, LCD_Tab08 a+b+c+d+f+g ,/

6、显示 9, LCD_Tab09 a+b+c+e+f+g ,/显示 A, LCD_Tab0A c+d+e+f+g ,/显示 b, LCD_Tab0B a+d+e+f ,/显示 C, LCD_Tab0C b+c+d+e+g ,/显示 d, LCD_Tab0D a+d+e+f+g ,/显示 E, LCD_Tab0E a+e+f+g ,/显示 F, LCD_Tab0F 0 ,/显示 , LCD_Tab10 ;/定义时钟 2004-02-28 23:59:53 unsigned short int year=04, mon=2,day=28,hour=23,min=59,sec=53; unsigned

7、 short int x,num,page=0; unsigned char p3; double dx; unsigned int set=0,p=0; /p表示当前修改哪个位 unsigned int key=0,temp=10; long int div_val=1,div=1,data=0,dat=0; void mInitSTDIO() / 系统初始化 unsigned char i; / 主时钟初始化 WDTCTL = WDTPW + WDTHOLD; / stop watchdog timer FLL_CTL0 |= XCAP14PF; / Configure load caps

8、 / 定时器A初始化 TACTL = TASSEL0 + TACLR; / ACLK, clear TAR TACCTL0 = CCIE; / CCR0 interrupt enabled TACCR0 = 32768; / 定时器常数(1秒) TACTL |= MC0; / Start Timer_a in upmode / 定时器B初始化 TBCTL = TASSEL0 + TACLR; / ACLK, clear TAR TBCCTL0 = CCIE; / CCR0 interrupt enabled TBCCR0 = 328; / 定时器常数(1/100秒) TBCTL |= MC0;

9、 / P口初始化 P1DIR = 0; / 设置P1.0P1.7为输入方式 P1IFG = 0; / 清除P1的中断标志 P1IE = 0xFF; / 设置 P1.0P1.7 中断 P1IES = 0xFF; / 设置 P1.0P1.7 下降沿中断 P2DIR |= 0xCF; / 设置P2.0P2.3,P2.6,P2.7为输出方式 P3DIR = 0xFF; / 设置P3.0P3.7为输出方式 P4DIR |= 0xFC; / 设置P4.2P4.7为输出方式 P5SEL = 0xFF; / P5用于LCD显示 P6SEL = 1; / P6.0用于ADC P3DIR |= 0xFE; / 设

10、置P6.1P6.7为输出方式(临时) / 初始化 LCD LCDCTL = LCDON + LCD4MUX + LCDP0; / 4-Mux LCD, segments S0-S15 BTCTL = BTFRFQ1; for(i = 0; i 8; i+) LCDMEMi = 0; / 清除显示 /=主程序=void main(void) char x=0; mInitSTDIO(); / 系统初始化 _EINT(); / 开启中断 for(dx = 0;dx 1000;dx+); printf(Startn); while(1) while(page%2=0&set=0) /判断条件为偶数页

11、,显示时分秒 LCDMEM0 = LCD_Tabsec % 10; LCDMEM1 = LCD_Tabsec / 10; LCDMEM2 = LCD_Tabmin % 10; LCDMEM3 = LCD_Tabmin / 10; LCDMEM4 = LCD_Tabhour % 10; LCDMEM5 = LCD_Tabhour / 10; / _BIS_SR(LPM3_bits); / Enter LPM3 _BIS_SR(LPM0_bits); / Enter LPM0 while(page%2=1&set=0) /判断条件为奇数页,显示年月日 LCDMEM0 = LCD_Tabday %

12、10; LCDMEM1 = LCD_Tabday / 10; LCDMEM2 = LCD_Tabmon % 10; LCDMEM3 = LCD_Tabmon / 10; LCDMEM4 = LCD_Tabyear % 10; LCDMEM5 = LCD_Tabyear / 10; _BIS_SR(LPM3_bits); / Enter LPM3 _BIS_SR(LPM0_bits); / Enter LPM0 while(set=1) /set=1时,设置模式 LCDMEM0 = LCD_Tabtemp; /最低位闪烁 for(dx = 0;dx 1000;dx+); LCDMEM0 = LC

13、D_Tab16; /空白,不显示 for(dx = 0;dx 2000;dx+); /-字符串输入- while(key0x0a) /按键为09,可进行修改 data=data*10+key; dat=data; x=p; do LCDMEMx- = LCD_Tabdat / div; dat %= div; div /= 10; while(div); div_val=div_val*10; div=div_val; p+; p %=6; temp=key; key=0x0a; /data为输入的6位数, start 键确认修改 / 设置模式 end / 修改建议:尝试按位修改时间 /whi

14、le(1) /=main结束=/ -Timer A0 中断服务程序-#pragma vector=TIMERA0_VECTOR _interrupt void Timer_A0(void) p3 =59) /实现时间的进位 sec=0; if(min=59) min=0; if(hour=23) hour=0; if(day=num) day=1; if(mon=112) mon=1;year+;year%=100; else mon+; else day+; else hour+; else min+; else sec+; / _BIC_SR_IRQ(LPM3_bits); / Clear

15、 LPM3 bits from 0(SR) _BIC_SR_IRQ(LPM0_bits); / Clear LPM0, SET BREAKPOINT HERE/修改建议:判断部分移入main函数/ Timer B0 中断服务程序#pragma vector=TIMERB0_VECTOR _interrupt void Timer_B0(void) x = 1; / 键盘扫描 if(x & 0x07) = 0) x = 1; P2OUT = (x) & 0x07;/ _BIC_SR_IRQ(LPM3_bits); / Clear LPM3 bits from 0(SR) _BIC_SR_IRQ(

16、LPM0_bits); / Clear LPM0, SET BREAKPOINT HERE/ P1 中断服务程序 #pragma vector=PORT1_VECTOR _interrupt void P1INT(void) register int scan=0,pressed; /寄存器变量存储按键中间值 do scan = P2IN; scan &= 0x0007; scan = 8; scan |= P1IFG; /扫描得到scan for(dx = 0;dx 800;dx+); /延时数值自己调整 pressed = P2IN; pressed &= 0x0007; pressed

17、= 8; pressed |= P1IFG; /延时后得到pressed while(scan!=pressed) ; /可以确定键值,下一步操作 switch(scan) case 0x0101: key = 0; break;/ 0键键值 case 0x0102: key = 1; break;/ 1键键值 case 0x0104: key = 2; break;/ 2键键值 case 0x0108: key = 3; break;/ 3键键值 case 0x0110: key = 4; break;/ 4键键值 case 0x0120: key = 5; break;/ 5键键值 cas

18、e 0x0140: key = 6; break;/ 6键键值 case 0x0180: key = 7; break;/ 7键键值 case 0x0201: key = 8; break;/ 8键键值 case 0x0202: key = 9; break;/ 9键键值 case 0x0204: key = 0x0a; break;/ A键键值 case 0x0208: key = 0x0b; break;/ B键键值 case 0x0210: key = 0x0c; break;/ C键键值 case 0x0220: key = 0x0d; break;/ D键键值 case 0x0240

19、: key = 0x0e; break;/ E键键值 case 0x0280: key = 0x0f; break;/ F键键值 case 0x0401: key = 0x10; page+; break;/ UP键键值 case 0x0402: key = 0x11; page+; break;/ DN键键值 case 0x0404: key = 0x12; p+;break; / L键键值 case 0x0408: key = 0x13; p-;break; / R键键值 case 0x0410: key = 0x14; / STRAT键键值 if(page%2=0) hour=data/

20、10000; min=(data%10000)/100; sec=data%100; if(page%2=1) year=data/10000; mon=(data%10000)/100; day=data%100; set=0; /start确认修改 LCDMEM6 = LCD_Tab16; break; case 0x0420: key = 0x15; / STOP键键值 set=0; / 按stop取消修改 LCDMEM6 = LCD_Tab16; break; case 0x0440: key = 0x16; / ESC键键值 set=1;p=0;data=0;dat=0;div=0;div_val=0; /记得初始化 LCDMEM6 = LCD_Tab14; /首位显示E表示进入手动设置 LCDMEMp = LCD_Tab10; /修改处显示A break; case 0x0480: key = 0x17; break; / ENTER键键值 default: LCDMEM6 = 0; break; / 其它情况 P1IFG = 0; _BIC_SR_IRQ(LPM0_bits); / Clear LPM3 bits from 0(SR) 资料仅供参考!

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1