找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7075|回复: 5
打印 上一主题 下一主题
收起左侧

基于STM32F103RCT6的简易计算器、简易密码锁程序

  [复制链接]
跳转到指定楼层
楼主
分享一篇个人的博客,如有错误,请各位指出,不胜感激
https://blog.csdn.net/weixin_46757367/article/details/118395307

以下程序所使用的GPIO口是不连续的,使用者应注意。



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. }


  113. /*******************************************************************************
  114. * 函 数 名       : Select()
  115. * 函数功能                          : 判断按键的类型
  116. * 输    入       : 无
  117. * 输    出       : 无
  118. *******************************************************************************/
  119. void Select(void)
  120. {
  121.         uint flag;
  122.         int Keyvalue;
  123.         while( (Keyvalue=(int)KEY_Input())==16 );//读取键值
  124.         if(Keyvalue<10)//数字键
  125.                 flag = 1;
  126.         else if(Keyvalue>10 && Keyvalue<16)//符号键
  127.                 flag = 2;
  128.         else if(Keyvalue==10)//清零键
  129.                 flag = 3;
  130.        
  131.         switch( flag )
  132.         {
  133.                 case 1: //数字
  134.                         LCDWriteData(num[Keyvalue]);
  135.                         if(FLAG==0)        //运算符前的数字
  136.                         {
  137.                                 Num_1 = Num_1 * 10 + Keyvalue;
  138.                                 Select();
  139.                         }
  140.                         if(FLAG>=1 && FLAG_X!=1)        //运算符后的数字
  141.                         {
  142.                                 Num_2 = Num_2 * 10 + Keyvalue;
  143.                                 Select();
  144.                         }
  145.                         break;
  146.                 case 2: //字符
  147.                         if(Keyvalue==11)                                FLAG_X = 1;//'='
  148.                         else if(Keyvalue==12)                FLAG          = 1;//'/'
  149.                         else if(Keyvalue==13)                FLAG          = 2;//'*'
  150.                         else if(Keyvalue==14)                FLAG          = 3;//'-'
  151.                         else if(Keyvalue==15)                FLAG   = 4;//'+'
  152.                         Yunsuan(Keyvalue);
  153.                         break;
  154.                 case 3: //清零
  155.                         LCDWriteCom(0x01);
  156.                         Num_1 = Num_2 = FLAG = FLAG_X = Tatal = 0;
  157.                         break;
  158.         }
  159. }
复制代码


全部资料51hei下载地址:
简易计算器程序.7z (181.77 KB, 下载次数: 268)
简易密码锁程序.7z (179.63 KB, 下载次数: 144)

1、现代电子技术期末作品原理图.rar

1.41 MB, 下载次数: 79, 下载积分: 黑币 -5

2、期末作品原理图 程序流程图.pdf

335.15 KB, 下载次数: 65, 下载积分: 黑币 -5

评分

参与人数 1黑币 +60 收起 理由
admin + 60 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶4 踩
回复

使用道具 举报

沙发
ID:947480 发表于 2021-7-22 08:56 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:146782 发表于 2021-7-29 09:57 | 只看该作者
有源代码的吗
回复

使用道具 举报

地板
ID:1058512 发表于 2023-1-14 11:41 | 只看该作者

好资料,51黑有你更精彩!!!
回复

使用道具 举报

5#
ID:1062205 发表于 2023-2-11 15:19 | 只看该作者

这个特别好
回复

使用道具 举报

6#
ID:1075951 发表于 2023-5-7 23:08 | 只看该作者
只有程序没有仿真,自己连的运行不了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表