AT89C52/51单片机计算器-设计完成—独创—无抄袭---原产C语言设计--Xia—通信工程:1819533495本人QQ安庆师范学院通信工程08级AT89C524*4矩阵键盘设计已通过测试/**本单板机有点怪---实验矩阵键盘的时个要把板上JP2跳线帽拔了,否则第一排按键死了也不会做用。当然下载的时候还是要插上的*每按下一个按键蜂鸣器鸣响一次流水灯全亮一次*/本人介绍:1.程序开始时,数码(6位同时)从0至9显示-------测试数码管是否正常工作2.测试完成后,有对小数点的选择。。4-----无小数5----一位小数点6---两位小数点7---三位小数点(其它按键无影响,流水正常按程序流动)3.确定小数点后,数码管显示----接下来程序有最多小数点个数,回显三次4.所有工作完成后,数码只显示数字0(个位)---计算器正常开始工作5.计算过程序中,连按三次‘=’号,计算器恢复到最初的工作状态,看看流水灯变化就明白是否已恢复成功6.backspace在输入数字,错输时,每按一下,数字整除时,也就回到上一输入状态7程序设计---我用了Num_1为第一个输入数字,在输入数字时,点亮一个流水灯Num_2为第二个输入数字,在输入数字时,点亮二个流水灯当流水显示为三个灯亮的时候,说明这时候为Num_1和Num_2运算结果8.希望大家在此基础上改善。。。把程序改小点。。。叹,,8k不够用呀!!所有程序关系图----#includec51.h#includeclib.h/******************************************************************这下面是CLI。H自己写的小库#ifndef_C51_H_#define_C51_H_/*延时函数为0.1s为最小单元*/voiddelay01s(unsignedintmm){unsignedcharx,y,z;unsignedintvlau;for(vlau=mm;vlau0;vlau--)for(z=100;z0;z--)for(x=80;x0;x--)for(y=11;y0;y--);}//延时函数为1msunsignedchardelay1ms(unsignedintmm){unsignedcharx,y,z;unsignedintvlau;for(vlau=mm;vlau0;vlau--)for(z=10;z0;z--)for(x=8;x0;x--)for(y=11;y0;y--);return0}#endif*******************************************************************/#includeINTRINS.H#defineucharunsignedchar#defineuintunsignedint#defineulongunsignedlong/***********************************************************************table_light[]--------------为点灯个数的数组*table_duan[]---------------0到F最后一位无显示16个数*table_wei[]----------------共六位数码管从第一位到最后一位6个数********************************************************************/ucharcodetable_light[]={0XFF,0XFE,0XFC,0XF8,0XF0,0XE0,0XC0,0X80,0X00,0x7e,0x7c};ucharcodetable_duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,//数码管编码0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};ucharcodetable_wei[]={0x01,0x02,0x04,0x08,0x10,0x20};/***********************************************************************key_num----来记录哪个按键按下*Num_1----来记录数值1号*Num_f1----数值1号标记符**Num_2----来记录数值2号*Num_f2----数值2号标记符**Mark_1----记录第一次按键*Mark_2----记录+-*/=此特殊符号*flag_1----记录显示数字正负值*flag_2-----记录是否带有小数点*xsd_flag----初实化我们想要设定计算器有几位小数*unm--------每进入一次定时umn++一次定时时间为10MS**********************************************************************/floatNum_1;ucharNum_f1;floatNum_2;ucharNum_f2;ucharMark_1;ucharMark_2;floatNum_3;bitflag_1;ucharflag_2;ucharxsd_flag;uintnum;ucharrol=0xef;/*********************************************************************ge-----个位*shi----十位*bai----百位*qian---千位*wan----万位*shiwan-十万位*******************************************************************/ucharge;ucharshi;ucharbai;ucharqian;ucharwan;ucharshiwan;/**s2LCDENP3_4first_keyinterrupt0*S3RSP3_5second_keyinterrupt2*S4WRP3_6third_key*S5RDP3_7forth_key**//***************************************************************************由于电路设计关系,用了4X4矩阵键盘就不能用4个独立按键了*backspace为退格键*为了满足设计需要“=”号按两次为回到最初状态,即没有任何数据存在*P3_0--123+*P3_1--456-*P3_2--789x*P3_3--0=backspace/*||||*P3_4P3_5P3_6P3_7*************************************************************************/voidFM(uchartimes);voidlight(ucharnumber);//voidkey_test(ucharkey);ucharkey_matrix(void);voidoperation(ucharfh);voidinition(void);voidtest_shumaguan(uchar);voiddisplay(floatnumber);voidTime0_Init(void);voidmain(void){test_shumaguan(0);inition();Time0_Init();while(1){operation(key_matrix());if(Num_1==4||Num_1==5||Num_1==6||Num_1==7){xsd_flag=Num_1-4;light(Num_1);test_shumaguan(1);Num_1=0;Mark_1='n';break;}else{Num_1=0;Num_f1=1;}P1=rol;rol=_crol_(rol,1);delay1ms(100);FM(1);}while(1){P3=0XF0;if(0XF0!=P3){operation(key_matrix());}if(1==Num_f1){display(Num_1);light(1);}elseif(2==Num_f1){display(Num_2);light(2);}elseif(3==Num_f1){display(Num_1);light(3);}}}/****************************************************************************voidinition_shumaguan(void);*对数码进行测试-----是否所有数码都有效*************************************************************************/voidtest_shumaguan(ucharchoose){ucharx;switch(choose){case0:for(x=0;x=9;x++){light(x);P2_6=0;P0=table_duan[x];P2_6=1;P2_6=0;delay1ms(100);P2_7=0;P0=0;P2_7=1;P2_7=0;delay1ms(150);FM(1);}P2_7=0;P0=0xff;P2_7=1;P2_7=0;break;case1:switch(xsd_flag){case0:TR0=1;for(x=0;x3;x++){num=0;P2_6=0;P0=table_duan[0];P2_6=1;P2_6=0;P2_7=0;P0=~table_wei[5];P2_7=1;P2_7=0;while(num=50);num=0;P2_7=0;P0=0xff;P2_7=1;P2_7=0;while(num=50);}TR0=0;break;case1:TR0=1;for(x=0;x3;x++){num=0;while(1){P2_6=0;P0=table_duan[0];P2_6=1;P2_6=0;P2_7=0;P0=~table_wei[5];P2_7=1;P2_7=0;delay1ms(1);P2_6=0;P0=table_duan[0]+0x80;P2_6=1;P2_6=0;P2_7=0;P0=~table_wei[4];P2_7=1;P2_7=0;delay1ms(1);if(num=50){num=0;break;}}P2_7=0;P0=0xff;P2_7=1;P2_7=0;while(num=50);}TR0=0;break;case2:TR0=1;for(x=0;x3;x++){num=0;while(1){P2_6=0;P0=table_duan[0];P2_6=1;P2_6=0;P2_7=0;P0=~table_wei[5];P2_7=1;P2_7=0;delay1ms(1);P2_6=0;P0=table_duan[0];P2_6=1;P2_6=0;P2_7=0;P0=~table_wei[4];P2_7=1;P2_7=0;delay1ms(1);P2_6=0;P0=table_duan[0]+0X80;P2_6=1;P2_6=0;P2_7=0;P0=~table_wei[3];P2_7=1;P2_7=0;delay1ms(1);if(num=50){num=0;break;}}P2_7=0;P0=0xff;P2_7=1;P2_7=0;while(num=50);}TR0=0;break;case3:TR0=1;for(x=0;x3;x++){num=0;while(1){P2_6=0;P0=table_duan[0];P2_6=1;P