芯片解密|单片机解密|IC解密|芯片破解|芯片复制| PCB抄板|软件开发

飞芯科技-芯片解密|单片机解密|IC解密|芯片破解|芯片复制| PCB抄板|软件开发

单片机解密STM32F103RCT6的简易计算器、简易密码锁

单片机解密STM32单片机源程序如下:

  1. /*******************************************************************************
  2. * 项目名称       : 单片机解密简易计算器
  3. * 项目功能                          : 1、矩阵键盘输入,LCD1602显示数字、符号
  4.                                                                          2、实现 两个 正整数 的加减乘除,结果精确至小数点后两位
  5. * 修改内容                         : 2021.6.27(完成功能1、2)
  6. * 项目缺陷                          : 1、不能进行连续的运算,即每次只能进行两个数的加减乘除
  7.                                                                          2、不能进行负数、小数以及其它更复杂的运算
  8.                                                                          3、其它
  9. * 注意事项                         : 无
  10. *******************************************************************************/

  11. #include "calculator_main.h"

  12. void Result(float fin);
  13. void Yunsuan(uint dat1);
  14. void Select(void);

  15. uchar num[] = {'0','1','2','3','4','5','6','7','8','9'};
  16. uchar CHAR[] = {'=','/','*','-','+'};
  17. int Num_1=0,Num_2=0;//用以存储运算符前后的两个数
  18. static float Tatal = 0;//存储运算结果
  19. uint FLAG = 0, FLAG_X = 0;

  20. int main(void)
  21. {
  22.         //delay_init();
  23.         LCD_Init();
  24.         KEY_Init();
  25.         while(1)
  26.         {
  27.                 Select();
  28.         }
  29. }



  30. /*******************************************************************************
  31. * 函 数 名       : Result()
  32. * 函数功能                          : 在LCD1602第2行显示运算结果
  33. * 输    入       : 运算结果
  34. * 输    出       : 无
  35. *******************************************************************************/
  36. void Result(float fin)
  37. {
  38.         uint k;
  39.         char buf[16];
  40.         LCDWriteCom(0xc0);                //设置数据指针起点:第二行,第一个
  41.         LCDWriteData('=');
  42.         sprintf(buf,"%.2f",fin);//将结果 fin 转化为字符串 buf,然后向LCD1602打印
  43.         for(k=0;k<strlen(buf);k++)
  44.                 LCDWriteData(buf[k]);
  45. }


  46. /*******************************************************************************
  47. * 函 数 名       : Yunsuan()
  48. * 函数功能                          : 按下运算符键的处理
  49. * 输    入       : 键值
  50. * 输    出       : 无
  51. *******************************************************************************/
  52. void Yunsuan(uint dat1)
  53. {
  54.         switch( CHAR[dat1-11] )//**********************************加减乘除
  55.         {
  56.                 case '/':
  57.                         LCDWriteData('/');
  58.                         Select();
  59.                         if(FLAG==0)                                                                                         break;//若清零
  60.                         else if(FLAG>=1 && FLAG_X!=1)                        Select();//若为运算符键,则继续检测按键
  61.                         else if(FLAG_X==1)                                                                Yunsuan(11);//'='
  62.                         break;
  63.                 case '*':
  64.                         LCDWriteData('*');
  65.                         Select();
  66.                         if(FLAG==0)                                                                                         break;//若清零
  67.                         else if(FLAG>=1 && FLAG_X!=1)                        Select();//若为运算符键,继续检测按键
  68.                         else if(FLAG_X==1)                                                                Yunsuan(11);//'='
  69.                         break;
  70.                 case '-':
  71.                         LCDWriteData('-');
  72.                         Select();
  73.                         if(FLAG==0)                                                                                         break;//若清零
  74.                         else if(FLAG>=1 && FLAG_X!=1)                        Select();//若为运算符键,继续检测按键
  75.                         else if(FLAG_X==1)                                                                Yunsuan(11);//'='
  76.                         break;
  77.                 case '+':
  78.                         LCDWriteData('+');
  79.                         Select();
  80.                         if(FLAG==0)                                                                                         break;//若清零
  81.                         else if(FLAG>=1 && FLAG_X!=1)                        Select();//若为运算符键,继续检测按键
  82.                         else if(FLAG_X==1)                                                                Yunsuan(11);//'='
  83.                         break;
  84.                 case '=':
  85.                         if( (Num_1>0||Num_1==0) && Num_2==0 )
  86.                         {
  87.                                 Tatal = (float)Num_1;
  88.                                 if(FLAG==1||FLAG==2)        Tatal = 0;
  89.                         }
  90.                         else if(Num_1==0 && Num_2!=0 && FLAG!=0 )
  91.                         {
  92.                                 switch(FLAG)
  93.                                 {
  94.                                         default: Tatal = 0; break;
  95.                                         case 3:  Tatal = (float)Num_1 - (float)Num_2;                break;
  96.                                         case 4:  Tatal = (float)Num_1 + (float)Num_2;         break;
  97.                                 }
  98.                         }
  99.                         else if(Num_1!=0 && Num_2!=0 && FLAG!=0 )
  100.                         {
  101.                                 switch(FLAG)
  102.                                 {
  103.                                         case 1:  Tatal = (float)Num_1 / (float)Num_2;                break;
  104.                                         case 2:  Tatal = (float)Num_1 * (float)Num_2;         break;
  105.                                         case 3:  Tatal = (float)Num_1 - (float)Num_2;                break;
  106.                                         case 4:  Tatal = (float)Num_1 + (float)Num_2;         break;
  107.                                 }
  108.                         }
  109.                         Result(Tatal);
  110.                         break;
  111.         }
  112. }



联系方式

地址:石家庄市新华区民族路77号华强广场D座2009
电话:0311-88816616/87087811
手机:13315190088
传真:0311-67901001
联系人:张工
网址:www.feixindz.com
邮箱:feixindz@163.com
微信:xinpianjiemi
QQ:527263666/568069805

在线客服
热线电话

企业微信