计算器的单片机设计Word文档下载推荐.docx
- 文档编号:8236579
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:17
- 大小:206.78KB
计算器的单片机设计Word文档下载推荐.docx
《计算器的单片机设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《计算器的单片机设计Word文档下载推荐.docx(17页珍藏版)》请在冰点文库上搜索。
LED显示器由七段发光二极管组成,排列成8字形状,因此也成为七段LED显示器,器排列形状如下图所示:
为了显示数字或符号,要为LED显示器提供代码,即字形代码。
七段发光二极管,再加上一个小数点位,共计8段,因此提供的字形代码的长度正好是一个字节。
简易计算器用到的数字0~9的共阴极字形代码如下表:
0~9七段数码管共阴级字形代码
显示字型
g
f
e
d
c
b
a
段码
1
3fh
06h
2
5bh
3
4fh
4
66h
5
6dh
6
7dh
7
07h
8
7fh
9
6fh
2位LED显示的程序框图如下:
2、读键输入程序设计
为了实现键盘的数据输入功能和命令处理功能,每个键都有其处理子程序,为此每个键都对应一个码——键码。
为了得到被按键的键码,现使用行扫描法识别按键。
其程序框图如下:
3、主程序设计
(1)数值送显示缓冲程序设计
简易计算器所显示的数值最大位两位。
要显示数值,先判断数值正负,如果是负值,则符号位显示“-”,然后将数值除以10,余数送显最最低位,判断商是否为0,若为0则返回,若不为0,则将商除以10,将余数送显高位。
程序框图如下:
(2)运算主程序设计
首先初始化参数,送LED低位显示“0”,高位不显示。
然后扫描键盘看是否有键输入,若有,读取键码。
判断键码是数字键、清零键还是功能键(“+”“-”“*”“/”“=”),是数值键则送LED显示并保存数值,是清零键则做清零处理,是功能键则又判断是“=”还是运算键,若是“=”则计算最后结果并送LED显示,若是运算键则保存相对运算程序的首地址。
运算主程序框图如下所示:
4、简易计算器源程序
OUTBITequ07FFDh;
位控制口
OUTSEGequ07FFCh;
段控制口
INequ07FFEh;
键盘读入口
data1equ70h
data2equ71h
dizhi1equ72h
dizhi2equ73h
LEDBufequ60h;
显示缓冲
ljmpStart
LEDMAP:
;
八段管显示码
db3fh,06h,5bh,4fh,66h,6dh,7dh,07h
db7fh,6fh,77h,7ch,39h,5eh,79h,71h
Delay:
延时子程序
movr7,#0
DelayLoop:
djnzr7,DelayLoop
djnzr6,DelayLoop
ret
DisplayLED:
movr0,#LEDBuf
movr1,#2;
共2个八段管
movr2,#00000010b;
从左边开始显示
Loop:
movdptr,#OUTBIT
mova,#0
movx@dptr,a;
关所有八段管
mova,@r0
movdptr,#OUTSEG
movx@dptr,a
mova,r2
显示一位八段管
movr6,#1
callDelay
mova,r2;
显示下一位
rra
movr2,a
incr0
djnzr1,Loop
TestKey:
输出线置为0
movdptr,#IN
movxa,@dptr;
读入键状态
cpla
anla,#0fh;
高四位不用
KeyTable:
键码定义
db0dh,0ch,0bh,0ah
db0eh,03h,06h,09h
db0fh,02h,05h,08h
db00h,01h,04h,07h
GetKey:
movP2,dph
movr0,#Low(IN)
movr1,#00100000b
movr2,#4
KLoop:
mova,r1;
找出键所在列
movr1,a;
下一列
movxa,@r0
anla,#0fh
jnzGoon1;
该列有键入
djnzr2,KLoop
movr2,#0ffh;
没有键按下,返回0ffh
sjmpExit
Goon1:
键值=列X4+行
deca
rla
movr2,a;
r2=(r2-1)*4
r1中为读入的行值
movr1,#4
LoopC:
rrca;
移位找出所在行
jcExit
incr2;
r2=r2+行值
djnzr1,LoopC
Exit:
取出键码
movdptr,#KeyTable
movca,@a+dptr
WaitRelease:
movdptr,#OUTBIT;
等键释放
clra
movr6,#10
callTestKey
jnzWaitRelease
Start:
movsp,#40h
movLEDBuf+0,#0
movLEDBuf+1,#03fh
movdptr,#7FFFh
mova,#89h
MLoop:
callDisplayLED;
显示
callTestKey;
有键入?
jzMLoop;
无键入,继续显示
callGetKey;
读入键码
Jisuan:
movr3,a
cjner3,#0fh,Qita;
判断是否为清零键?
movr3,#00h;
清零
movr4,#00h
movr5,#00h
movdata1,#00h
movdata2,#00h
movdizhi1,#00h
movdizhi2,#00h
ljmpMLoop
Qita:
clrc
cjner3,#0ah,follow;
判断是数字键还是功能键?
follow:
jcShuzi
ljmpGn
Shuzi:
mova,r4;
判断是否已有运算符输入,没有就将数值存在
jnzShuzi2data1,有就将数值存在data2
mova,r3
movdata1,a
ljmpXs;
显示第一次输入的数值
Shuzi2:
movdata2,a
显示第二次输入的数值
Gn:
movr4,#01h;
将01h给r4,说明已有运算符输入
cjner3,#0eh,Ja;
判断键值是否为“=”?
movr4,#00h;
将r4清零
mova,dizhi1;
执行“=”
movdph,a
mova,dizhi2
movdpl,a
mova,#00h
jmp@a+dptr;
转到本次输入的算法程序
Ja:
cjner3,#0ah,Jn;
若键值为“+”则将“+”的程序首地址存在
movdptr,#Jiadizhi1和dizhi2中
mova,dph
movdizhi1,a
mova,dpl
movdizhi2,a
ljmpMLoop
Jn:
cjner3,#0bh,Ce;
若键值为“-”则将“-”的程序首地址存
movdptr,#Jiandizhi1和dizhi2中
Ce:
cjner3,#0ch,Cu;
若键值为“*”则将“*”的程序首地址存在
movdptr,#Chengdizhi1和dizhi2中
Cu:
cjner3,#0dh,Zhuan;
若键值为“/”则将“/”的程序首地址存在
movdptr,#chudizhi1和dizhi2中
Zhuan:
Jia:
mova,data1;
加法程序
adda,data2
ljmpXs
Jian:
减法程序
subba,data2
Cheng:
乘法程序
movb,data2
mulab
Chu:
除法程序
divab
Xs:
movb,#10;
显示个位数字
movr5,a
mova,b
movdptr,#LEDMap
movLEDBuf+1,a
mova,r5
First:
cjnea,#0,Next
ljmpMLoop;
运算完后继续扫描键盘
Next:
movb,#10;
显示十位数字
movdptr,#LEDMap
movLEDBuf+0,a
ljmpFirst
end
四、心得体会
我的题目是简易计算器,对于我们这些实践中的新手来说,这是一次考验。
怎么才能找到课堂所学与实际应用的最佳结合点?
怎样让自己的业余更接近专业?
怎样让自己的计划更具有序性,而不会忙无一用?
这都是我们所要考虑和努力的。
这次课程设计我学到很多很多的东西,学会了怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。
不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识,掌握了一种系统的研究方法,可以进行一些简单的编程。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,对单片机汇编语言掌握得不够好。
这次课程设计通过我们小组的努力终于顺利完成了,在设计中遇到了很多编程问题,最后在老师的辛勤指导下,终于迎刃而解,在此我表示感谢!
同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!
指导老师评语
课程设计成绩
指导老师签字
2010年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算器 单片机 设计