文章目录
- 一、功能简介
- 二、软件设计
- 三、实验现象
- 联系作者
一、功能简介
本项目使用Proteus8仿真51单片机控制器,使动态数码管、矩阵按键、蜂鸣器等。
主要功能:
系统运行后,数码管默认显示0,输入对应的操作数进行四则运算,支持最大8位显示,支持显示小数点后2位数。
二、软件设计
/*
作者:嗨小易(QQVIP群2:570487280)*///将整数各位取出存放数组
//num:转换的整数
//buf:转换后存储到数组内
//返回值:整数的长度
u8 int_to_array(u32 num,u8 buf[])
{u8 i=0;u8 tempbuf[SMG_SHOW_BITNUM];char j=0;u8 cnt=0;if(num!=0)//传入的数据不为0{while(num!=0){tempbuf[i]=num%10;//将各个位的数赋值于数组tempbuf[i]num/=10;//现在数组tempbuf[i]记录的是各个位上的数的反序i++;//i记录这个数是几位数 }for(j=i-1;j>=0;j--){buf[cnt++]=gsmg_code[tempbuf[j]]; } }else//传入的数据为0buf[cnt++]=gsmg_code[0]; return cnt;
}//计算结果并显示
void get_result_show(void)
{u8 smgbuf[SMG_SHOW_BITNUM];u8 bitnum=0;u8 key=0;u8 buf[3];//缓存显示小数的数据while(1){key=key_matrix_flip_scan();if(key==14) //清除操作{sys_ctr_sys.equal=0;sys_ctr_sys.sign=0;sys_ctr_sys.curNum=0;sys_ctr_sys.preNum=0;sys_ctr_sys.dot=0;break;}//等号键、计算结果if(sys_ctr_sys.equal==SIGN_EQUAL){switch(sys_ctr_sys.sign){case SIGN_ADD: sys_ctr_sys.result=sys_ctr_sys.preNum+sys_ctr_sys.curNum;break;case SIGN_MIN: if(sys_ctr_sys.preNum<sys_ctr_sys.curNum)sys_ctr_sys.result=sys_ctr_sys.curNum-sys_ctr_sys.preNum;elsesys_ctr_sys.result=sys_ctr_sys.preNum-sys_ctr_sys.curNum;break;case SIGN_MUL: sys_ctr_sys.result=sys_ctr_sys.preNum*sys_ctr_sys.curNum;break;case SIGN_DIV: if(sys_ctr_sys.curNum!=0)sys_ctr_sys.result=(float)sys_ctr_sys.preNum/sys_ctr_sys.curNum;if(sys_ctr_sys.result!=(int)sys_ctr_sys.result)//有小数,保留小数后2位{sys_ctr_sys.result=sys_ctr_sys.result*100;sys_ctr_sys.dot=2;}break;}bitnum=int_to_array(sys_ctr_sys.result,smgbuf);if(sys_ctr_sys.dot)//有小数显示{if(sys_ctr_sys.result<10)//放大100倍结果小于10,比如0.01{buf[0]=0x3f|0x80;buf[1]=0x3f;buf[2]=smgbuf[0];smg_display(buf,SMG_SHOW_BITNUM-1-bitnum); }else if(sys_ctr_sys.result<100)//放大100倍结果小于100,比如0.12{buf[0]=0x3f|0x80;buf[1]=smgbuf[0];buf[2]=smgbuf[1];smg_display(buf,SMG_SHOW_BITNUM-bitnum); }else{smgbuf[bitnum-1-sys_ctr_sys.dot]|=0x80;smg_display(smgbuf,SMG_SHOW_BITNUM+1-bitnum); } }else //无小数显示 smg_display(smgbuf,SMG_SHOW_BITNUM+1-bitnum);sys_ctr_sys.sign=0; }else{sys_ctr_sys.equal=0;break;} }
}//计算器控制系统
void cal_cotrol_sys(void)
{while(1){get_pre_num_show();//获取第1个计算数并显示 get_cur_num_show();//获取第2个计算数并显示get_result_show();//计算结果并显示}
}
三、实验现象
B站演示视频:https://space.bilibili.com/444388619
联系作者
视频地址:https://space.bilibili.com/444388619/video
专注于51单片机、STM32、国产32、DSP、Proteus、arduino、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。