|
分享一篇个人的博客,如有错误,请各位指出,不胜感激
https://blog.csdn.net/weixin_46757367/article/details/118395307
以下程序所使用的GPIO口是不连续的,使用者应注意。
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;
- }
- }
- /*******************************************************************************
- * 函 数 名 : Select()
- * 函数功能 : 判断按键的类型
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void Select(void)
- {
- uint flag;
- int Keyvalue;
- while( (Keyvalue=(int)KEY_Input())==16 );//读取键值
- if(Keyvalue<10)//数字键
- flag = 1;
- else if(Keyvalue>10 && Keyvalue<16)//符号键
- flag = 2;
- else if(Keyvalue==10)//清零键
- flag = 3;
-
- switch( flag )
- {
- case 1: //数字
- LCDWriteData(num[Keyvalue]);
- if(FLAG==0) //运算符前的数字
- {
- Num_1 = Num_1 * 10 + Keyvalue;
- Select();
- }
- if(FLAG>=1 && FLAG_X!=1) //运算符后的数字
- {
- Num_2 = Num_2 * 10 + Keyvalue;
- Select();
- }
- break;
- case 2: //字符
- if(Keyvalue==11) FLAG_X = 1;//'='
- else if(Keyvalue==12) FLAG = 1;//'/'
- else if(Keyvalue==13) FLAG = 2;//'*'
- else if(Keyvalue==14) FLAG = 3;//'-'
- else if(Keyvalue==15) FLAG = 4;//'+'
- Yunsuan(Keyvalue);
- break;
- case 3: //清零
- LCDWriteCom(0x01);
- Num_1 = Num_2 = FLAG = FLAG_X = Tatal = 0;
- break;
- }
- }
复制代码
全部资料51hei下载地址:
简易计算器程序.7z
(181.77 KB, 下载次数: 278)
简易密码锁程序.7z
(179.63 KB, 下载次数: 156)
|
评分
-
查看全部评分
|