单片机课程设计-四位加法计算器设计参考程序(c语言)
#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语言)的更多相关文章
- 单片机课程设计——课程设计之四位加法计算器(2)(C代码)
#include<reg52.h> typedef unsigned char uint8; typedef unsigned int uint16; sbit rw=P2^5; sbit ...
- 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》
引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准 ...
- 单片机课程设计>八音盒
2017—2018学年度第一学期 <单片机原理及应用>作品考试 八音盒 2017-2018-1<单片机原理及应用>作品设计提交文档 一.作品设计目的 1.利用51单片机的各个部 ...
- 用antlr4来实现《按编译原理的思路设计的一个计算器》中的计算器
上次在公司内部讲<词法分析——使用正则文法>是一次失败的尝试——上午有十几个人在场,下午就只来了四个听众. 本来我还在构思如何来讲“语法分析”的知识呢,但现在看来已不太可能. 这个课程没有 ...
- JAVA 图形开发之计算器设计(事件监听机制)
/*文章中用到的代码只是一部分,需要源码的可通过邮箱联系我 1978702969@qq.com*/ 前段时间刚帮同学用MFC写了个计算器,现在学到JAVA的图形开发,就试着水了一个计算器出来.(可以说 ...
- objective-c 一个链式加法计算器实现
一个链式加法计算器实现思路 1.使用时的效果 Calculate * manger=[Calculate new]; int result=manger.add(123).add(123).sub(1 ...
- PPT资料下载 - 问题驱动的软件测试设计:强化测试用例设计
测试用例设计是整个软件测试过程中非常重要的测试活动,需求规格说明是测试人员开展测试设计的主要参考输入.而在测试实践中基于需求规格说明得到的测试用例,在测试覆盖率.测试效率.测试有效性和测试质量等方面的 ...
- .NET Core实战项目之CMS 第九章 设计篇-白话架构设计
前面两篇文章给大家介绍了我们实战的CMS系统的数据库设计,源码也已经上传到服务器上了.今天我们就好聊聊架构设计,在开始之前先给大家分享一下这几天我一直在听的<从零开始学架构>里面关于架构设 ...
- paip.自适应网页设计 跟 响应式 设计的区别跟原理and实践总结
paip.自适应网页设计 跟 响应式 设计的区别跟原理and实践总结 响应式Web设计(Responsive Web design)的理念是: 1 #-----------自适应布局VS响应式布局 2 ...
随机推荐
- 如何让input框显示在一行?
案例: <input type="float:left" value="aaaa"> <input type="float:left ...
- 【Jest】笔记一:环境配置
一.开发环境 Mac node.js:v9.9.0 下载链接:http://nodejs.cn/download/ VScode 下载链接:https://code.visualstudio.com ...
- session,cookie,sessionStorage,localStorage的区别及应用场景
session,cookie,sessionStorage,localStorage的区别及应用场景 浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式,可以利用cookie,session等跟 ...
- VBA随机地牢生成
无聊啊--于是,我想做一个随机地图. 但是我很懒,不想做. 但是身体很诚实. 这次是直接在Excel中制作的地图,但是,VB的执行效率很慢,我代码的效率也很慢,导致,一旦地图长宽稍大,就会出现好几分钟 ...
- Java String类和StringBuffer类的区别
1.String与StringBuffer的区别简单地说,就是一个变量和常量的关系.StringBuffer对象的内容可以修改:而String对象一旦产生后就不可以被修改,重新赋值其实是两个对象.St ...
- bsdiff差分算法
bsdiff的基本原理 bsdiff是由Conlin Percival开源的一个优秀的差分算法,而且是跨平台的.在Android系统中所使用的imgdiff本质上就是bsdiff. bsdiff的依据 ...
- MQTT研究之EMQ:【JAVA代码构建X509证书【续集】】
openssl创建私钥,获取公钥,创建证书都是比较简单的,就几个指令,很快就可以搞定,之所以说简单,是因为证书里面的基本参数配置不需要我们组装,只需要将命令行里面需要的几个参数配置进去即可.但是呢,用 ...
- 【SQL实践】其他常用SQL汇总
[SQL实践]其他常用SQL汇总 1.联表更新 update students stu inner join course on course.STUDENT_ID=stu.id set stu.na ...
- 工控随笔_07_西门子_WinCC利用命令行实现操作log日志
在WinCC中可以通过报警纪录来实现操作员纪录,这个需要WinCC的消息系统进行组态和配置. 利用消息系统进行实现上诉功能不但复杂而且时间久啦也不方便查询.那么有没有一种简单的方法来 实现操作员纪录呢 ...
- 【git】之使用shell脚本提交代码
为减少提交步骤,防止提交错误,使用Shell脚本进行git提交不失一件好事 #!/bin/sh # @author Hubal # @Email Hubal@123.com # @createBy - ...