最佳答案

#include

#include

#include /* isdigit()函数 */

#include /* atoi()函数 */

#define uchar unsigned char

#define uint unsigned int

uchar operand1[9], operand2[9]; /* 操作数 */

uchar operator; /* 操作符 */

void delay(uint);

uchar keyscan();

void disp(void);

void buf(uint value);

uint compute(uint va1,uint va2,uchar optor);

uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,

0x92,0x82,0xf8,0x80,0x90,0xff}; /* 字符码表 */

uchar dbuf[8] = {10,10,10,10,10,10,10,10}; /* 显示缓存 */

/* 延时函数 */

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

/*******************************************

键盘扫描程序

将按键转化为字符并作为输出

'$','#'分别表示清零键和没有键按下

*******************************************/

uchar keyscan()

{

uchar skey; /* 按键值标记变量 */

/***********************

扫描键盘第1行

************************/

P1 = 0xfe;

while((P1 & 0xf0) != 0xf0) /* 有按键按下 */

{

delay(3); /* 去抖动延时 */

while((P1 & 0xf0) != 0xf0) /* 仍有键按下 */

{

switch(P1) /* 识别按键并赋值 */

{

case 0xee: skey = '7'; break;

case 0xde: skey = '8'; break;

case 0xbe: skey = '9'; break;

case 0x7e: skey = '/'; break;

default: skey = '#';

}

while((P1 & 0xf0) != 0xf0) /* 等待按键松开 */

;

}

}

/***********************

扫描键盘第2行

************************/

P1 = 0xfd;

while((P1 & 0xf0) != 0xf0)

{

delay(3);

while((P1 & 0xf0) != 0xf0)

{

switch(P1)

{

case 0xed: skey = '4'; break;

case 0xdd: skey = '5'; break;

case 0xbd: skey = '6'; break;

case 0x7d: skey = '*'; break;

default: skey = '#';

}

while((P1 & 0xf0) != 0xf0)

;

}

}

/***********************

扫描键盘第3行

************************/

P1 = 0xfb;

while((P1 & 0xf0) != 0xf0)

{

delay(3);

while((P1 & 0xf0) != 0xf0)

{

switch(P1)

{

case 0xeb: skey = '1'; break;

case 0xdb: skey = '2'; break;

case 0xbb: skey = '3'; break;

case 0x7b: skey = '-'; break;

default: skey = '#';

}

while((P1 & 0xf0) != 0xf0)

;

}

}

/***********************

扫描键盘第4行

************************/

P1 = 0xf7;

while((P1 & 0xf0) != 0xf0)

{

delay(3);

while((P1 & 0xf0) != 0xf0)

{

switch(P1)

{

case 0xe7: skey = '$'; break;

case 0xd7: skey = '0'; break;

case 0xb7: skey = '='; break;

case 0x77: skey = '+'; break;

default: skey = '#';

}

while((P1 & 0xf0) != 0xf0)

;

}

}

return skey;

}

void main()

{

uint value1, value2, value; /* 数值1,数值2,结果 */

uchar ckey, cut1 = 0, cut2 = 0; /* ckey键盘输入字符 */

uchar operator; /* 运算符 */

uchar i, bool = 0;

init: /* goto语句定位标签 */

buf(0); /* 初始化 */

disp();

value = 0;

cut1 = cut2 = 0;

bool = 0;

for(i = 0;i < 9;i++)

{

operand1[i] = '\0';

operand2[i] = '\0';

} /* 初始化 */

while(1)

{

ckey = keyscan(); /* 读取键盘 */

if(ckey != '#')

{ /* isdigit函数,字符是阿拉伯数字返回非0值,否则返回0 */

if(isdigit(ckey))

{

switch(bool)

{

case 0:

operand1[cut1] = ckey;

operand1[cut1+1] = '\0';

value1 = atoi(operand1); /* atoi函数,将字符串转化为,int整数 */

cut1++;

buf(value1);

disp();

break;

case 1:

operand2[cut2] = ckey;

operand2[cut2+1] = '\0';

value2 = atoi(operand2);

cut2++;

buf(value2);

disp();

break;

default: break;

}

}

else if(ckey=='+'||ckey=='-'||ckey=='*'||ckey=='/')

{

bool = 1;

operator = ckey;

buf(0);

dbuf[7] = 10;

disp();

}

else if(ckey == '=')

{

value = compute(value1,value2,operator);

buf(value);

disp();

while(1) /* 计算结束等待清零键按下 */

{

ckey = keyscan();

if(ckey == '$') /* 如果有清零键按下跳转到开始 */

goto init;

else

{

buf(value);

disp();

}

}

}

else if(ckey == '$')

{ goto init;}

}

disp();

}

}

/******************************************

运算函数

输入:操作数和操作符

输出:计算结果

*******************************************/

uint compute(uint va1,uint va2,uchar optor)

{

uint value;

switch(optor)

{

case '+' : value = va1+va2; break;

case '-' : value = va1-va2; break;

case '*' : value = va1*va2; break;

case '/' : value = va1/va2; break;

default : break;

}

return value;

}

/*******************************************

更新显示缓存

输入:无符号整数

输出:将输入送入显示缓存

*******************************************/

void buf(uint val)

{

uchar i;

if(val == 0)

{

dbuf[7] = 0;

i = 6;

}

else

for(i = 7; val > 0; i--)

{

dbuf[i] = val % 10;

val /= 10;

}

for( ; i > 0; i--)

dbuf[i] = 10;

}

/*******************************************

显示函数

*******************************************/

void disp(void)

{

uchar bsel, n;

bsel=0x01;

for(n=0;n<8;n++)

{

P2=bsel;

P0=table[dbuf[n]];

bsel=_crol_(bsel,1);

delay(3);

P0=0xff;

}

}

