#include<reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16; sbit rw=P2^;
sbit rs=P2^;
sbit e=P2^;
sbit led=P3^; uint8 key,num,ei,eii,p;
uint8 fuhao;//定义具体的那个符号,是加减还是乘除。
uint8 flag; //定义有没有按下符号键,这个是统称
long a,b,c,d; //定义运算数据的第一个和第二个及等于的数变量
uint8 k; //定义小数点后面显示的位数 uint8 dat1[]={,,,0x2b-0x30, ,,,0x2d-0x30, ,,,0x2a-0x30,
,0x01-0x30,0x3d-0x30,0x2b-0x30 };//保存显示的数据
uint8 dat2[]="9999 revo rewsna";
uint8 dat3[]="Hi welcome into";
uint8 dat4[]="counter by yumo";
void delay(uint16 i)
{
while(i--);
}
void lcdwrc(uint8 c)//写入命令
{
delay();
rs=;//选择发送命令
rw=;//选择写入
e=;//使能 P0=c;//放入命令
e=;//写时序
delay();//保持时间
e=;
}
void lcdwrd(uint8 dat)//写入数据
{
delay();
rs=;//选择输入数据
rw=;//选择写入
e=; P0=dat;//写入数据
e=;//写入时序
delay();
e=;
rs=;
} void lcdinit()//LCD初始化
{
delay();
lcdwrc(0x38);
delay();
lcdwrc(0x38);
delay();
lcdwrc(0x38);
delay();
lcdwrc(0x38);
lcdwrc(0x08);
lcdwrc(0x01);
lcdwrc(0x06);
lcdwrc(0x0c);
key=;
num=;
flag=;
fuhao=;
a=;
b=;
c=;
d=;
led=;
} show()
{
for(eii=;eii<;eii++)
{ lcdwrd(dat3[eii]);
}
lcdwrc(0xc0);//写命令函数使其到第二行第一个字符
for(p=;p<;p++)
{ lcdwrd(dat4[p]);
}
return ;
}
void keyscan()
{
P1=0xfe; //令第一行为0,然后判断是哪一列按下
if(P1!=0xfe)
{
delay();
if(P1!=0xfe)
{
key=P1&0xf0;
switch(key)
{
case 0xe0: num=;break; //
case 0xd0: num=;break; //
case 0xb0: num=;break; //
case 0x70: num=;break; //加
}
}
while(P1!=0xfe);
if(num==||num==||num==) //确认第一行的数1,2,3
{
if(flag==) //没有按下符号键
{
led=;
a=a*+dat1[num];
}
else
{
led=;
delay();
led=;
delay();
led=;
b=b*+dat1[num];
}
}
if(num==)
{
led=;
flag=;
fuhao=;//加号+
}
lcdwrd(0x30+dat1[num]);
} P1=0xfd; //令第二行为0,判断是哪一列按下
if(P1!=0xfd)
{
delay();
if(P1!=0xfd)
{
key=P1&0xf0;
switch(key)
{
case 0xe0: num=;break; //
case 0xd0: num=;break; //
case 0xb0: num=;break; //
case 0x70: num=;break; //减—
}
}
while(P1!=0xfd);
if(num==||num==||num==)
{
if(flag==) //没有按下符号键
{
led=;
a=a*+dat1[num];
}
else
{
led=;
b=b*+dat1[num];
}
}
else
{
led=;
flag=;
fuhao=;//带表减号
}
lcdwrd(0x30+dat1[num]);
} P1=0xfb; //令第三行为0,判断哪一列按下
if(P1!=0xfb)
{
delay();
if(P1!=0xfb)
{
key=P1&0xf0;
switch(key)
{
case 0xe0: num=;break; //
case 0xd0: num=;break; //
case 0xb0: num=;break; //
case 0x70: num=;break; //乘*
}
}
while(P1!=0xfb);
if(num==||num==||num==)
{
if(flag==) //没有按下符号键
{
led=;
a=a*+dat1[num];
}
else
{
led=;
b=b*+dat1[num];
}
}
else
{
led=;
flag=;
fuhao=;//带表乘号*
}
lcdwrd(0x30+dat1[num]);
} P1=0xf7; //令第四行为0,判断哪一列按下
if(P1!=0xf7)
{
delay();
if(P1!=0xf7)
{
key=P1&0xf0;
switch(key)
{
case 0xe0: num=;break; //
case 0xd0: num=;break; //清除rst
case 0xb0: num=;break; //等号=
case 0x70: num=;break; //除/
}
}
while(P1!=0xf7);
switch(num)
{
case :
if(flag==) //没有按下符号键
{
led=;
a=a*+dat1[num];
lcdwrd(0x30);
}
else
{
led=;
b=b*+dat1[num];
lcdwrd(0x30);
}
break;
case :
lcdwrc(0x01); //清屏指令
a=;
b=;
c=;
flag=;
fuhao=;
break;
case : led=;
flag=;
fuhao=;
lcdwrd(0x2f);//除号/
break;
case : //如果是等于号
if(fuhao==)//加
{
lcdwrc(0x4f+0x80);
lcdwrc(0x04);//设置光标左移,屏幕不移动
c=a+b; if(c==)
{
lcdwrc(0x4f+0x80);
lcdwrc(0x04);
lcdwrd(0x30);
}
while((c!=)&&(c<=)) //一位一位显示
{ lcdwrd(0x30+c%);//显示结果的最后一位在0x4f的位置
c=c/;//取前面的结果数据
}
if(c>)
{
for(ei=;ei<=;ei++)
{
lcdwrd(dat2[ei]);
}
}
lcdwrd(0x3d); //显示等于号=
a=;
b=;
c=;
flag=;
fuhao=;//全部清除为0
}
if(fuhao==) //减
{
lcdwrc(0x4f+0x80);
lcdwrc(0x04);//设置光标左移,屏幕不移动
if(a>b)
c=a-b;
else
c=b-a; if((c==))//此语句位置影响显示
{
lcdwrc(0x4f+0x80);
lcdwrc(0x04);
lcdwrd(0x30);
}
while((c!=)&&(c<=)) //一位一位显示
{
lcdwrd(0x30+c%);//显示结果的最后一位在0x4f的位置
c=c/;//取前面的结果数据
}
if(c>)
{
for(ei=;ei<=;ei++)
{
lcdwrd(dat2[ei]);
}
}
if(a<b) lcdwrd(0x2d); //显示-号
lcdwrd(0x3d); //显示等于号=
a=;
b=;
flag=;
fuhao=;//全部清除为0
}
if(fuhao==)//乘法
{
lcdwrc(0x4f+0x80);
lcdwrc(0x04);//设置光标左移,屏幕不移动
c=a*b;
while((c!=)&(c<=)) //一位一位显示
{
lcdwrd(0x30+c%);//显示结果的最后一位在0x4f的位置
c=c/;//取前面的结果数据
}
if (c>)
{
for(ei=;ei<=;ei++)
{
lcdwrd(dat2[ei]);
}
}
if(a==||b==)
{
lcdwrd(0x30);
}
lcdwrd(0x3d); //显示等于号=
a=;
b=;
flag=;
fuhao=;//全部清除为0
}
if(fuhao==)//除法
{
k=;
lcdwrc(0x4f+0x80);
lcdwrc(0x04);//设置光标左移,屏幕不移动
c=(long)(((float)a/b)*);//强制转换为long。
while((c!=)&&(c<=)) //一位一位显示
{
k++;
lcdwrd(0x30+c%);//显示结果的最后一位在0x4f的位置
c=c/;//取前面的结果数据
if(k==)//结果保留四位有效数字
{
lcdwrd(0x2e);//显示一个点
//k=0;//倘若K=0,那么每隔三位就有一个小数点,计算器上的逗号就是这个原理。
}
}
if(c>)
{
for(ei=;ei<=;ei++)
{
lcdwrd(dat2[ei]);
}
}
if(<(a/b)<0.1001)
{
//lcdwrd(0x2e); }
if((a/b)<) //如果a比b小的话那么除的结果最高位是0
{
lcdwrd(0x30);
}
if(b==)//检错因为除数不能为0,否则就显示ERROR
{
lcdwrc(0x4f+0x80);
lcdwrc(0x04);
lcdwrd(0x52);
lcdwrd(0x4f);
lcdwrd(0x52);
lcdwrd(0x52);
lcdwrd(0x45);
}
lcdwrd(0x3d); //显示等号
a=;
b=;
flag=;
fuhao=;//全部清除为0
}
break;
}
}
}
void main()
{
lcdinit();
show();//个性化界面
while()
{
keyscan();
}
}

此程序为51单片机课程设计时所编写,希望可以供大家参考学习。

单片机课程设计-四位加法计算器设计参考程序(c语言)的更多相关文章

  1. 单片机课程设计——课程设计之四位加法计算器(2)(C代码)

    #include<reg52.h> typedef unsigned char uint8; typedef unsigned int uint16; sbit rw=P2^5; sbit ...

  2. 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》

    引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准 ...

  3. 单片机课程设计>八音盒

    2017—2018学年度第一学期 <单片机原理及应用>作品考试 八音盒 2017-2018-1<单片机原理及应用>作品设计提交文档 一.作品设计目的 1.利用51单片机的各个部 ...

  4. 用antlr4来实现《按编译原理的思路设计的一个计算器》中的计算器

    上次在公司内部讲<词法分析——使用正则文法>是一次失败的尝试——上午有十几个人在场,下午就只来了四个听众. 本来我还在构思如何来讲“语法分析”的知识呢,但现在看来已不太可能. 这个课程没有 ...

  5. JAVA 图形开发之计算器设计(事件监听机制)

    /*文章中用到的代码只是一部分,需要源码的可通过邮箱联系我 1978702969@qq.com*/ 前段时间刚帮同学用MFC写了个计算器,现在学到JAVA的图形开发,就试着水了一个计算器出来.(可以说 ...

  6. objective-c 一个链式加法计算器实现

    一个链式加法计算器实现思路 1.使用时的效果 Calculate * manger=[Calculate new]; int result=manger.add(123).add(123).sub(1 ...

  7. PPT资料下载 - 问题驱动的软件测试设计:强化测试用例设计

    测试用例设计是整个软件测试过程中非常重要的测试活动,需求规格说明是测试人员开展测试设计的主要参考输入.而在测试实践中基于需求规格说明得到的测试用例,在测试覆盖率.测试效率.测试有效性和测试质量等方面的 ...

  8. .NET Core实战项目之CMS 第九章 设计篇-白话架构设计

    前面两篇文章给大家介绍了我们实战的CMS系统的数据库设计,源码也已经上传到服务器上了.今天我们就好聊聊架构设计,在开始之前先给大家分享一下这几天我一直在听的<从零开始学架构>里面关于架构设 ...

  9. paip.自适应网页设计 跟 响应式 设计的区别跟原理and实践总结

    paip.自适应网页设计 跟 响应式 设计的区别跟原理and实践总结 响应式Web设计(Responsive Web design)的理念是: 1 #-----------自适应布局VS响应式布局 2 ...

随机推荐

  1. jsp(待改)

    ##JSP 1.指令 作用:用于配置JSP页面,导入资源文件 *书写格式 <%@ 指令名称 属性1=值1,属性2=值2  ...%> *分类: *page :配置JSP页面的 #属性: c ...

  2. anki vector robot入门语音指令大全

    vector机器人功能不断完善. 一:刚开始支持一些基础指令,你跟他说话他能在本机识别,然后做出相应的响应.在说这部分指令之前,需要加上Hey Vector.(嘿,维课的),然后他会准备听取你的指令, ...

  3. c标签 多个条件

    <c:if test="${(rwyy01.yyry==NULL || rwyy01.yyry=='') && (rwyy01.shry==NULL || rwyy01 ...

  4. el-popover 的显示或隐藏,要在拿到真实dom之后再做控制

    el-popover 的显示或隐藏,要在拿到真实dom之后再做控制

  5. NLP VS NLU

    NLP(Natural Language Processing )自然语言处理:是计算机科学,人工智能和语言学的交叉领域.目标是让计算机处理或“理解”自然语言,以执行语言翻译和问题回答等任务.NLU  ...

  6. Kettle解决方案: 第五章 ETL相关知识

    早期, ETL知识作为BI系统的一部分来介绍. 后来在The Data Warehouse ETL Tooket一书中, 系统性的整理了ETL的相关内容, 形成了一篇"ETL里的34个子系统 ...

  7. @EnableEurekaServer无法正常import原因是spring-cloud-dependencies版本太低

    去maven repository 库里 http://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-depend ...

  8. Node文件模块

    在上一篇文章中有提到,Node模块分为核心模块和文件模块,接下来就简单总结一下文件模块. 文件模块则是在运行时动态加载,需要完整的路径分析.文件定位.编译执行过程.速度相比核心模块稍微慢一些,但是用的 ...

  9. TensorFlow-GPU+cuda8+cudnn6+anaconda安装遇到的版本错误

    第一遍装的时候是cuda10+cudnn5.1这个诡异的组合,失败 卸载cuda就是把所有的NVIDIA有关的应用都删掉,c盘文件也都删掉,不用留. 第二遍是cuda8+cudnn5.1.版本还是对不 ...

  10. localStorage溢出问题

    项目使用的store.js库 store.js库不能管理localStorage中的过期项到时清除,只能在再次调用get的时候才做处理,如果一直不调用get,过期了也还是占用着空间.溢出后,再储存项目 ...