单片机课程设计-四位加法计算器设计参考程序(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 ...
随机推荐
- Jenkins可持续集成项目搭建——配置邮件
1.系统管理->系统设置 (1)填写系统管理员邮件地址 (2)填写邮箱配置.发件人邮箱.收件人邮箱 注:1>发件人邮箱地址必须和系统管理员邮箱地址一致 2> 部分邮箱配置输入的不是登 ...
- 联想拯救者r720+固态浦科特M8PeGN 的bios 设置
最近笔记本左边的两个usb3.0接口都坏了,win10 报错usb端口上的电涌 真是一脸蒙B! 然后去打售后电话,说昌平没有售后,需要去海淀黄庄去维修,然后下午就去了那里,维修的人员说硬件坏了,需要1 ...
- 像使用数据库一样使用xml
目录 xml简介 语言结构 tinyxml 下载tinyxml 应用实例 tinyxml的封装 封装源码 实际应用 xml简介 XML 没什么特别的.它仅仅是纯文本而已.有能力处理纯文本的软件都可以处 ...
- What You Can Learn from Actifio Logs
The Actifio services generate many logs, some of which are useful for troubleshooting. This section ...
- MQTT研究之EMQ:【SSL证书链验证】
1. 创建证书链(shell脚本) 客户端证书链关系: rootCA-->chainca1-->chainca2-->chainca3 ca caCert1 caCert2 caCe ...
- C# .NET newtonsoft.json 多版本冲突解决
A.DLL 引用了6.0 的 newtonsoft.json (V2 运行时),B.DLL 引用了10.0 的 newtonsoft.json (V4 运行时). 可以在.CONFIG RUNTIM ...
- 【Leecode】两数相加
学习了链表结构,链表中元素的访问,对象指针的初始化与赋值,链表的创建(多个节点链接起来),进位计算的表达. 100ms /** * Definition for singly-linked list. ...
- 【java】之位运算^,&,<<,>>,<<<,>>>总结
1.^(亦或运算) ,针对二进制,相同的为0,不同的为1 public static void main(String[] args) { System.out.println("2^3运算 ...
- var entsMapLocation = {……}函数
var entsMapLocation = { global: { $popupCityBox: $(".ents-map-location-popup-box"), isPosi ...
- Scrapy实战篇(七)之爬取爱基金网站基金业绩数据
本篇我们以scrapy+selelum的方式来爬取爱基金网站(http://fund.10jqka.com.cn/datacenter/jz/)的基金业绩数据. 思路:我们以http://fund.1 ...