创新课程设计范例

机械创新设计课程设计

院 系: 班 级: 成 员: 指导老师:

设计题目:

- 1 -

年 月

多功能平口钳设计方案

一、设计任务简述

多功能平口钳。为了实现平口钳的多功能化,解决平口钳功能单一的问题,设计出一种多功能平口钳,其我们将钳口作成燕尾槽结构,并配合以不同功能的工作块,使钳口工作面可以更换,这样就使它具有了多功能性。

系统设计流程:

创新课程设计范例

二、多功能平口钳的市场展望

多功能平口钳能够代替一套的钳具包,不但同样能够实现它们的功用,而且实现了一钳多能,节省空间、节省成本等。所有能够制作成工作块的工具都可以拿来开发利用。其所配套的工作块,常用的可以成套销售,有特殊用途的亦可单独销售。一旦销入市场,必能够很快占有一席之地。

- 2 -

三、多功能平口钳系统方案

1、多功能平口钳功能与设计要求

(1)功能 平口钳能实现一钳多用,具有合理的结构,工作可靠,经久耐用,工作效率高。

基于TRIZ理论进行设计分析

问题解决过程

创新课程设计范例

创新课程设计范例

创新课程设计范例

实现功能的物理效应

功能分析:

1)首先为了达到平口钳多功能的目的,我们采用组合的原理,在空间上将相同或相近的物体或操作加以组合。我们将平口钳的夹持部位采用可更换的夹头,针对不同材料和不同功能要求,这样就可以实现多种功能,这种钳口就可以实现对塑料一类的软材料或钢铁一类的硬材料的可换操作。既不会损坏材料本身,也不会损坏钳口。

2)采用这种可更换的钳口,又可以适应不同的形状的材料,可以既可以夹持平面类物体(平口钳与物体的接触面积大,可以使操作平稳可靠,又不至于损坏物体),又可以夹持圆柱表面(圆柱表面的夹头与圆柱面也是充分接触,防止物体的转动和滑动,操作可靠性好)。

3)这种多功能平口钳可以实现多种操作功能,可以进行可要的夹持,也可以实行剪断功能,我们还可以不断开发新的钳口,以实现更多的功能,比如起子、订书机、剥线机、螺丝刀的功能都可以实现,真正做到一钳多用。

- 3 -

4)在钳柄底部安装一个丝杆传动机构,可以通过手摇实现钳子的开合,不仅使平口钳可以产生持续的可靠的力,还使得力可控制,同时还节省人力。

5)将传统的铰接式的平口钳,改为齿轮齿条传动机构,钳把转动转化为扇形的齿轮传动,从而带动齿条钳口的平动,实现钳口力的平行相加。

技术矛盾

技术特性参数:

10力 11应力与压力 12形状 27可靠性 33可操作性 35适用性和多用性 36装置的复杂性 39生产率

要扩大装置的35适用范围就必然会导致36装置的复杂性提高。由冲突解决矩阵可以得问题解决的原理:

