




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、-. z单片机应用及系统计基于MSP430的简易乘法器院系:自动化学院指导教师:吴益飞:胡霆*:0610200120同组成员:佳 聂敏华时间:2021-4-25基于MSP430的简易乘法器胡霆0610200120理工大学自动化学院06102001班 引言:本次设计主要是利用实验箱的硬件资源实现简单的乘法器功能,由于显示的LED灯的限制,这里只能完成三位数的乘法运算。在程序运行的过程中,可以利用实验板的按键输入所需要运算的数和符号,在此之前这些数和符号已经在程序中定义了。然后MSP430经运算以后,最后按下等于号之后结果会从高到低显示到LED上。其中的键盘和LED已经集成在了实验板上,用到的时候
2、只需要做相应的端口定义即可。关键词:MSP430 乘法器 键盘 LED问题描述:此功能主要由两大模块组成,一个是键盘输入模块,一个是个LED显示模块,必须要各个模块的功能定义程序中说明好每个键盘的功能,才能和对应的按键对应起来。此外在编程时应该注意硬件乘法器所需要的一些存放器,比方MPY,MPYS,MAC,MACS,OP2,RESLO,RESHI,SUME*T.然后在主程序中,集成两大模块的功能,使之协调工作,程序运行后,行列扫描键盘工作,有按键按下 时按键的键值显示到LED。最后在MSP430中进展运算以后,把运算结果也送给显示电路,则完成了整个运算过程主程序中要注意如下的定义:行列键盘的对
3、应键值为A,*对应键值为B。 可以用如下的系统框图表示硬件乘法器的逻辑组成:MSP430单片机LED显示键盘输入问题解决:键盘输入模块:本实验采用行列式键盘的设计。键盘的硬件接线图如下;由于本次试验所需要的键盘按键不是很多,因此采用3*4的格局就可以了。列键分别由上拉电阻上拉到与VCC相连接。在行线与列线的每一个交界处都有一个按键,按键的A,B,端分别接再在行端和列端。键盘电路工作时,首先会扫描判断有没有兼按下,如果有,则与之相连的行键和列键被连通,在检测是否有键按下时,首先使三条行线输出低电平,读列线。列线输出非全1.按键抖动的消除可以使用硬件和软件方法,软件方法比拟容易些。即采用软件延时,
4、在检测到一个有效信号后,延时一段时间在进展检测,如果还有信号,则这个信号就是有效信号。对键盘的编程可参见下面的源程序。LED显示模块如下是本实验板上所用的LED硬件原理图:由图可以看到,LED显示由74HC373锁存,然后用P3.0P7.0分别控制LED和显示段码和位选。显示代码的输出P3.0P3.7分别对应LED的e,d,dp,c,g,b,f,a.当P4.1为高时,U5选通,P3口的数据经过U5输出到LED,当P4.1为低电平时,U5处于数据锁存状态。此时不管P3口如何变化,1Q8Q数据保持不变.位选的输出LED的现实代码编号如下:07BH 112H 24FH 37FH 436H 53DH
5、67DH 71BH 87FH 93FHP3.0P3.5为位选信号,分别对应D0D5.其工作原理与显示代码的原理一样。具体编程可参见源程序。系统程序 /键盘模块程序:/*ifndef MSP430F449_H*include *endif*define KEY_BOARD 1unsigned char key_Pressed; / 是否有键值按下 key_val; / 存放键值 key_Flag; / 是否一个按下的按键已经松开, / 即是按键的键值可以读取unsigned char key_Map12 = /设置键盘逻辑键值与程序计算键值的映射 1,2,3,10,4,5, 6,0,7,8,9,
6、11 /10为= 0就是0 11为乘号 ;/* 初始化键盘设备*/void init_Keyboard(void) P1DIR &= 0*01; / P1.4P1.7 设置为输入模式 P1DIR |= 0*0E; / set p1.1p1.3 设置为输出模式 P1OUT |= 0*0E; / p1.1p1.3 输出值清零 key_Flag = 0;/ 初始化key_Flag key_Pressed = 0;/ 初始化key_Pressed /* Check_Key(),检查按键,确认键值*/void check_Key(void) unsigned char row ,col,tmp1,tmp
7、2; / tmp1用来设置P1OUT的值,使P1.1P1.3中有一个为0 tmp1 = 0*08; for(row=0;row3;row+) P1OUT |= 0*0E; / p1.1P1.3=1 P1OUT -= tmp1; / P1.1p1.3中有一个为0 tmp1 = tmp1/2; / tmp1 右移一位 if (P1IN & 0*f0) 0*f0) / 是否P1IN的P1.4P1.7中有一位为0 tmp2 = 0*80; / tmp2用于检测出那一位为0 for(col =0;col0;tmp-);/* key_Event(),检测键盘是否有键按下,如果有获取键值*/void key
8、_Event(void) unsigned char tmp; P1OUT &= 0*01; / 设置P1OUT输出值 tmp = P1IN; / 获取 p1IN if (key_Pressed =0*00)&(tmp & 0*f0) 0*f0) /是否有键按下 key_Pressed = 1; / 如果有按键按下,设置key_Pressed标识 delay(); /消除抖动 check_Key(); / 调用check_Key(),获取键值 else if (key_Pressed =1)&(tmp & 0*f0) = 0*f0) /是否按键已经释放 key_Pressed = 0; / 去
9、除key_Pressed标识 key_Flag = 1; / 设置key_Flag标识 上面的 .C 文件完成了键盘模块端口的定义,430存放器的初始化等工作。还有键值的读取功能,由函数void check_Key(void)完成。当按下*一键后,通过调用void check_Key(void)函数更改 key_val 的值供下一步系统的调用。LED模块程序:*ifndef MSP430F449_H*include *endif*define LED_IN_USE 6/*/* 数据定义 */*/const unsigned char NUM_LED17= 0*d7,0*14,0*cd,0*5d
10、,0*1E, / 0 4 0*5b,0*db,0*15,0*df,0*5f, / 5 9 0*9f,0*da,0*c3,0*cc,0*cf, / a e 0*8b,0*00; /f,0*00使LED不显示unsigned char led_BufLED_IN_USE; / LED显示缓冲区 , / 存放要显示数据 unsigned char led_Ctrl;/* 模块初始化*/void init_LED(void) char tmpv; P3DIR = 0*ff; / 设置 p3 输出 P3OUT = 0*00; / 设置 初始值为0 P4DIR |= 0*03; / 设置 p4.0,p4.
11、1 输出 P4OUT &= 0*fc; / 设置初始值 led_Ctrl = 0; / led_Ctrl用于控制那个LED可显示 for(tmpv=0;tmpvLED_IN_USE;tmpv+) / 初始化缓冲区 led_Buftmpv = 0; /* LED 显示 ,该函数可以放到定时器中断中*/void led_Display() unsigned tmp ; tmp = 0*01; P3OUT = NUM_LEDled_Bufled_Ctrl; / 设置显示值 P4OUT |= 0*02; / 翻开数据锁存器 P4OUT &= 0*FD; / 关闭数据锁存 P3OUT = (tmpled
12、_Ctrl); / 设置那只LED显示 P4OUT |= 0*01; / 翻开控制锁存 P4OUT &= 0*FE; / 关闭控制锁存 led_Ctrl= (led_Ctrl +1) % LED_IN_USE; / 设置下一个要显示的LED上述LED.c文件用来完成LED局部的初始化工作和之后的数字显示功能。我们将要显示的数据写入 led_BufLED_IN_USE,然后调用 led_Display() 函数即可将要显示的数据显示在LED上。主程序模块:/* 文件名称:* main.c * 文件说明:* 程序运行后,行列扫描键盘工作,有按键按下* 时按键的键值显示到LED。行列键盘的对应键值为
13、A* * 对应键值为B */*define MSP430F449_H 0*include *ifndef LED_IN_USE*include ././led/led.c*endif*ifndef KEY_BOARD*include keyboard12.c*endif/* print(unsigned data)函数,用于将data写入显示缓存, 并具有错误判断功能 */ void print(unsigned data) if(data999999) /溢出提醒 led_Buf0=0*cf; /字母E led_Buf1=0*9f; /字母R 和字母A一样 led_Buf2=0*d7; /字
14、母O 和0一样 else led_Buf0=data/100000; /结果的显示,将不用的位写入不同缓冲区 data=data%100000; led_Buf1=data/10000; data=data%10000; led_Buf2=data/1000; data=data%1000; led_Buf3=data/100; data=data%100; led_Buf4=data/10; data=data%10; led_Buf5=data; /* main()函数*/void main(void) unsigned char tmp; unsigned char dat1; unsi
15、gned char dat2; unsigned char result; unsigned char clr_flg=0; unsigned char calc=0; unsigned char calc_flg=0; WDTCTL = WDTHOLD + WDTPW ; / 停顿看门狗 init_LED(); / 初始化LED init_Keyboard(); / 初始化键盘 while(1) key_Event(); /检测按键事件 if (key_Flag = 1) / 检测key_val里是否有键值可以读取 if(clr_flg=1) /如果清空标志位为1,清空显示缓存 init_L
16、ED(); clr_flg=0; if(key_val!=10&key_val!=11&calc_flg!=1) for(tmp=1; tmpLED_IN_USE;tmp+) led_Buftmp-1=led_Buftmp;/ 键值右移 led_BufLED_IN_USE-1=key_val; / 取出当前键值 dat1=dat1*10+key_val; /累加乘数 key_Flag = 0; / 恢复键盘按键标识 else if(key_val=10) /按下运算符号之后 dat2=dat1; /把第一个乘数的值赋给dat2 dat1=0; /清空第一个乘数的值,等待下一个的输入 clr_f
17、lg=1; /清空标志位置1,下次循环清空显示 calc_flg=1; /运算符等待输入 else if(calc_flg=1) calc=key_val; /输入相应的运算符 calc_flg=0; /等待运算符输入标志位清零 else switch(calc) /根据不同计算符号计算相应的结果 case 1: result=dat1+dat2; break; case 2: result=dat1-dat2; break; case 3 :result=dat1*dat2; break; case 4: result=dat1/dat2; break; /结算结果 print(result
18、); /将结果写入显示缓存,准备显示 clr_flg=1; /清空标志位置1 led_Display(); / 使用LED键盘数据 程序调试:本次所完成的实验设计是在原有实验的根底上进一步挖掘实验平台的潜能,综合利用实验平台上的各个模块,最终完成一个相对完整的功能。在我们设计中所用到的键盘和LED显示相应的程序和功能在前几次试验中已经根本完成,所以设计中仅仅是把他们拿过来当作一个完整的模块来使用。对于计算器的设计主要是完成不同运算符的选择和结果的相应显示,要合理利用LED的显示功能,进最大可能的完成更多的功能。主程序的调试由于是在实验完毕之后完成的,所以不能在实验平台上进展验证,主要是在自己的电脑上编译通过,但这样检查的仅仅是语法上的错误,对于逻辑上的漏洞是无能为力的。在主程序中我们也尽量做到各个不同功能的代码间的隔离,比方结果显示的函数集合了错误处理功能,这样就不用在主函数中另外编写。而且对于系统的扩展和进一步延伸也有很大的方便之处。实验总结:在做这个试验方案之前,我们小组本来是准备做一个小游戏程序的,比方说俄罗斯方块或者贪吃蛇,实验书里面有一个类似的参考程序,可以再LCD屏上通过按键来调节显示字符的位置,但是考虑到俄罗斯方块要涉及的东西非常多,不仅仅是通过按键来调节显示字符的位置,还有显示的方块的组
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- Unit 4 Did You Have a Nice Trip?Lesson 24 A Gift for Little Zeke 同步练习(含答案含听力原文无听力音频)
- 2025年度餐厅服务员职业发展规划与晋升合同
- 二零二五年度汽车美容店市场营销人员用工合同规范
- 二零二五年度工伤赔偿协议范本(服装行业)
- Unit 3 Learning better 阅读综合能力训练(含答案)
- 2025年阳江货运从业资格证考试技巧
- 2025年武汉货运从业资格证模拟考试试题答案解析
- 2025年莱芜货运从业资格证考试内容
- 2025年延边货运从业资格证模拟考试下载
- 年度产品研发进展报告表
- 上海市建设工程施工图设计文件勘察设计质量疑难问题汇编(2024 版)
- 2024年3、6、9月青少年软件编程Python等级考试一级真题(全3套 含答案)
- SF-36生活质量调查表(SF-36-含评分细则)
- 航空服务形体训练课程标准
- 项目部安全管理组织机构网络图GDAQ20102
- 苏科版四年级劳动技术下册教学计划
- 电网公司客户资产接收管理细则
- 干部选拔任用工作报告(一报告两评议).doc
- 苏教版四年级下册数学第二单元认识多位数测试卷(含答案)
- ECMO学习 最详细的教程
- 玻尿酸注射术前同意书
评论
0/150
提交评论