单片机课程设计-四位加法计算器设计参考程序(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 ...
随机推荐
- cin.ignore
功能:函数用于输入流.它读入字符,直到已经读了num 个字符(默认为1)或是直到字符delim 被读入(默认为EOF).其调用形式为cin.ignore(n,终止字符) 原型:istrea ...
- java虚拟机 之 垃圾回收机制
一.如何判断对象已死 垃圾回收器并不是java独有的,垃圾回收器的作用就是回收对象释放内存空间,那么如何判断哪些对象应该被回收呢? 在Java语言中是采用GC Roots来解决这个问题.如果一个对象和 ...
- JAVA创建和销毁对象
类静态方法取代构造方法创建对象 类静态方法有名称,可以通过名称说明返回的是什么类型的实例 可以控制是否需要新开辟内存空间 返回值是可以控制的 实体类属性非常多的时候使用build模式创建对象 单例实体 ...
- 使用Visual Studio 2017 C++17模块(module)特性
环境: win7_x64旗舰版.VS2017企业版 一.安装VS2017 1.1 安装VS2017时,必须要勾选“使用C++的modules开发”选项 1.2 安装成功后,会在VS安装目录Micros ...
- SignalR 行实时通信遇到的
SignalR可用于向ASP.NET应用程序添加任何类型的“实时”Web功能.虽然聊天经常被用作示例,但您可以做更多的事情.每当用户刷新网页以查看新数据,或者页面实现Ajax长轮询以检索新数据时,都可 ...
- 使用korofileheader插件vs code添加文件头注释和函数注释
korofileheadervs code添加文件头注释和函数注释1.extensions搜索fileheader,安装koroFileHeader2.设置:edit=>perference=& ...
- Java...点点点语法
https://blog.csdn.net/IT_faquir/article/details/49131173
- Ansible 批量修改密码
客户要求每3个月修改一次主机密码.密码规则为客服提供的一串字符 xxxx + 主机后3位. 将需要登录主机添加到 Ansible. 将需要登录主机的公钥添加到 known_hosts ssh-keys ...
- 剑指offer 11. 位运算 二进制中1的个数
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. //思想:用1(1自身左移运算,其实后来就不是1了)和n的每位进行位与,来判断1的个数 private stat ...
- 分词工具Hanlp基于感知机的中文分词框架
结构化感知机标注框架是一套利用感知机做序列标注任务,并且应用到中文分词.词性标注与命名实体识别这三个问题的完整在线学习框架,该框架利用1个算法解决3个问题,时自治同意的系统,同时三个任务顺序渐进,构 ...