解决方案 15 动态化(把物体的结构分成既可变化

又可相互配合的若干组成部分[8]

29 用气动或液压结构(替代机械部[15]

37 热膨胀(组合不同的热膨胀系数的几种材料[27]

28 替代机械系统(声、光、电磁或影响人类感觉[5]

对于本问题来说,可以通过15 动态化把钳口的结构分成既可变化又可相互配合的若干组成部分。

在夹紧过程过要减小工件的变形,就要减少施加在上面的11应力与压力。由突解决矩阵可以得问题解决的原理:

解决方案 10 预先作用(预先对物体施加改变) [2]

35 改变特征(物理或化学参数改变) [1]

21 快速通过,减少有害作用的时间 [35]

30 柔性壳体或薄膜(用柔性壳体或薄膜把物体从其

环境中隔离开) [17]

要解决在夹紧过程过要减小工件的变形,可用到30柔性壳体或薄膜把物体从其环境中隔离开。

综上,在方案设计中,为了达到平口钳的功能多样性,扩大平口钳的使用范围,同时又要减小装置的复杂性,我们将平口钳的钳口结构设计分成既可变化又可相互配合的若干组成部分。

2、方案设计

(1)方案一

- 4 -

该多功能钳子包括铰接在一起的钳身,钳身的前端是钳口部分,钳身的后端是手柄部分,钳口部分的外侧面设有助钉器,内侧面设有助钉孔,构成助钉孔的两个半圆分别设在钳口部分两侧的钳身上,钳口部分一外侧面设有V形起钉器,另一外侧面设有锤击面,钳身后端的一手柄端部设有活动扳手,另一手柄部设有螺丝刀,在钳口后端和钳身接触处设有剥线器、软线器和直钉器。

(2)方案二

该多功能钳子包括铰接在一起的钳身本体,钳身的前端是钳口部分,钳身的后端是手柄部 分。其方法是在钳口本体上加装活动工作块,手柄部分是通过丝杆传力。

其钳身本体部分如下图所示:

创新课程设计范例

- 5 -

根据钳口的不同变换组合可以得到以下不同功能: a.钳子

创新课程设计范例

创新课程设计范例

- 6 -

b.管钳

创新课程设计范例

c.十字起

创新课程设计范例

- 7 -

d.内六角

创新课程设计范例

e.扩孔

创新课程设计范例

- 8 -

(3)方案三

我们平时用的钳子,在钳夹物体时,钳口的张开是V字形,显然有一个向钳口外的分力存在,这样就使得要夹持的物体体积越大,钳口张开就越大,用于夹持物体的分力也就越小,且越不稳固。如下图所示:

而如果我们采用齿轮齿条传动机构的简单原理,钳把转动转化为扇形的齿轮传动,从而带动齿条钳口的平动,实现钳口的平行相加。

创新课程设计范例

无论齿轮啮合是否标准安装,齿合线N1N2的位置总是不变的,而且啮合角a恒等于分度圆的压力角,也就是齿条的齿形角。

一般钳子钳口相夹时的力是随钳口变化而不断变化的,而且钳口开的越大,钳夹力越小,很不适用于夹持体积大一些的物体。

而齿动原理是钳夹力的方向大小都是不变的,除了平行钳夹的优势外,齿动平行口钳在钳夹较大体积物体更省力更有优势。

普通钳子钳口张角过小,使其在使用范围上有所限制;齿动平行口钳可将钳把转角加到足够大,而其作用在钳口的力不变,从而扩大了钳口的应用范围。如下图所示:

- 9 -

创新课程设计范例

我们设计的多功能平口钳具有可换的工作面,使得它具有一钳多用的功能。

根据钳口的不同变换组合可以得到以下不同功能:

a.普通钳口工作面:适用于平面刚性物体的夹持。

- 10 -

B.橡胶质工作面:可以用来夹持玻璃类、塑料类脆性材料的物体,并有平行钳夹的优点。

C.圆弧形工作面:可以用来夹持圆柱类表面物体。

创新课程设计范例

- 11 -

d.剪切工作面:具有剪切功能。

E.活扳手工作块

创新课程设计范例

创新课程设计范例

- 12 -

F.订书机工作块。

G.剥线工作块。

......

几乎所有种类的钳类工具都可以用可拆装工作块代替,因此一把多功能齿动瓶口钳就能代替多种不同种类的钳子,实现一钳多用。

四.机构系统方案的评价与选择

方案一:它具有钳子、扳手、螺丝刀、铁锤、锉刀、剪刀和剥线器等多种功能,还具有起钉子、防止钉子在锤击过程中的变弯的助钉功能和将弯钉子修直的直钉功能。其缺点是需要用比较大的力,而且施力的过程中人容易碰到手柄后端的螺丝刀而受伤,不安全。

方案二:它采用平口钳夹紧与多功能组件的组合,扩大了普通钳的应用范围。而且手柄部分是通过转动丝杆传动,起到省力的作用但丝杆易磨损不适合传递很大的力。

方案三:它在原来平口钳的基础上,增加了一个带有齿轮的转动轴,使平口钳不仅能水平转动角度,也能使钳口座沿钳口工作面方向倾斜角度,可有效地减少调整工件、装卡工件和工件找正的次数,它变过去钳口平面垫板的单一形状为多种几何形状,并通过钳口垫板的卡口组合,来装卡多种形状的工件,不仅使工件装卡牢固,也减少了已加工表面在换位装卡时的损伤程度,同时模具数量也会减少,保证工件的加工精度。

因此通过三个方案的综合比较我们选择了方案三。

五、方案可优化改进的方面

1、增加钳子的适用范围,即设计开发更多的工作块。

2、设计多种钳身,比如便携式的,针对需要较大功率设计的气动或电动或液压式钳身。

参 考 文 献

[1] 邹慧君. 机械系统设计与应用创新.北京:机械工业出版社,2008.

[2] 孟宪源 姜琪. 机构构型与应用. 北京:机械工业出版社,2005.

[3] 黄继昌 徐巧鱼等. 实用机械机构图册.北京:人民邮电出版社,1996.

[4] 杨紫光 机械创新设计 .北京:北京大学出版社,2008.

[5] 王洪欣 平口钳的设计与三维动画.中国矿业大学出版社2002.

- 13 -

 

第二篇:创新课程设计候亭亭

院 系:电子与电气工程学院 专 业:电子信息工程

班 级:099411

姓 名:候亭亭

学 号:094109013

指导老师:薛晓

一、设计要求

以52系列单片机为核心实现一个简易计算器,设计十进制加减乘除法计算器。要求能(不同时)显示3位输入和4位输出。

二、设计目的

要求计算器能实现加减乘除四种运算,具体如下:

1、加法:整数加法

2、减法:整数减法

3、乘法:多位整数乘法

4、除法:整数除法

5、有清除功能

6、在原有要求上扩展多位输入和输出,超出值显示乱码

三、设计方案论证

按照系统设计的功能的要求,初步确定设计系统由主控模块、监测模块、显示模块、键扫描接口电路共四个模块组成,主控芯片使用51系列STC89C52单片机,采用高性能的静态80C51设计,由先进工艺制造,并带有非易失性Flash程序存储器。它是一种高性能、低功耗的8位COMS微处理芯片,市场应用最多。 监测模块采用三极管和蜂鸣器组成电路。

键盘电路采用4*4矩阵键盘电路。

显示模块采用4枚共阴极数码管和74ls138、74LS47芯片构成等器件构成。 整个单片机的接口电路:

P0(3?0)用于数码管段选显示输出;

P2用于键扫描输入;

P0(6..4)用于数码管位选控制;

P0(7)用于监测模块;

单片机最小系统

单片机最小系统就是支持主芯片正常工作的最小电路部分,包括主控芯片、复位电路和晶振电路。

主控芯片选取STC89C52RC芯片,因其具有良好的性能及稳定性,价格便宜应用方便。

晶振选取11.0592MHz,晶振旁电容选取20pF。

采用按键复位电路,电阻分别选取100Ω和10K,电容选取10μF。

以下为单片机最小系统硬件电路图。

创新课程设计候亭亭

单片机最小系统硬件电路

键盘接口电路

采用P2口对键盘进行控制,行列式键盘这里主要用反转扫描法进行检测。原理图如下:

创新课程设计候亭亭

数码管显示电路

采用8位数码管对计算数据和结果的显示(实验时只用到了4位),这里选取共阴数码管,利用74LS138和74LS47对数码管进行驱动。

P0.6~P0.4用来作为位选端,控制哪几位数码管进行显示。 P0.3~P0.0控制数码管数字进行显示。

以下为数码显示电路的硬件电路图

创新课程设计候亭亭

监视电路

监视电路就是在按键时,发出声音提醒,以确保输入数字有效。这里就采用5V蜂鸣器作为示音设备。用p0.7口输出信号。

以下为报警电路硬件电路图

创新课程设计候亭亭

(1)键盘扫描函数

键盘电路采用4*4矩阵键盘电路。采用扫描法对键盘进行扫描,对P2口的扫描结果和各按键的地址,我们就可以得到是哪个键按下,从而完成键盘扫描的功能。 unsigned char key_scan(void)

{

unsigned char row,col=0,k=0xff;

KEYIO=0xf0;

if((KEYIO&0xf0)==0xf0)

return k;

delay(10);

if((KEYIO&0xf0)==0xf0)

return k;

for(row=0;row<4;row++)

{

KEYIO=~(1<<row);

k=KEYIO&0xf0;

if(k!=0xf0)

{

while(k&(1<<(col+4)))

col++;

k=row*4+col;

KEYIO=0xf0;

P0&=0x7f;

while((KEYIO&0xf0)!=0xf0);

break;

}

}

return k;

}

键盘调用程序:

调用键盘扫描程序,读取按键的值。实现各个键的加减乘除的功能,采用switch功能进行读取。

unsigned char key_vect(unsigned char keyValue)

{

unsigned char nKey;

switch(keyValue)

{

case 0:

nKey=7;

break;

case 1:

nKey=8;

break;

case 2:

nKey=9;

break;

case 3: nKey=ADD; break; case 4: nKey=4; break; case 5: nKey=5; break; case 6: nKey=6; break; case 7:

nKey=SUB; break; case 8: nKey=1; break; case 9: nKey=2; break; case 10: nKey=3; break; case 11: nKey=MUL; break; case 12: nKey=0; break;

case 13:

nKey=CLR;

break;

case 14:

nKey=EQU;

break;

case 15:

nKey=DIV;

break;

default :

nKey=ERROR;

}

return nKey;

}

(2)数码管显示函数

采用4位数码管对计算数据和结果的显示,这里选取共阴数码管,利用74LS47和74LS138芯片对数码管进行驱动。

P0.6~P3.4用来作为位选端,控制哪几位数码管进行显示。比如当P0.6~P0.4为0时,其他位全给1。此时就将扫描的数据送给指定数码管显示。

void Led_display(unsigned char wei,unsigned char duan)

{

duan&=0x0f;

wei&=0x07;

P0=((7-wei)<<4)|duan|0x80;

}

(3)监测模块函数

采用三极管和蜂鸣器组成,利用P0.7进行控制,当P0.7端口为低电平时,此时

计算结果出现问题,并报警。 //蜂鸣器初始化函数

void sys_init()

{

P0|=0x80;

}

(4)主程序框图

创新课程设计候亭亭

程序流程

(5)调试步骤在焊接好器件后,先不要将芯片插在芯片座上,要先验证先板上电源是否好用,有无短路等。接上电源,用万用表测量个芯片座对应电源和地之间的电压值,观察电压值是否正常。一切正常后方可将芯片插入芯片座,以继续测试其他功能。将芯片插上后,对各个模块进行调试,按键是否工作正常,数码管是否显示正常等。编写相关部分的测试程序对其进行测试。各部分硬件检测无误后,下载程序进行整体调试,一切正常后,结束调试过程。在具体调试时首先遇到的问题是程序无法下载进入单片机,通过将电路板接线与原理电路图接线的对比发现,串口芯片与单片机连接的输入,输出接反,重新用铜线连接后,依然无法下载程序。后找到原因是由于下载串口与设计封装不符,用相对应的下载线可以下载。成功下载程序后,发现数码管显示不正确,查看后发现有先没有连接,可能是制板时漏印,连接后显示正常。

四、设计结果与分析

对程序进行调试,经计算机仿真分析,结果表明本程序基本实现了其功能。当输入3位数字相加减乘除时,能够实现4位输出。例如“138+456=594”,由硬仿件真结果可得出结果。具体见图;

创新课程设计候亭亭

创新课程设计候亭亭

创新课程设计候亭亭

五、心得体会

整个体会还是比较多的。首先是题目的选择,各方面的原因,自己还是

想选个简单点的题目,不过最后选来选去,还是选择了计算器。由于自己对单片机编程可以,结果在设计的时候遇到了一系列问题,程序总是调试部处理,不过还好,最后在同学的帮助下终于把程序调试出来了,虽然程序设计实现的功能与老师要求的有所扩展,不过勉强还算可以。从这里我知道了基本知识的重要性。其实进行程序设计的时候主要是对各功能模块的把握。计算器里面最难的一部分是矩阵键盘的扫描和编码,那个费了很大力气。另外一点就是硬件焊接调试部分。焊接的时候到时轻松,一个下午就焊接好了,然后是调试部分。调试花费的时间还是比较长的。不过有了上个学期数字电路焊接调试的经验,这次单片机调试还算是比较顺利。我也是从电路板的正负电源检测起,一步一步来,最终得到了想要的结果。调试的时候主要遇到了个问题。一个是键盘总是没有反应,为了这个自己调试了很久,前前后后把电路板检查了几次,最后才发现是键盘本身的问题,和同学们换了个好键盘才行。总的来说这次课程设计达到了完成了基本任务,达到了基本要求。通过亲身对程序设计和电路焊接调试的体会,自己对单片机有了进一步的了解,单片机编程能力也得到了提高。电路板的焊接与调试,使自己电路调试的方法和思想进一步加强了。这次单片机课程设计应该说是比较成功的。 通过本次课程设计我真正的自己完成了对给定要求系统的硬件设计、电路设计、电路板设计、软件设计以及对成品的调试过程。

从本次课设中我也看到了自身的很多不足之处,对知识的掌握不够扎实,有一知半解的现象。有时做事不够稳定,过于毛躁,不能平心静气的去分析所遇到的问题和错误。这在以后的工作和生活中是不可取的,通过对自身问题的认识与改正相信再遇到同样问题时会更好的解决。以后的设计实验也会更好的完成。而且我也意识到了团队合作的重要性,五人为一组的分配让我们学会了如何分配各自的工作,让我们减少了很多的时间,每一步都有每一个人去做,这样,每个人都能够从中收获不同的只是,而且,还能交换各自的收获心得,让我们的知识以及走向社会工作中有了对团队合作的全新认识。了解到以往学习中自己知识在某方面

的不足之处,是对以往学习科目的一种贯穿和承接,从而能更好的认识和学习,也对将来从事工作大有裨益。

参考文献

[1] 李群芳,黄建. 单片机微型计算机与接口技术. 北京:电子工业出版社,2001

[2] 徐维祥、刘旭敏. 单片微型机原理及应用. 大连:大连理工大学出版社,1996

[3] 李光飞、楼然苗、胡佳文、谢象佐. 单片机课程设计与实例指导. 北京:北京航空航天大学出版社,2004

[4] 周国运. 单片机原理及应用(C语言版).中国水利水电出版社,20xx年2月第一版

附录:

1、先输入一个+运算,接着输入一个减运算符,结果将运行哪个,加还是减,怎样实现的?---------——王东宾

回答:

case EQU:

NumberFormat(1);

switch(MathWay)

{

case 1:

resValue=fstValue+secValue;

break;

case 2:

resValue=fstValue-secValue;

break;

case 3:

resValue=fstValue*secValue;

break;

case 4:

resValue=fstValue/secValue;

break;

}

程序的流程,不管按几次,只默认是最后一次的符号有效。

2、74LS138和74LS47是怎么对数码管进行驱动的.........张玉崇

回答:138和47都是译码器,138通过对输入端A/B/C输入的电平进行译码输出端输出相应的电平,然后对数码管的位选进行控制。

47也是通过输入端端口输入的电平进行译码,但他是4个输入端口A/B/C/D,对其输入的数字转换为相应的二进制编码,然后输出端输出对应于数码管的段选端的控制电平!

3、如何实现数码管的位选自动选择,如2*5=10,原来是1位的,如何最终变成两位的??--卢春林

回答:位选的选择是通过P0(3..0)口控制的。原来一位变成两位的时候将之前的数乘10,然后数码管往左移一位显示高位,然后第二个数码管再显示地位,以此类推。下面是原计算程序:

fstValue=0;

FormatLoop=nValideLed;

for(;FormatLoop>0;FormatLoop--)

{

unsigned long tmp=1;

signed char tmp1=FormatLoop;

for(;(tmp1-1)>0;tmp1--)

tmp*=10; //高位乘10

fstValue+=keyValue[FormatLoop-1]*tmp; //高位乘10后相加

}

4、如果除法有余数时怎么处理-------任小丽

回答:这是硬件的一个缺点,因为数码管不能够显示小数点位,所以在处理计算小数点的过程时,舍弃掉了小数点位,只保留整数。

case EQU:

NumberFormat(1);

switch(MathWay)

{

case 1:

resValue=fstValue+secValue;

break;

case 2:

resValue=fstValue-secValue;

break;

case 3:

resValue=fstValue*secValue;

break;

case 4:

resValue=fstValue/secValue; //除法

break;

}

如果要处理余数的话,可在后面求余除法resValue=fstValue%secValue;

5、计算处理子程序的设计思路----------朱阿松

回答:void NumberFormat(unsigned char bSec)

{

if(bSec)

{

secValue=0;

FormatLoop=nValideLed;

for(;FormatLoop>0;FormatLoop--)

{

unsigned long tmp=1;

signed char tmp1=FormatLoop;

for(;(tmp1-1)>0;tmp1--)

tmp*=10;

secValue+=keyValue[FormatLoop-1]*tmp;

}

}

else

{

fstValue=0;

FormatLoop=nValideLed; //获取按键获取的次数

for(;FormatLoop>0;FormatLoop--)

{

unsigned long tmp=1;

signed char tmp1=FormatLoop;

for(;(tmp1-1)>0;tmp1--) //按键次数进行循环*10的次数

tmp*=10;

fstValue+=keyValue[FormatLoop-1]*tmp; //将获取的值进行组合相加 }

}

}

首先从按键获取第一个数值显示,然后当输入第二个数值时,将第一个数值存入一个数组缓存起来,存入keyValue[]里面,然后乘于10在加上获取的第二个数值,然后组合起来送入fstValue,最后得到最后的数值。最后再将获取的第一个输入的数值和第二个输入数值进行加、减、乘、除运算。 case EQU:

NumberFormat(1);

switch(MathWay)

{

case 1:

resValue=fstValue+secValue; //加法运算

break;

case 2:

resValue=fstValue-secValue; //减法运算

break;

case 3:

resValue=fstValue*secValue; //乘法运算

break;

case 4:

resValue=fstValue/secValue; //除法运算

break;

}

resFormat();

break;

然后主程序调用

void main(void)

{

sys_init();

for(;;)

{

Calculate();

DisplayLoop=nValideLed;

if(DisplayLoop==0)

{

Led_display(0,0);

}

else

{

for(;DisplayLoop>0;DisplayLoop--)

{

Led_display(DisplayLoop-1,keyValue[DisplayLoop-1]); //将缓存的数值赋给数码管的段选

delay(5);

}

}

}

}

6、请问你们的设计计算器的优缺点是什么?--王坡

回答:优点是可以实现任意位的计算输入和输出。缺点是不能算小数。

7、如果我要计算的是100*100得到的结果怎么显示?------董艳波

回答:按照原先题目要求和设计发现,结果超值,显示错误。这如果要设计计算器的话太不方便。经改过之后,可以显示其100*100的值,。为10000.

8、如果输入的数字是负数怎么处理-------周丹阳

回答:按要求是没有负数的,但如果想要用到负数的话,可以用按键进行判断。可以在unsigned char key_vect(unsigned char keyValue)函数加个case语句,然后在void Calculate(void)函数里加个IF语句进行判断,如:IF(//所按的键){//加个符号};,但由于硬件限制,数码管不能显示符号,所以不能用到。

9、程序能不能实现两个数相加之后数值直接显示,然后自动保存,再乘或除运算之后显示结果?--------袁一方

回答:我们设计的程序不可以实现,程序只可进行一步运算,但可以把结果作为第一个输入的值继续进行运算,也就是说多步运算只能一步一步来。

10、是否可以实现两个整数相减而得到负数?-黄文淑

回答:不可以实现,本程序会显示乱码。

程序代码:

unsigned char key_scan(void);

unsigned char key_vect(unsigned char keyValue);

voidsys_init();

#include "common.h"

#include "sys_init.h"

voidsys_init()

{

} P0|=0x80;

#include "reg52.h"

#define ADD 21

#define SUB 22

#define MUL 23

#define DIV 24

#define CLR 25

#define EQU 26

#define ERROR 27

void delay(unsigned char z);

#include "common.h"

void delay(unsigned char z)

{

}

voidLed_display(unsigned char wei,unsigned char duan); #include "common.h"

#include "display.h"

voidLed_display(unsigned char wei,unsigned char duan) {

} duan&=0x0f; wei&=0x07; P0=((7-wei)<<4)|duan|0x80; unsigned char x,y; for(x=50;x>0;x--) for(y=z;y>0;y--);

void Calculate(void);

voidNumberFormat(unsigned char bSec); voidresFormat(void);

#include "common.h"

#include "key.h"

#define KEYIO P2

unsigned char key_scan(void)

{

unsigned char row,col=0,k=0xff; KEYIO=0xf0; if((KEYIO&0xf0)==0xf0) return k; delay(10); if((KEYIO&0xf0)==0xf0) return k; for(row=0;row<4;row++) { KEYIO=~(1<<row); k=KEYIO&0xf0; if(k!=0xf0) { while(k&(1<<(col+4))) col++; k=row*4+col; KEYIO=0xf0; P0&=0x7f; while((KEYIO&0xf0)!=0xf0);

}

} } break; return k;

unsigned char key_vect(unsigned char keyValue) {

unsigned char nKey; switch(keyValue) { case 0: nKey=7; break; case 1: nKey=8; break; case 2: nKey=9; break; case 3: nKey=ADD; break; case 4: nKey=4; break; case 5: nKey=5; break;

case 6: nKey=6; break; case 7: nKey=SUB; break; case 8: nKey=1; break; case 9: nKey=2; break; case 10: nKey=3; break; case 11: nKey=MUL; break; case 12: nKey=0; break; case 13: nKey=CLR; break; case 14: nKey=EQU; break; case 15: nKey=DIV;

} } break; : default nKey=ERROR; return nKey;

#include "common.h"

#include "calculate.h"

#include "key.h"

#include "display.h"

unsigned char nkey;

signed char nValideLed=0,nLoop,FormatLoop,ResLoop; unsigned char keyValue[8];

unsigned long fstValue,secValue,resValue;

unsigned char MathWay=0;

voidNumberFormat(unsigned char bSec)

{

if(bSec) { secValue=0; FormatLoop=nValideLed; for(;FormatLoop>0;FormatLoop--) { unsigned long tmp=1; signed char tmp1=FormatLoop; for(;(tmp1-1)>0;tmp1--) tmp*=10; secValue+=keyValue[FormatLoop-1]*tmp;

}

} } else { } fstValue=0; FormatLoop=nValideLed; for(;FormatLoop>0;FormatLoop--) { } unsigned long tmp=1; signed char tmp1=FormatLoop; for(;(tmp1-1)>0;tmp1--) tmp*=10; fstValue+=keyValue[FormatLoop-1]*tmp;

voidresFormat(void)

{ signed char reschar=7;

for(;reschar>-1;reschar--) { } for(nValideLed=8;nValideLed>0;nValideLed--) unsigned long tmp=1; signed char tmp1=reschar; for(;tmp1>0;tmp1--) tmp*=10; keyValue[reschar]=(unsigned char)(resValue/tmp); resValue-=keyValue[reschar]*tmp;

}

{ } if(keyValue[nValideLed-1]!=0) break;

void Calculate(void)

{

nkey=key_vect(key_scan()); if(nkey!=ERROR) { if(nkey<10) { } else { switch(nkey) { case ADD: NumberFormat(0); nValideLed=0; keyValue[0]=0; nLoop=nValideLed; for(;nLoop>0;nLoop--) { keyValue[nLoop]=keyValue[nLoop-1]; } nValideLed++; keyValue[0]=nkey;

MathWay=1; break; case SUB: NumberFormat(0); nValideLed=0; keyValue[0]=0; MathWay=2; break; case MUL: NumberFormat(0); nValideLed=0; keyValue[0]=0; MathWay=3; break; case DIV: NumberFormat(0); nValideLed=0; keyValue[0]=0; MathWay=4; break; case CLR: nValideLed=0; keyValue[0]=0; MathWay=0; break; case EQU: NumberFormat(1); switch(MathWay) {

} } } } } case 1: resValue=fstValue+secValue; break; case 2: resValue=fstValue-secValue; break; case 3: resValue=fstValue*secValue; break; case 4: resValue=fstValue/secValue; break; resFormat(); break;

#include "reg52.h"

#include "common.h"

#include "display.h"

#include "sys_init.h"

#include "key.h"

#include "calculate.h"

extern signed char nValideLed; extern unsigned char keyValue[]; signed char DisplayLoop;

void main(void) {

} sys_init(); for(;;) { } Calculate(); DisplayLoop=nValideLed; if(DisplayLoop==0) { } else { for(;DisplayLoop>0;DisplayLoop--) { } Led_display(DisplayLoop-1,keyValue[DisplayLoop-1]); delay(5); Led_display(0,0); }

相关推荐