最佳答案由网友  MENGHUANSANZH  提供

怎样用52单片机做计算机,利用串口小助手实现AT89S52单片机简易计算器完整程序(Keil)...相关推荐

  1. 利用串口网络助手上传数据、图片到OneNet平台以及获取数据(HTTP)

    利用串口网络助手上传数据.图片到OneNet平台以及获取数据(HTTP) 使用网络助手连接OneNet服务器 HTTP上传数据至OneNet 获取数据 上传图片至OneNet 使用网络助手连接OneN ...

  2. C#开发串口小助手(可更改波特率、串口号,可实现数据以及字符的收发)

    0. 前言 前置项目为:VS 2019中利用C#语言在.Net Framework 4.5框架上开发简易串口发送数据软件 本项目的全部代码已经放置至码云:https://gitee.com/jiawe ...

  3. 计算机科普知识ppt,科普知识计算机是我们小助手.ppt

    科普知识计算机是我们小助手 * 认识键盘 换档键 字母锁定键 退格键 功能键 制表定位键 小键盘 数字锁定键 空格键 控制键 光标键 * 计算机关机 因为电脑不同于普通电器,在关机之前,我们需要通知操 ...

  4. 利用Visual Studio(C++)实现简易计算器(二)

    简易计算器代码部分的实现 在已创建好的MFC解决方案里打开头文件下的-Dlg.h文件(以下简称.h文件).源文件下的-Dlg.cpp文件(以下简称.cpp文件)和资源文件下.rc文件里的Dialog\ ...

  5. 单片机做计算机乘法,基于单片机实现的四则运算计算器.DOC

    东北大学课程设计报告目录 目录 TOC \o "1-3" \h \z \u 课程设计(论文)任务书 h 错误!未定义书签. 摘要 h 1 第1章 绪论 h 2 1.1计算器简介 h ...

  6. 单片机做计算机乘法,运用单片机进行加减乘除法的运算

    练习:25H+36H? 程序如下: MOV R0,#25H;将立即数25送寄存器R0 MOV A,#36H;将立即数36送累加器A ADD A,R0;将R0与A的内容相加,结果在A NOP;空操作 P ...

  7. 基于MATLAB GUI界面的串口小助手

    文章目录 序 一.简介 二.步骤 1.创建一个空白GUI界面 2.拖入组件,进行搭建 3.编辑m文件 总结 序 将单片机传感器采集到的数据直接输入MATLAB进行运算分析,不仅适合仿真,在实际测试中, ...

  8. 手机计算机的隐藏小技巧,涨知识!MIUI计算器原来有这么多隐藏小技巧,最后一个绝对想不到...

    原标题:涨知识!MIUI计算器原来有这么多隐藏小技巧,最后一个绝对想不到 计算器除了我们需要进行日常的计算以外,几乎是用不到的.但是MIUI中的计算器与普通计算器可不同,里面的隐藏小技巧足以让你震惊到 ...

  9. 科学计算机bug,EMUI小助手:计算器百分比计算出bug?真相在这儿!

    本帖最后由 玩机小助手 于 2020-3-23 11:01 编辑 10.png (301.53 KB, 下载次数: 13) 2019-11-20 15:10 上传 最近很多小伙伴问小助手,手机里的计算 ...

  10. #利用C语言-EasyX图形设计-制作简易计算器#

    花了大概一周的时间,今天终于完成了简易版的计算器的制作,不过这计算器只能实现一些简单的加减乘除,不能进行复杂的运算,有兴趣的小伙伴们可以在这基础上进行添加修改,一起努力,一起进步!! #include ...

最新文章

  1. python培训学校-培训Python学校哪家好?推荐老男孩IT培训机构
  2. 如何为程序分配合适的栈空间?
  3. container_of(ptr, type, member)宏定义解析
  4. WebStorm按Tab建快速生成代码模块
  5. 当年发明hello, world的大神,后来怎么样了?
  6. linux下直接清空日志的方法
  7. matlab小区制移动通信网,LTE习题 - 无线移动 - 通信人家园 - Powered by C114
  8. 月均数据_数据|| 焊接不锈钢管、卷板、棒相继被调查,出口印度的量逐年降!...
  9. 计算机三级数据库知识锦集
  10. 虚拟大师怎么修改手机_[Android] 新版手机虚拟大师VMOS Pro超精简无广告2秒启动...
  11. SaaS vs 低代码,谁在成为中国产业服务的楔子?
  12. 电脑计算机快捷键切换桌面,电脑切换界面的快捷键是什么_电脑切换桌面快捷键怎么用-win7之家...
  13. Sklearn聚类算法之Affinity Propagation
  14. tar -zxvf是什么意思
  15. 目录-中文版Excel 2016宝典(第9版)
  16. Cortex-M3 Bit-Banding
  17. 微信小程序 手写签名_微信小程序实现电子签名功能
  18. 如何把h5场景链接入微信公众号?
  19. 运用计算机控制系统实现逆变过程,电大机电一体化复习题期末复习题(知识点复习考点归纳总结参考)...
  20. 织梦图集php,织梦怎么为新图集页面增加图片下载功能

热门文章

  1. aop切面重复调用两次controller
  2. 项目范围管理__范围管理计划 与 范围说明书
  3. 软件设计师中级-数据库系统
  4. 广告投放系统数据表设计
  5. python面试题:python计算股票收益最大化
  6. 新型脑机接口实现无线通信
  7. 离线语音风扇设计应用案例
  8. Java web登录验证码
  9. latex 数学公式_推荐一款编写数学公式的国产神器:AxMath,可与LATEX双向转换
  10. matlab中如何对一个小数取整,学习笔记153—matlab中小数如何取整?