燕山大学课程设计说明书-1-摘要一般情况下,在进行大量数据运算时,用计算器比手算正确率更高,速度更快。我此次就是利用单片机,LED显示器,键盘和伟福系统设计一个简单的计算器。实现加,减,乘,除,平方,根号等功能。燕山大学课程设计说明书-2-目录第一章概述……………………………………………………………3第二章原理……………………………………………………………4第三章原始程序………………………………………………………8第四章改进后的程序…………………………………………………14第五章地址计算………………………………………………………20第六章总结……………………………………………………………22参考文献…………………………………………………………………23燕山大学课程设计说明书-3-第一章概述一个计算器基本需要键盘实现输入功能,显示器实现显示功能。再经过单片机系统和正确的程序实现计算。LED显示器电路,键盘扫描电路。如下图所示:本设计使用了6位8段LED显示器,它按程序要求显示输入数字和计算结果。本实验还用到一个6*4的小键盘,使用它输入数字和符号指令,它向列扫描码地址输出低电平,然后从行码地址读回。原程序实现了加减乘除,清零5项功能。改编后的程序增加了平方和开根号两项功能。燕山大学课程设计说明书-4-第二章原理1.LED显示器本设计使用了6位8段LED显示器,它按程序要求显示输入数字和计算结果为了显示字符,要为LED显示器提供显示断码,组成一个8字形字符7段,再加上一个小数点,共计8段。因此LED显示器的显示断码为一个字节。各断码位的对应关系如下:断码位D7D6D5D4D3D2D1D0显示段dpgfedcba本设计中采用共阴极方式。7段LED显示器字码如下:燕山大学课程设计说明书-5-字符0123456789字符码0x3f0x060x5b0x4f0x660x6d0x7d0x070x7f0x6fLED显示器有静态显示和动态显示两种控制方式。位数太多时,用静态显示所需I/O口太多,不经济。所以本设计中使用动态显示。即用扫描的方法一位一位轮流点亮显示器各位。2.键盘键盘是由6*4的开关矩阵,它是最简单的单片机输入设备,可以通过它输入数据或指令。实现简单的人机对话。可以通过延时的方法实现键盘的去抖动。而且为了实现功能多样化,需要采用编码键盘。键盘的硬件电路如下:燕山大学课程设计说明书-6-3.程序流程图先是对输入输出数字先是的程序流程图,如下:开始数值0无符号位符号位显示‘-’否是数值对10取模,送显示最低位数值除以10数值为0?返回是显示位上移数值对10取模,送显示位燕山大学课程设计说明书-7-总的计算流程图如下:燕山大学课程设计说明书-8-第三章原程序KEYLEDCS连接片选CS1所以位控制口地址0x9002,段控制口地址地址0x9004,键盘读入口地址0x9001.根据流程图所示编译程序和注释如下:#defineLEDLen6#definePB12#definePB01xdataunsignedcharOUTBIT_at_0x9002;//位控制口xdataunsignedcharOUTSEG_at_0x9004;//段控制口xdataunsignedcharIN_at_0x9001;//键盘读入口unsignedcharLEDBuf[LEDLen];//显示缓冲unsignedcharLEDMAP[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71//八段管显示码};voidDelay(unsignedcharCNT)//延时程序{unsignedchari;while(CNT--!=0)for(i=100;i!=0;i--);}voidDisplayLED(){unsignedchari;unsignedcharPos;unsignedcharLED;Pos=0x20;//从左边开始显示for(i=0;iLEDLen;i++){燕山大学课程设计说明书-9-OUTBIT=0;//trunoffallLEDLED=LEDBuf[i];OUTSEG=LED;OUTBIT=Pos;//trunononeLEDDelay(1);Pos=1;//显示下一位}}unsignedcharKeyTable[]={0x16,0x15,0x14,0xff,0x13,0x12,0x11,0x10,0x0d,0x0c,0x0b,0x0a,0x0e,0x03,0x06,0x09,0x0f,0x02,0x05,0x08,0x00,0x01,0x04,0x07};//键码定义unsignedcharTestKey(){OUTBIT=0;//输出线置为0return(~IN&0x0f);//读入键状态(高四位不用)}unsignedcharGetKey(){unsignedcharPos;unsignedchari;unsignedchark;i=6;Pos=0x20;//找出键所在列do{燕山大学课程设计说明书-10-OUTBIT=~Pos;Pos=1;k=~IN&0x0f;}while((--i!=0)&&(k==0));//键值=列x4+行if(k!=0){i*=4;if(k&2)i+=1;elseif(k&4)i+=2;elseif(k&8)i+=3;OUTBIT=0;doDelay(10);while(TestKey());//等键释放return(KeyTable[i]);//取出键码}elsereturn(0xff);}/*========================================================================================*/#defineADD0x0a#defineSUB0x0b#defineMUL0x0c#defineDIV0x0d#defineEQU0x0e#defineCLR0x0f//功能键定义voidDisplayResult(signedintResult)燕山大学课程设计说明书-11-//数值显示方法{unsignedchari;if(Result=0){//数值大于0//不显示符号位LEDBuf[0]=0;}else{//在符号位显示‘-’LEDBuf[0]=0x40;Result=-Result;}LEDBuf[1]=0;LEDBuf[2]=0;LEDBuf[3]=0;LEDBuf[4]=0;//数值对10取模,所得结果为最低位LEDBuf[5]=LEDMAP[Result%10];Result=Result/10;i=4;//如果数值除以10后不等于0,继续向高位显示while(Result!=0){LEDBuf[i--]=LEDMAP[Result%10];Result=Result/10;}}voidmain(){signedintLast,Result;unsignedcharOP;unsignedcharKey;Last=0;Result=0;OP=ADD;DisplayResult(Result);燕山大学课程设计说明书-12-while(1){while(!TestKey())DisplayLED();//读取键码Key=GetKey();if((Key=0)&&(Key=9)){//是数字键//输入数值Result=Result*10+Key;//数值送显示缓冲DisplayResult(Result);}elseif(Key==CLR){//是清零键//状态清零Last=0;Result=0;OP=ADD;//数值送显示缓冲DisplayResult(Result);}elseif((Key==ADD)||(Key==SUB)||(Key==MUL)||(Key==DIV)||(Key==EQU)){//是功能键switch(OP){//上一按键是?caseADD:Result=Last+Result;break;//加法计算caseSUB:Result=Last-Result;break;//减法计算caseMUL:Result=Last*Result;break;//乘法计算caseDIV:Result=Last/Result;燕山大学课程设计说明书-13-break;//除法计算}if(Key==EQU){//功能键是‘=’//计算最后结果Last=0;OP=ADD;}else{//是其它功能键//保存结果,保存按键功能Last=Result;OP=Key;}//计算值送显示缓冲,DisplayResult(Result);//等待下一个数值输入.Result=0;}}}以上程序实现了加减乘除和清零功能。上机实验后,调试执行,验证程序正确有效。燕山大学课程设计说明书-14-第四章改进的程序增加平方和开根号的功能:Result=Result*Result;Result=sqrt(Result);由于用到了开根号函数,所以需要增加#includemath.h声明。改进后的程序输入电脑,连接实验箱调试改进。最后改进后的完整正确且有效的程序如下:#defineLEDLen6#definePB12#definePB01#includemath.hxdataunsignedcharOUTBIT_at_0x9002;xdataunsignedcharOUTSEG_at_0x9004;//段控制口xdataunsignedcharIN_at_0x9001;unsignedcharLEDBuf[LEDLen];unsignedcharLEDMAP[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voidDelay(unsignedcharCNT){unsignedchari;while(CNT--!=0)for(i=100;i!=0;i--);}voidDisplayLED(){unsignedchari;unsignedcharPos;燕山大学课程设计说明书-15-unsignedcharLED;Pos=0x20;for(i=0;iLEDLen;i++){OUTBIT=0;//trunoffallLEDLED=LEDBuf[i];OUTSEG=LED;OUTBIT=Pos;//trunononeLEDDelay(1);Pos=1;}}unsignedcharKeyTable[]={0x16,0x15,0x14,0xff,0x13,0x12,0x11,0x10,0x0d,0x0c,0x0b,0x0a,0x0e,0x03,0x06,0x09,0x0f,0x02,0x05,0x08,0x00,0x01,0x04,0x07};unsignedcharTestKey(){OUTBIT=0;return(~IN&0x0f);}unsignedcharGetKey(){unsignedcharPos;unsignedchari;unsignedchark;i=6;Pos=0x20;do{燕山大学课程设计说明书-16-OUTBIT=~Pos;Pos=1;k=~IN&0x0f;}while((--i!=0)&&(k==0));if(k!=0){i*=4;if(k&2)i+=1;elseif(k&4)i+=2;elseif(k&8)i+=3;OUTBIT=0;doDelay(10);while(TestKey());return(KeyTable[i]);}elsereturn(0xff);}/*========================================================================================*/#def