单片机解密STM32F103RCT6的简易计算器、简易密码锁
单片机解密STM32单片机源程序如下:
- /*******************************************************************************
- * 项目名称 : 单片机解密简易计算器
- * 项目功能 : 1、矩阵键盘输入,LCD1602显示数字、符号
- 2、实现 两个 正整数 的加减乘除,结果精确至小数点后两位
- * 修改内容 : 2021.6.27(完成功能1、2)
- * 项目缺陷 : 1、不能进行连续的运算,即每次只能进行两个数的加减乘除
- 2、不能进行负数、小数以及其它更复杂的运算
- 3、其它
- * 注意事项 : 无
- *******************************************************************************/
- #include "calculator_main.h"
- void Result(float fin);
- void Yunsuan(uint dat1);
- void Select(void);
- uchar num[] = {'0','1','2','3','4','5','6','7','8','9'};
- uchar CHAR[] = {'=','/','*','-','+'};
- int Num_1=0,Num_2=0;//用以存储运算符前后的两个数
- static float Tatal = 0;//存储运算结果
- uint FLAG = 0, FLAG_X = 0;
- int main(void)
- {
- //delay_init();
- LCD_Init();
- KEY_Init();
- while(1)
- {
- Select();
- }
- }
- /*******************************************************************************
- * 函 数 名 : Result()
- * 函数功能 : 在LCD1602第2行显示运算结果
- * 输 入 : 运算结果
- * 输 出 : 无
- *******************************************************************************/
- void Result(float fin)
- {
- uint k;
- char buf[16];
- LCDWriteCom(0xc0); //设置数据指针起点:第二行,第一个
- LCDWriteData('=');
- sprintf(buf,"%.2f",fin);//将结果 fin 转化为字符串 buf,然后向LCD1602打印
- for(k=0;k<strlen(buf);k++)
- LCDWriteData(buf[k]);
- }
- /*******************************************************************************
- * 函 数 名 : Yunsuan()
- * 函数功能 : 按下运算符键的处理
- * 输 入 : 键值
- * 输 出 : 无
- *******************************************************************************/
- void Yunsuan(uint dat1)
- {
- switch( CHAR[dat1-11] )//**********************************加减乘除
- {
- case '/':
- LCDWriteData('/');
- Select();
- if(FLAG==0) break;//若清零
- else if(FLAG>=1 && FLAG_X!=1) Select();//若为运算符键,则继续检测按键
- else if(FLAG_X==1) Yunsuan(11);//'='
- break;
- case '*':
- LCDWriteData('*');
- Select();
- if(FLAG==0) break;//若清零
- else if(FLAG>=1 && FLAG_X!=1) Select();//若为运算符键,继续检测按键
- else if(FLAG_X==1) Yunsuan(11);//'='
- break;
- case '-':
- LCDWriteData('-');
- Select();
- if(FLAG==0) break;//若清零
- else if(FLAG>=1 && FLAG_X!=1) Select();//若为运算符键,继续检测按键
- else if(FLAG_X==1) Yunsuan(11);//'='
- break;
- case '+':
- LCDWriteData('+');
- Select();
- if(FLAG==0) break;//若清零
- else if(FLAG>=1 && FLAG_X!=1) Select();//若为运算符键,继续检测按键
- else if(FLAG_X==1) Yunsuan(11);//'='
- break;
- case '=':
- if( (Num_1>0||Num_1==0) && Num_2==0 )
- {
- Tatal = (float)Num_1;
- if(FLAG==1||FLAG==2) Tatal = 0;
- }
- else if(Num_1==0 && Num_2!=0 && FLAG!=0 )
- {
- switch(FLAG)
- {
- default: Tatal = 0; break;
- case 3: Tatal = (float)Num_1 - (float)Num_2; break;
- case 4: Tatal = (float)Num_1 + (float)Num_2; break;
- }
- }
- else if(Num_1!=0 && Num_2!=0 && FLAG!=0 )
- {
- switch(FLAG)
- {
- case 1: Tatal = (float)Num_1 / (float)Num_2; break;
- case 2: Tatal = (float)Num_1 * (float)Num_2; break;
- case 3: Tatal = (float)Num_1 - (float)Num_2; break;
- case 4: Tatal = (float)Num_1 + (float)Num_2; break;
- }
- }
- Result(Tatal);
- break;
- }
- }

芯片解密