基于51单片机和四位数码管的智能计算器算法
前段时间,本人写了基于51单片机和四位数码管的智能计算器算法,由于时间关系,算法没能实现小数部分,但已为小数部分留出空间,有兴趣的可以添加进去
下面是源代码(矩阵键盘的检测部分参考了普中科技的实验例程)
#include "reg52.h"
#include "math.h"
typedef unsigned int u16;
typedef unsigned char u8;
#define GPIO_DIG P0
#define GPIO_KEY P1
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
float m,l;
int t;
char a, j;
char b[4];
char n=0, fuhao;
char bj=0, xs, xsbj, xsb=0, x,xa;
u8 KeyValue;
u8 DisplayData[4];
u8 data smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};//显示0~F的值
u8 data smgxiaoshu[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,
0xff,0xef};
void delay(u16 i)
{
while(i--);
}
void KeyDown(void)
{
char c=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//读取按键是否按下
{
delay(1000);//延时10ms进行消抖
if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
{
//测试列
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e): KeyValue=3;break;
}
//测试行
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0): KeyValue=KeyValue+12;break;
}
while((c<50)&&(GPIO_KEY!=0xf0))
{
delay(1000);
c++;
}
switch(KeyValue)
{
case 0: a=7;break;
case 1: a=8;break;
case 2: a=9;break;
case 3: a=-1;break;
case 4: a=4;break;
case 5: a=5;break;
case 6: a=6;break;
case 7: a=-2;break;
case 8: a=1;break;
case 9: a=2;break;
case 10: a=3;break;
case 11: a=-3;break;
case 12: a=-4;break;
case 13: a=0;break;
case 14: a=-5;break;
case 15: a=-6;break;
}
if(a>=0)
{
n++;
}
if(a<0&&a!=-5&&a!=-4)
{
n=0;
}
}
}
}
void DigDisplay()
{
u8 i;
for(i=0;i<4;i++)
{
switch(i)
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
}
P0=DisplayData[i];
delay(100); //间隔一段时间扫描
P0=0x00;//消隐
}
}
void shuruzhi()
{
int i;
switch(n)
{
case 0:
DisplayData[0]=0x00;DisplayData[1]=0x00;DisplayData[2]=0x00;DisplayData[3]=0x00;
i=0; break;
case 1:
if(i==0)
{
b[0]=a;
DisplayData[0]=smgduan[a]; DisplayData[1]=0x00;DisplayData[2]=0x00;DisplayData[3]=0x00;
i++ ;
x=1;
}
break;
case 2:
if(i==1)
{
b[1]=b[0];b[0]=a;
DisplayData[1]=DisplayData[0];DisplayData[2]=0x00;DisplayData[3]=0x00;DisplayData[0]=smgduan[a];
i++;
x=2;
}
break;
case 3:
if(i==2)
{
b[2]=b[1];b[1]=b[0];b[0]=a;
DisplayData[2]=DisplayData[1];DisplayData[1]=DisplayData[0];DisplayData[0]=smgduan[a];DisplayData[3]=0x00;
i++;
x=3;
}
break;
case 4:
if(i==3)
{
b[3]=b[2];b[2]=b[1];b[1]=b[0];b[0]=a;
DisplayData[3]=DisplayData[2];DisplayData[2]=DisplayData[1];DisplayData[1]=DisplayData[0];DisplayData[0]=smgduan[a];
i++;
x=4;
}
break;
}
if(a==-4)
{
DisplayData[0]=smgxiaoshu[b[0]];
xs=a;
xsbj=x;
}
if(n==1)
{
b[1]=0;b[2]=0;b[3]=0;
}
if(n==2)
{
b[2]=0;b[3]=0;
}
if(n==3)
{
b[3]=0;
}
if(a<0)
{
if(xs==-4)
{
xsbj=x-xsbj;
if(xs==-4&&xsbj!=0)
{
if(xsbj==1)
{
l=b[3]*100+b[2]*10+b[1]*1+b[0]*0.1;
}
if(xsbj==2)
{
l=b[3]*10+b[2]*1+b[1]*0.1+b[0]*0.01;
}
if(xsbj==3)
{
l=b[3]*1+b[2]*0.1+b[1]*0.01+b[0]*0.001;
}
xsbj=0;
}
xa=xs;
xs=0;
}
else
l=b[3]*1000+b[2]*100+b[1]*10+b[0];
}
}
void yunsuan()
{
if(bj==0&&a<0)
{
m=l;
bj++;
fuhao=a;
a=11;
}
else
{
if(a!=-5&&a<0&&a!=-4)
{
switch(fuhao)
{
case -1:
m=m+l;
fuhao=a;
a=11;
break;
case -2:
m=m-l;
fuhao=a;
a=11;
break;
case -3:
m=m*l;
fuhao=a;
a=11;
break;
case -6:
m=m/l;
fuhao=a;
a=11;
break;
}
}
if(a==-5)
{
switch(fuhao)
{
case -1:
m=m+l;
fuhao=-1;
a=11;
break;
case -2:
m=m-l;
fuhao=-2;
a=11;
break;
case -3:
m=m*l;
fuhao=-3;
a=11;
break;
case -6:
m=m/l;
fuhao=-6;
a=11;
break;
}
if(m<0)
{
if(xs==-4)
{
t=-m*100;
}
else
{
t=-m;
if(t<10)
{
DisplayData[3]=0x00;
DisplayData[2]=0x00;
DisplayData[1]=0x40;
DisplayData[0]=smgduan[(((t%1000)%100)%10)];
}
if(t<100&&t>=10)
{
DisplayData[3]=0x00;
DisplayData[2]=0x40;
DisplayData[1]=smgduan[(((t%1000)%100)/10)];
DisplayData[0]=smgduan[(((t%1000)%100)%10)];
}
if(t<1000&&t>=100)
{
DisplayData[3]=0x40;
DisplayData[2]=smgduan[((t%1000)/100)];
DisplayData[1]=smgduan[(((t%1000)%100)/10)];
DisplayData[0]=smgduan[(((t%1000)%100)%10)];
}
}
}
else
{
if(xa==-4)
{
t=m*100;
xa=0;
}
else
{
t=m;
}
if(t<10)
{
DisplayData[3]=0x00;
DisplayData[2]=0x00;
DisplayData[1]=0x00;
DisplayData[0]=smgduan[(((t%1000)%100)%10)];
}
if(t>=10&&t<100)
{
DisplayData[3]=0x00;
DisplayData[2]=0x00;
DisplayData[1]=smgduan[(((t%1000)%100)/10)];
DisplayData[0]=smgduan[(((t%1000)%100)%10)];
}
if(t>=100&&t<1000)
{
DisplayData[3]=0x00;
DisplayData[2]=smgduan[((t%1000)/100)];
DisplayData[1]=smgduan[(((t%1000)%100)/10)];
DisplayData[0]=smgduan[(((t%1000)%100)%10)];
}
if(t>=1000&t<10000)
{
DisplayData[3]=smgduan[(t/1000)];
DisplayData[2]=smgduan[((t%1000)/100)];
DisplayData[1]=smgduan[(((t%1000)%100)/10)];
DisplayData[0]=smgduan[(((t%1000)%100)%10)];
}
}
}
}
}
void main()
{ char i,t=0;
for(i=0;i<4;i++)
{
DisplayData[0]=0x3f;
b[i]=0;
}
while(1)
{
KeyDown();
shuruzhi();
yunsuan();
DigDisplay();
}
}
如需借用请标明出处!
基于51单片机和四位数码管的智能计算器算法相关推荐
- 63、基于51单片机数字频率计NE555数码管显示系统设计(程序+原理图+Proteus仿真+参考论文+开题报告+任务书+元器件清单等)
摘 要 近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此越来越广泛地应用各个领域. ...
- 101、基于51单片机数控电源 数码管 直流稳压电源 恒流恒压系统设计
毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.PCB图 六.程序 七.资料包括 摘要 随着电力电子技术的迅速发展, 直流电源应用非常 ...
- 基于51单片机的四位共阴数码管秒表proteus仿真
硬件设计 (末尾附文件) 代码设计 #include "reg51.h" #include "intrins.h"#define GPIO_DIG P2 //数 ...
- 基于51单片机的水族箱温度水质监测智能宠物金鱼喂食器补氧换水proteus仿真原理图
功能介绍: 0.本系统采用STC89C52作为单片机 1.系统实时监测水族箱温度及水质,并定时向WIFI串口发送监测信息 2.当水质超过设定阈值时,启动换水继电器 3.按键可设定阈值,可手动换水,喂食 ...
- 基于51单片机的水温水位测控智能热水器系统方案原理图仿真
硬件系统设计 单片机应用系统的硬件电路设计包含两部分内容:一是系统扩展,即单片机内部的功能单元,如ROM.RAM.I/O.定时器/计数器.中断系统等不能满足应用系统的要求时,必须在片外进行扩展,选择适 ...
- 基于51单片机的4位竞赛抢答器的设计
设计编号:Q001 资料下载 功能要求: 以单片机为核心,设计一个4位竞赛抢答器:同时供4名选手或4个代表队比赛,分别用4个按钮S0-S4表示. 1.设置一个系统清除和抢答控制开关S,开关由主持人控制 ...
- 基于51单片机1602温度显示时钟
基于51单片机LCD1602温度显示时钟 要在1602上显示时间和温度先要了解1602是如何显示的.详情可以参考我之前的文章基于51单片机1602显示 :时间显示可以用时钟芯片DS1302,但是此次我 ...
- 最简单DIY基于51单片机的舵机控制器
51单片机物联网智能小车系列文章目录 第一篇:最简单DIY的51蓝牙遥控小车设计方案 第二篇:最简单DIY串口蓝牙硬件实现方案 第三篇:最简单DIY蓝牙PS2遥控器控制蓝牙智能小车 第四篇:最简单DI ...
- 共阳极数码时钟c语言程序,基于51单片机C语言数字钟程序.doc
基于51单片机C语言数字钟程序 基于51单片机C语言数字钟程序 数字电子钟的设计 一. 绪论 (一)引言 20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地 ...
最新文章
- 【转载】Few-shot learning(少样本学习)和 Meta-learning(元学习)概述
- 华章7-8月份新书简介(2015年)
- 后台寻路系统的大体思路与流程
- 转载 一篇UI规范文件
- C#系统开发登录窗体在MDI窗体之前显示
- 谷歌18年博士生奖研金出炉,八位入选华人学生均毕业于国内高校
- C 语言会比 C++ 快?
- Python基础6—常用语句
- JAVA中Long与Integer
- Android系统版本与版本代号中英文名字
- 路由器与交换机的关系
- 记录 Spring Cloud GateWay 使用 路径与路由名字重复 出现的问题
- Grafana 任意文件读取漏洞复现
- 从从协方差的误差椭圆到PCA
- openoffice java awt_使用openoffice转pdf,详细
- Elastic search常用分词 和 多字段搜索优化
- matplotlib中关于极坐标轴的控制
- 电脑播放视频报错----------无法播放。请确保你的计算机的声卡和视频卡可以使用,并安装了最新的驱动程序----------解决!
- [VOT15](2021CVPR)Alpha-Refine: Boosting Tracking Performance by Precise Bounding Box Estimation
- dim=0与dim=1_CodingPark编程公园
热门文章
- java生成图片大小_Java 对图片进行大小转换
- 散粉在哪个步骤用_散粉在哪个步骤用 散粉用在哪一步骤
- instsrv+srvany创建服务实现开机自动启动vmware虚机
- PHP笔记-Workerman整合到Laravel中并创建websocket
- 小猫爪:i.MX RT1050学习笔记19-安全启动3-实现HAB签名
- element的复杂表单验证
- 安卓WebApp开发-项目MiliSetu
- jmeter 学习笔记
- linux epel,Linux增加epel源的方法
- Git reset(回滚) 和 revert(撤销)(图文详解)