找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于stm32简易计算器制作(lcd1602显示)源程序

  [复制链接]
跳转到指定楼层
楼主
这是我前几天用stm32f03c8t6单片机做的一个简易计算器,用4×4矩阵键盘输入,LCD1602显示。下面是对我计算器的介绍,附件中还可以下载源程序代码码。我的简易计算器是搭建在面包板上面的,下面这是实物图和仿真图。
      



该计算器可以实现连续加减运算图:


   
较大数字或者较小数字可以用科学计数法显示
       

当用除法运算时,能够保留三位小数字
   

另外,在运算时还可以通过串口观察数据变化

下面是部分源码:
#include "stm32f10x.h"
#include "delay.h"
#include "keyscan.h"
#include "LCD1602.h"
#include "usart.h"
#include "math.h"
u8 num,flag;
double r,o;
long long a,b,x,y,z,sum,k;
int e,f,g,h,i,t,len,w,l;
int s,m,w,j,q,d,n,c=0;

int main()
{
        LCD_init();
        uart_init(9600);

        while(1)
        {
          num=keyscan();
                a=num;
                                if(a>=0&&a<=9&&s!=2&&flag!=0)
                                {
                                        if(a!=0||n!=0)
                                        {
                                                LCD_write_data((u8)a+0x30);
                                                if(n==0)
                                                {
                                                        b=a;
                                                }
                                                else
                                                {
                                                        b=sum*10;
                                                        sum=a;
                                                }
                                                sum=sum+b;
///////////////////////////////                        
            if(q==0&&j==0)
            {                                 
                                                                x=sum;
                                                                printf("x=%lld ",x);
                                                                d=1;
                                                                m=0;
            }

                       if(q==1&&j==1)
                                         {
                                                                x=-sum;
                                                                printf("x=%lld ",x);
                                                                d=1;
                                                                m=0;
            }

/////////////////////////////////

            if(q==1&&(j==2||j==0))
            {                    
              y=sum;
                                                        printf("y=%lld ",y);
                                                        d=2;
            }


/////////////////////////////////
            n++;
                                                w++;
                                    delay_ms(100);
                                  }
                         }
                        if(a==10&n!=0&&m!=1&&flag!=0)//+
                   {
                                  if(c>=1)
                                        {
                                        q=1;
                                        j=0;
                                        x=z;

                                        }
                      //LCD_write_data('+');
                                        LCD_write_data(0x2b);
                                        printf(" + ");
                                        j=0;
                                        n=0;
                                        q=1;
                                        flag=1;
                                        b=0;
                                        sum=0;
                                  c++;
                                  w++;

                                        delay_ms(100);
                         }
                        if(a==11&&m!=1&&flag!=0)
                        {
                                //LCD_write_data('-');
                          LCD_write_data(0x2d);//''
                                printf(" - ");
                                if(c>=1)
                                        {
                                        q=1;
                                        j=0;
                                        x=z;

                                        }

                          if(d==0)
                                {
                                j=1;
                                }
                                if(d==1)
                                {
                                j=2;
                                }

                    n=0;
        q=1;
        flag=2;
                          b=0;
                          sum=0;
                          m=-m;
                          w++;
                                c++;
                                delay_ms(100);
                 }

                if(a==12&n!=0&&m!=1&&flag!=0)
                {
                          LCD_write_data('*');//×
                                //LCD_write_data(0x2a);//×
                          if(c>=1)
                                        {
                                        q=1;
                                        j=0;
                                        x=z;

                                        }
                                printf(" * ");
                          j=0;
        n=0;
        q=1;
        flag=3;
                          b=0;
                          sum=0;
                          m=-m;
                          w++;
                                c++;
                                delay_ms(100);
                }
                if(a==13&n!=0&&m!=1&&flag!=0)
                {
                        // LCD_write_data('');//除号
                                LCD_write_data(0xfd);//÷
                          if(c>=1)
                                        {
                                        q=1;
                                        j=0;
                                        x=z;

                                        }
                                printf("/");
有需要的小伙伴可以到附件中去下载全部代码。
由于本人储备知识量较少,基础较为薄弱,计算器中使用变量较多,代码较为繁琐,感兴趣的小伙伴们可以在评论区相互探讨学习,若计算器中还存在问题,也希望大家可以指正批评。
最后,感谢大家的支持!!!

全部资料51hei下载地址:
stm32计算器.7z (197.07 KB, 下载次数: 677)

评分

参与人数 2黑币 +62 收起 理由
Morpho + 12 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:328014 发表于 2020-11-18 05:11 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:863205 发表于 2020-12-19 11:17 | 只看该作者
谢谢谢谢,太棒了
回复

使用道具 举报

地板
ID:863205 发表于 2020-12-19 11:42 | 只看该作者
请问一下,电路图中这个PR1是什么啊,求赐教
回复

使用道具 举报

5#
ID:863205 发表于 2020-12-19 15:08 | 只看该作者
您好,我想向您请教一下,我按照您的这个电路图连接的实物,但是没有连那个排阻,现在lcd背光亮,但是按动键盘没有显示数字,能请您给我点建议吗,求赐教
回复

使用道具 举报

6#
ID:687531 发表于 2020-12-23 21:04 | 只看该作者
9876k 发表于 2020-12-19 11:42
请问一下,电路图中这个PR1是什么啊,求赐教

电路图中的PR1是排阻,接实物图时可以不要,最好不要用proteus仿真stm32,目前版本效果一点都不好,我的8.9版本勉强仿真出来LCD1602,但是它现实的延时有问题,我这是方便大家看接线图才在上面画的
回复

使用道具 举报

7#
ID:687531 发表于 2020-12-23 21:09 | 只看该作者
9876k 发表于 2020-12-19 15:08
您好,我想向您请教一下,我按照您的这个电路图连接的实物,但是没有连那个排阻,现在lcd背光亮,但是按动 ...

仿真图上面的VEE(实物LCD1602那里是V00),我的这里是为了方便就直接接地了,最好接一个电位器,用来调节显示对比度
回复

使用道具 举报

8#
ID:343451 发表于 2020-12-31 08:24 | 只看该作者
9876k 发表于 2020-12-19 11:42
请问一下,电路图中这个PR1是什么啊,求赐教

排阻..........
回复

使用道具 举报

9#
ID:86450 发表于 2020-12-31 08:52 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

10#
ID:713091 发表于 2020-12-31 12:22 | 只看该作者
徐军宝 发表于 2020-12-23 21:04
电路图中的PR1是排阻,接实物图时可以不要,最好不要用proteus仿真stm32,目前版本效果一点都不好,我的8 ...

嗯  有道理
回复

使用道具 举报

11#
ID:870196 发表于 2021-1-2 13:49 | 只看该作者
你好,想问一下按照你的电路图连接的实物,LCD1602那里也接了电位器,代码烧录进去之后,为什么按键没有反应,怎么回事呢,能给点建议吗?
回复

使用道具 举报

12#
ID:103696 发表于 2021-1-3 12:12 | 只看该作者
既然用LCD1602就加个I2C转并口模块吧,才2到3块钱,反正LCD1602就那么慢,I2C的速度就能满足了,就2个IO省了一大堆引脚省得布线麻烦而且调对比度供电引脚都集成好了!
回复

使用道具 举报

13#
ID:872516 发表于 2021-1-3 12:32 | 只看该作者
我想学习单片机
回复

使用道具 举报

14#
ID:907272 发表于 2021-5-15 01:36 来自手机 | 只看该作者
我的LCD不显示呢,是哪里有问题吗,应该不是电位器的问题
回复

使用道具 举报

15#
ID:865814 发表于 2021-6-7 09:30 | 只看该作者
这个版块的ADC有没有更简单的写法
回复

使用道具 举报

16#
ID:936641 发表于 2021-6-13 20:05 | 只看该作者
ghoo 发表于 2021-5-15 01:36
我的LCD不显示呢,是哪里有问题吗,应该不是电位器的问题

大哥你的这个问题解决了吗 我的也是这个问题,实在不知道原因是啥
回复

使用道具 举报

17#
ID:937357 发表于 2021-6-14 12:03 | 只看该作者
个人建议家底不厚不要入手51单片机,看起来是一片金山未开化,你得有一个团队,当技术 成熟后必须组件生产线,没个三五十五万  你只能花闲钱做爱好而已。当然了,有梦想是好事,当你的实体样品机开始出售后  估计半年就一大堆山寨机开始竞争了。新科技的 竞争及其残忍
回复

使用道具 举报

18#
ID:855933 发表于 2021-6-14 23:34 | 只看该作者
LCD1602的线不用接完的吗?
回复

使用道具 举报

19#
ID:939131 发表于 2021-6-17 10:23 来自手机 | 只看该作者
想问问 为啥我连接实物后lcd亮了缺没有内容,可能会是什么地方的问题?
回复

使用道具 举报

20#
ID:945549 发表于 2021-6-29 10:35 | 只看该作者
南瓜小公主? 发表于 2021-6-17 10:23
想问问 为啥我连接实物后lcd亮了缺没有内容,可能会是什么地方的问题?

一样,问题解决了吗?
回复

使用道具 举报

21#
ID:770265 发表于 2021-7-7 14:52 | 只看该作者
博主,我制作出来 LCD显示屏不显示数字,应该如何排查硬件错误呢?
回复

使用道具 举报

22#
ID:978697 发表于 2021-11-6 17:09 | 只看该作者
9876k 发表于 2020-12-19 11:42
请问一下,电路图中这个PR1是什么啊,求赐教

就是一个排阻
回复

使用道具 举报

23#
ID:991474 发表于 2021-12-12 23:53 | 只看该作者
求教,正常显示八位,开机显示0 可以进行加减乘除,除法可以自动舍去小数,超出显示错误
回复

使用道具 举报

24#
ID:110875 发表于 2021-12-13 19:31 | 只看该作者
不错,不过最后一张照片有问题吧,98/6=16.3333333333,而不是16.033,区别大了!
回复

使用道具 举报

25#
ID:984159 发表于 2021-12-15 17:15 | 只看该作者
liang118038 发表于 2021-1-3 12:12
既然用LCD1602就加个I2C转并口模块吧,才2到3块钱,反正LCD1602就那么慢,I2C的速度就能满足了,就2个IO省 ...

I2C转并口模块是什么
回复

使用道具 举报

26#
ID:984159 发表于 2021-12-15 17:17 | 只看该作者
liang118038 发表于 2021-1-3 12:12
既然用LCD1602就加个I2C转并口模块吧,才2到3块钱,反正LCD1602就那么慢,I2C的速度就能满足了,就2个IO省 ...

我在某一个宝上搜I2C转并口,要好几十。。。
回复

使用道具 举报

27#
ID:997442 发表于 2021-12-28 10:54 | 只看该作者
用点整能不能实现啊
回复

使用道具 举报

28#
ID:995076 发表于 2022-3-2 08:26 | 只看该作者
这个里边没有仿真吧
回复

使用道具 举报

29#
ID:1002916 发表于 2022-3-15 17:05 | 只看该作者
51黑有你更精彩!!!
回复

使用道具 举报

30#
ID:687531 发表于 2022-3-19 19:21 | 只看该作者
qwssd 发表于 2022-3-2 08:26
这个里边没有仿真吧

没有仿真
回复

使用道具 举报

31#
ID:1023741 发表于 2022-5-4 14:50 | 只看该作者
谢谢分享,帮助我解决了电路连接难题
回复

使用道具 举报

32#
ID:1023741 发表于 2022-5-6 14:56 | 只看该作者
本帖最后由 w921913520 于 2022-5-6 22:17 编辑

楼主的代码可以用于STM32F103RB的芯片不
回复

使用道具 举报

33#
ID:1026050 发表于 2022-5-12 23:33 | 只看该作者
想问一下,LCD有亮但是按键盘却没有反应,而且蜂鸣器一直在响该怎么解决?
回复

使用道具 举报

34#
ID:262 发表于 2022-5-13 16:40 | 只看该作者
wutiaowu 发表于 2022-5-12 23:33
想问一下,LCD有亮但是按键盘却没有反应,而且蜂鸣器一直在响该怎么解决?

LCD有亮只能证明 背光的2个引脚没有错,有可能其他的数据和控制io全部都是错误的接法,仔细检查一下电路
回复

使用道具 举报

35#
ID:1004455 发表于 2022-5-16 18:54 | 只看该作者
LCD不显示加个RP电阻调节就行了
回复

使用道具 举报

36#
ID:1029251 发表于 2022-5-24 14:45 | 只看该作者
wutiaowu 发表于 2022-5-12 23:33
想问一下,LCD有亮但是按键盘却没有反应,而且蜂鸣器一直在响该怎么解决?

检查一下IO口是否对应
回复

使用道具 举报

37#
ID:1037718 发表于 2022-6-30 11:07 | 只看该作者
太棒了,设计就做这个了
回复

使用道具 举报

38#
ID:1064507 发表于 2023-2-27 16:27 | 只看该作者
LCD1602好难
回复

使用道具 举报

39#
ID:1087371 发表于 2023-7-5 18:48 | 只看该作者
不太明白,前来学习,感谢楼主。
回复

使用道具 举报

40#
ID:1094673 发表于 2023-9-27 13:47 | 只看该作者
有没有具体的接线图呀,还是说就按着原理图接就行
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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