单片机课程设计-四位加法计算器设计参考程序(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 ...
随机推荐
- ie8的input的placeholder不显示的解决bug
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- 基于tomcat获取在线用户数
https://blog.csdn.net/smallnetvisitor/article/details/84697505 需求: 统计某应用的在线用户数 实现方案: 1.基于session监听(复 ...
- robot framework关键词记录单(更新中)
1.select Radio Button groupname value 选择单选按钮 A)适用于input的html单选框,属性中包含name以及value如:Select Radio Butt ...
- collection和association的区别于关系
比如同时有User.java和Card.java两个类 User.java如下: public class User{ private Card card_one; private List<C ...
- 3.GUI Skin和自定义风格的组件 --《UNITY 3D 游戏开发》笔记
自定义皮肤还是很受女孩子欢迎的吧,这样操作一下界面是不是就可以变得美美哒了~ 先pick一下测试代码: public class GUISkinScript : MonoBehaviour { //自 ...
- python入门——热量转换 I
热量转换 I 描述 卡路里,简称卡(Calorie),缩写为cal,定义为在1个大气压下,将1克水提升1摄氏度所需要的热量,卡是能量单位,被广泛使用在营养计量方面.国际能量标准单位是焦耳(joule) ...
- 深度系统 deepin 15.9 关闭桌面
深度系统 deepin 15.9 关闭桌面 由于特别的原因,关闭深度的桌面. sudo systemctl disable lightdm 如果需要在命令模式进入桌面可以使用以下命令. sudo se ...
- C# 每个字节接受 处理串口数据 的方法
/// <summary> /// 向串口发送信息,有返回值 /// </summary> /// <param name="serialPort" ...
- php5.5.7添加pgsql,pdo_pgsql,swoole
一:下载php源码sudo wget cn2.php.net/distributions/php-X.X.X.tar.gz 二:解压 tar xzf /php-X.X.X.tar.gz 三:进入源码e ...
- 工控随笔_04_西门子_解决Step 7软件因授权问题不能打开的方式和方法
西门子的软件是授权软件,只有经过授权认证的用户才能使用,如果没有通过授权认证则不能 正常的使用软件的相关功能. 一.西门子授权不成功问题 如上图所示报故障代码: 000001-0505.报警文本为:未 ...