计算器编程实例
Python编程基础与应用 简单四则运算计算器[3页]
![Python编程基础与应用 简单四则运算计算器[3页]](https://img.taocdn.com/s3/m/2dc6decd988fcc22bcd126fff705cc1754275f5a.png)
简单四则运算计算器【案例描述】使用面向对象编程思想,编写一个简单的四则运算器。
可以通过数值的输入,进行整数四则运算,并且能够反复运算,直至输入退出信息为止。
【案例分析】1)按要求设计一个计算器类,包含四个运算方法。
2)为了使程序可以反复运算,直到选择退出为止,可以使用while循环语句实现。
3)开始运行时,需要用户输入两个需要计算的数,和输入需要运算的法则。
4)创建一个计算器对象,根据运算的法则调用对象中相应的方法,完成计算任务。
它用到的技术点有以下几方面:定义计算器类,定义类的方法和属性。
通过选择判断结构选择对象对应的方法执行运算。
【实施步骤】新建Python文件“computer.py”,输入以下代码。
class Computer:one=0two=0op=''result=0#构造函数def __init__(self,sone,stwo):self.one=soneself.two=stwo#定义加法def addone(self):result=one+tworeturn result#定义减法def minus(self):result = one - tworeturn result#定义乘法def multiply(self):result = one * tworeturn result#定义除法def division(self):result = one / tworeturn result#实例化类,调用它进行计算print("本程序是一个简易的四则运算计数器.")flag = Truewhile flag:one = int(input("请输入第一个数:"))two = int(input("请输入第二个数:"))operation = input("请输入要执行的四则运算(+-*/):")cp=Computer(one,two)if operation == '+':print(cp.addone())elif operation == '-':print(cp.minus())elif operation == '*' or operation == 'x':print(cp.multiply())elif operation == '/' or operation == '÷':print(cp.division())else:print("输入有误!")while True:Continue = input("是否继续?y/n:")if Continue == 'y':breakelif Continue == 'n':while_condition = Falsebreakelse:print("输入有误,请重新输入!")【调试结果】可以直接在文件夹路径中双击“computer.py”文件,即可调用,输入需要运算的两个数以及运算符号后,程序会自动进行计算,效果如图1所示。
计算器Java编程完全代码

计算器Java编程代码1、界面截图1、程序代码import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Counter implements ActionListener {// 改进小数问题private boolean append = false;JButton[] jb = new JButton[20];JTextField jtf = new JTextField(19);String[] st = { "Backs", "CE", "C", "+", " 7 ", " 8 ", " 9", "-"," 4 ", " 5 ", " 6", "*", " 1 ", " 2 ", " 3", "/"," . ", "+/-", " 0", "=", };String num1 = "0";String operator = "+";public Counter() {JFrame jf = new JFrame("计算器");// 界面设置GridLayout gl = new GridLayout(6, 1);jf.setLayout(gl);JPanel jp0 = new JPanel();jp0.add(jtf);jf.add(jp0);JPanel jp1 = new JPanel();for (int i = 0; i < 4; i++) {jb[i] = new JButton(st[i]);jp1.add(jb[i]);}jf.add(jp1);JPanel jp2 = new JPanel();for (int i = 4; i < 8; i++) {jb[i] = new JButton(st[i]);jp2.add(jb[i]);}jf.add(jp2);JPanel jp3 = new JPanel();for (int i = 8; i < 12; i++) {jb[i] = new JButton(st[i]);jp3.add(jb[i]);}jf.add(jp3);JPanel jp4 = new JPanel();for (int i = 12; i < 16; i++) { jb[i] = new JButton(st[i]);jp4.add(jb[i]);}jf.add(jp4);JPanel jp5 = new JPanel();for (int i = 16; i < 20; i++) { jb[i] = new JButton(st[i]);jp5.add(jb[i]);}jf.add(jp5);jtf.setEditable(false);// 文本框不可编辑jf.setResizable(false);// 窗口不可编辑jf.pack();// 自动调整窗口的大小// jf.setSize(240, 220);jf.setLocation(450, 300);jf.setVisible(true);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);for (int i = 0; i < 20; i++) {// 注册监听jb[i].addActionListener(this);}}public void actionPerformed(ActionEvent ae) {String s = ae.getActionCommand();if (s.trim().matches("^\\d$")) {// 判断是输入的是否是数字if (append) {// 追加数字String ss = jtf.getText().trim();jtf.setText(ss + s.trim());} else {// 替换文本框原来的数字jtf.setText(s.trim());append = true;}} else if ("+-/*".indexOf(s.trim()) != -1) {// 判断按的是否是四则运算符num1 = jtf.getText();// 将第一次输入的数存储起来operator = s.trim();// 将输入的符号存储起来append = false;} else if ("=".equals(s.trim())) {String num2 = jtf.getText();double d1 = Double.parseDouble(num1);double d2 = Double.parseDouble(num2);if ("+".equals(operator)) {// 加法运算d1 = d1 + d2;} else if ("-".equals(operator)) {// 减法运算d1 = d1 - d2;} else if ("*".equals(operator)) {// 乘法运算d1 = d1 * d2;} else if ("/".equals(operator)) {// 除法运算d1 = d1 / d2;}jtf.setText(d1 + "");// 显示结果append = false;} else if (".".equals(s.trim())) {// 判断小数点String temp = jtf.getText();if (temp.indexOf(".") == -1) {jtf.setText(temp + ".");append = true;}} else if ("+/-".equals(s.trim())) {// 判断+/-String temp = jtf.getText();if(temp.startsWith("-")) {// 如果该数是负数则取负号后的数字jtf.setText(temp.substring(1));} else {// 如果是正数则在这个数前加上负号jtf.setText("-" + temp);}} else if ("CE".equals(s.trim()) || "C".equals(s.trim())) {// 判断复位键jtf.setText("0");append = false;} else if ("BackS".equals(s.trim())) {// 判断BackS键(删除)String temp = jtf.getText();if (temp.length() > 0) {jtf.setText(temp.substring(0, temp.length() - 1));}}}public static void main(String[] args) {new Counter();}}。
VB简易计算器代码

VB简易计算器代码下面是一个简单的VB计算器代码,用于执行基本的加、减、乘、除运算。
```vbOption Strict OnPublic Class CalculatorPrivate Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.ClickDim num1 As Double = CDbl(txtNum1.Text)Dim num2 As Double = CDbl(txtNum2.Text)Dim result As Double = num1 + num2txtResult.Text = result.ToStringEnd SubPrivate Sub btnSubtract_Click(sender As Object, e As EventArgs) Handles btnSubtract.ClickDim num1 As Double = CDbl(txtNum1.Text)Dim num2 As Double = CDbl(txtNum2.Text)Dim result As Double = num1 - num2txtResult.Text = result.ToStringPrivate Sub btnMultiply_Click(sender As Object, e As EventArgs) Handles btnMultiply.ClickDim num1 As Double = CDbl(txtNum1.Text)Dim num2 As Double = CDbl(txtNum2.Text)Dim result As Double = num1 * num2txtResult.Text = result.ToStringEnd SubPrivate Sub btnDivide_Click(sender As Object, e As EventArgs) Handles btnDivide.ClickDim num1 As Double = CDbl(txtNum1.Text)Dim num2 As Double = CDbl(txtNum2.Text)If num2 = 0 ThenMessageBox.Show("除数不能为0!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error)ElseDim result As Double = num1 / num2txtResult.Text = result.ToStringEnd IfEnd Sub```此代码创建了一个简单的窗体应用程序,其中包含两个文本框用于输入两个数字,四个按钮用于执行不同的计算操作,以及一个文本框用于显示结果。
C++课件案例二十七个人所得税计算器

测试数据应涵盖各种特殊情况,如多份收入、减 免政策、专项扣除等,以确保计算器的功能完备。
3
模拟用户输入
为了模拟真实用户使用场景,测试数据应包括用 户输入的格式、边界条件等,以检测计算器的容 错能力和用户体验。
测试过程与结果
执行测试用例
根据测试数据,逐一执行测试用例,观察计算器 的输出结果是否正确。
C++课件案例二十七:个人 所得税计算器
• 引言 • 个人所得税基础知识 • C编程基础 • 个人所得税计算器实现 • 测试与验证 • 总结与展望
01
引言
主题简介
个人所得税计算器
本案例将介绍如何使用C编程语言开 发一个个人所得税计算器。该计算器 能够根据用户输入的收入计算应缴纳 的个人所得税,并显示税款金额。
(==、!=、>、<、>=、<=)、逻辑运算符(&&、||、!)等,用
于执行各种运算和逻辑判断。
04
个人所得税计算器实现
用户界面设计
用户界面布局
使用图形用户界面(GUI)工具, 如Qt或MFC,设计一个简洁明了 的界面,包括输入框、按钮和显
示区域。
控件选择
选择适当的控件,如文本框、按钮、 标签等,用于接收用户输入、显示 结果和触发计算逻辑。
个人所得税税率表
01
工资、稿酬等所得适用的超额累 进税率表:根据应纳税所得额的 不同区间,分别适用不同的税率 。
02
企业事业单位分红等所得适用的 比例税率表:根据不同的所得项 目,适用不同的比例税率。
03
C编程基础
C语言概述
C语言特点
C是一种高效、可移植、可扩展 的编程语言,具有面向对象、泛 型编程、STL标准库等特性,广 泛应用于系统软件、应用软件和
计算器的python代码

计算器的python代码摘要:1.计算器的Python 代码概述2.Python 计算器的实现方法3.Python 计算器的具体代码示例4.Python 计算器的应用场景正文:1.计算器的Python 代码概述Python 是一种流行的高级编程语言,以其简洁的语法和强大的功能而闻名。
Python 被广泛用于各种应用程序的开发,包括计算器。
计算器的Python 代码指的是用Python 编写的实现计算器功能的程序代码。
2.Python 计算器的实现方法Python 计算器的实现方法有很多,可以使用Python 的内置函数,也可以使用自定义函数。
Python 计算器可以实现加减乘除等基本运算,也可以实现更复杂的数学运算,如三角函数、对数函数等。
3.Python 计算器的具体代码示例下面是一个简单的Python 计算器的代码示例:```pythondef add(x, y):return x + ydef subtract(x, y):return x - ydef multiply(x, y):return x * ydef divide(x, y):return x / yprint("请选择操作:")print("1.加法")print("2.减法")print("3.乘法")print("4.除法")choice = input("请输入操作对应的数字:")um1 = float(input("请输入第一个数字:"))um2 = float(input("请输入第二个数字:"))if choice == "1":print(num1, "+", num2, "=", add(num1, num2)) elif choice == "2":print(num1, "-", num2, "=", subtract(num1, num2)) elif choice == "3":print(num1, "*", num2, "=", multiply(num1, num2)) elif choice == "4":print(num1, "/", num2, "=", divide(num1, num2)) else:print("输入错误,请输入正确的操作对应的数字")```4.Python 计算器的应用场景Python 计算器可以应用于各种场景,如在线计算器、编程教学、自动化测试等。
C#编写简易计算器(附源代码)超详细

超详细一、因为计算器设计的控件太多,不便使用控制台应用程序完成,所以这里使用Windows窗体应用程序,并命名为Calc,如下图所示:二、向窗体中拖入需要的控件,如下图所示:(完成效果图)结果显示区(作者博客左边的文本框)是TextBox控件,并修改其name为txtShow ,按键0~9为Button控件,并将其name分别修改为btn_0、btn_1、btn_2、btn_3、btn_4、btn_5、btn_6、btn_7、btn_8、btn_9;按键【负数】的name值修改为btn_sign,按键【.】的name 修改为btn_dot,按键【+ - * /】的name值分别修改为btn_add、btn_sub、btn_mul、btn_div,按键【=】的name值修改为btn_equ,按键【倒数】的name值修改为btn_rev,按键【平方】的name值修改为btn_sqr,按键【开方】的name值修改为btn_sqrt。
右边的计算器图片空间是PictureBox,作者博客控件是LinkLabel,可以不添加,以上所有控件均可按照需求添加,只保留自己需要的按钮控件和textbox控件即可。
三、代码部分(含解释),采用switch多分支语句编写using System;using System.Drawing;using System.Collections;using ponentModel;using System.Windows.Forms;using System.Data;namespace Calc{///<summary>/// QQ:479340056 温柔一刀C#简易计算器的实现///</summary>public class CalcForm : System.Windows.Forms.Form{private System.Windows.Forms.Button btn_0;private System.Windows.Forms.Button btn_1;private System.Windows.Forms.Button btn_2;private System.Windows.Forms.Button btn_3;private System.Windows.Forms.Button btn_4;private System.Windows.Forms.Button btn_5;private System.Windows.Forms.Button btn_6;private System.Windows.Forms.Button btn_7;private System.Windows.Forms.Button btn_8;private System.Windows.Forms.Button btn_9;private System.Windows.Forms.Button btn_add;private System.Windows.Forms.Button btn_sub;private System.Windows.Forms.Button btn_mul;private System.Windows.Forms.Button btn_div;private System.Windows.Forms.Button btn_sqrt;private System.Windows.Forms.Button btn_sign;private System.Windows.Forms.Button btn_equ;private System.Windows.Forms.Button btn_dot;private System.Windows.Forms.Button btn_rev;private System.Windows.Forms.TextBox txtShow;private System.Windows.Forms.Button btn_sqr;private PictureBox pictureBox1;private LinkLabel linkLabel1;///<summary>///必需的设计器变量。
计算器的python代码

以下是一个简单的计算器的Python代码示例,可以进行基本的加减乘除运算:定义加法函数def add(x, y):return x + y定义减法函数def subtract(x, y):return x - y定义乘法函数def multiply(x, y):return x * y定义除法函数def divide(x, y):return x / y主程序while True:print("选择操作:")print("1. 加")print("2. 减")print("3. 乘")print("4. 除")print("5. 退出")choice = input("输入选择(1/2/3/4/5): ")if choice in ('1', '2', '3', '4'):num1 = float(input("输入第一个数字: "))num2 = float(input("输入第二个数字: "))if choice == '1':print(num1, "+", num2, "=", add(num1, num2))elif choice == '2':print(num1, "-", num2, "=", subtract(num1, num2))elif choice == '3':print(num1, "*", num2, "=", multiply(num1, num2))elif choice == '4':if num2 == 0:print("错误:除数不能为0")else:print(num1, "/", num2, "=", divide(num1, num2)) elif choice == '5':print("退出")breakelse:print("无效输入")这段代码定义了四个基本的数学运算函数,然后通过用户输入的选择来调用相应的函数进行计算。
js中简单计算器的代码

js中简单计算器的代码在JavaScript中,我们可以使用简单的语法来编写一个基本的计算器。
计算器可以执行加法、减法、乘法和除法等数学运算操作。
为了编写这个计算器程序,我们需要创建三个主要的函数,分别是获取输入、执行计算和输出结果。
首先定义一个由用户输入的数字和运算符组成的表达式,然后解析表达式,并在最终屏幕上显示计算结果。
下面是一个简单的计算器程序示例,可以执行加法、减法、乘法和除法四种基本运算:```jsfunction getInputValue() {var x = parseFloat(document.getElementById("input1").value); var y = parseFloat(document.getElementById("input2").value); var op = document.getElementById("operator").value;return [x, y, op];}function calculate() {var result;var [x,y,op] = getInputValue();if (op === "+") {result = x + y;} else if (op === "-") {result = x - y;} else if (op === "*") {result = x * y;} else if (op === "/") {result = x / y;}return result;}function displayResult() {var result = calculate();document.getElementById("result").innerHTML = result;}```这个计算器程序中,`getInputValue()`函数获取用户输入的数值和运算符,`calculate()`函数执行数学运算并返回计算结果,`displayResult()`函数将结果输出到屏幕上。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
按键和液晶,可以组成我们最简易的计算器。
下面我们来写一个简易整数计算器提供给大家学习。
为了让程序不过于复杂,我们这个计算器不考虑连加,连减等连续计算,不考虑小数情况。
加减乘除分别用上下左右来替代,回车表示等于,ESC 表示归 0。
程序共分为三部分,一部分是 1602 液晶显示,一部分是按键动作和扫描,一部分是主函数功能。
/***************************Lcd1602.c 文件程序源代码*****************************/ #include <reg52.h>#define LCD1602_DB P0sbit LCD1602_RS = P1^0;sbit LCD1602_RW = P1^1;sbit LCD1602_E = P1^5;/* 等待液晶准备好 */void LcdWaitReady(){unsigned char sta;LCD1602_DB = 0xFF;LCD1602_RS = 0;LCD1602_RW = 1;do {LCD1602_E = 1;sta = LCD1602_DB; //读取状态字LCD1602_E = 0;} while (sta & 0x80); //bit7 等于 1 表示液晶正忙,重复检测直到其等于 0 为止}/* 向 LCD1602 液晶写入一字节命令,cmd-待写入命令值 */void LcdWriteCmd(unsigned char cmd){LcdWaitReady();LCD1602_RS = 0;LCD1602_RW = 0;LCD1602_DB = cmd;LCD1602_E = 1;LCD1602_E = 0;}/* 向 LCD1602 液晶写入一字节数据,dat-待写入数据值 */void LcdWriteDat(unsigned char dat){LcdWaitReady();LCD1602_RS = 1;LCD1602_RW = 0;LCD1602_DB = dat;LCD1602_E = 1;LCD1602_E = 0;}/* 设置显示 RAM 起始地址,亦即光标位置,(xy)-对应屏幕上的字符坐标 */ void LcdSetCursor(unsigned char x unsigned char y){unsigned char addr;if (y == 0) //由输入的屏幕坐标计算显示 RAM 的地址addr = 0x00 + x; //第一行字符地址从 0x00 起始elseaddr = 0x40 + x; //第二行字符地址从 0x40 起始LcdWriteCmd(addr | 0x80); //设置 RAM 地址}/* 在液晶上显示字符串,(xy)-对应屏幕上的起始坐标,str-字符串指针 */ void LcdShowStr(unsigned char x unsigned char y unsigned char *str){LcdSetCursor(x y); //设置起始地址while (*str != '\0') //连续写入字符串数据,直到检测到结束符{LcdWriteDat(*str++);}}/* 区域清除,清除从(xy)坐标起始的 len 个字符位 */void LcdAreaClear(unsigned char x unsigned char y unsigned char len){LcdSetCursor(x y); //设置起始地址while (len--) //连续写入空格{LcdWriteDat(' ');}}/* 整屏清除 */void LcdFullClear(){LcdWriteCmd(0x01);}/* 初始化 1602 液晶 */void InitLcd1602(){LcdWriteCmd(0x38); //16*2 显示,5*7 点阵,8 位数据接口LcdWriteCmd(0x0C); //显示器开,光标关闭LcdWriteCmd(0x06); //文字不动,地址自动+1LcdWriteCmd(0x01); //清屏}Lcd1602.c 文件中根据上层应用的需要增加了2 个清屏函数:区域清屏——LcdAreaClear,整屏清屏——LcdFullClear。
/**************************keyboard.c 文件程序源代码*****************************/#include <reg52.h>sbit KEY_IN_1 = P2^4;sbit KEY_IN_2 = P2^5;sbit KEY_IN_3 = P2^6;sbit KEY_IN_4 = P2^7;sbit KEY_OUT_1 = P2^3;sbit KEY_OUT_2 = P2^2;sbit KEY_OUT_3 = P2^1;sbit KEY_OUT_4 = P2^0;unsigned char code KeyCodeMap[4][4] = { //矩阵按键编号到标准键盘键码的映射表{ '1' '2' '3' 0x26 } //数字键 1、数字键 2、数字键 3、向上键{ '4' '5' '6' 0x25 } //数字键 4、数字键 5、数字键 6、向左键{ '7' '8' '9' 0x28 } //数字键 7、数字键 8、数字键 9、向下键{ '0' 0x1B 0x0D 0x27 } //数字键 0、ESC 键、回车键、向右键};unsigned char pdata KeySta[4][4] = { //全部矩阵按键的当前状态{1 1 1 1} {1 1 1 1} {1 1 1 1} {1 1 1 1}};extern void KeyAction(unsigned char keycode);/* 按键驱动函数,检测按键动作,调度相应动作函数,需在主循环中调用 */void KeyDriver(){unsigned char i j;static unsigned char pdata backup[4][4] = { //按键值备份,保存前一次的值{1 1 1 1} {1 1 1 1} {1 1 1 1} {1 1 1 1}};for (i=0; i<4; i++) //循环检测 4*4 的矩阵按键{for (j=0; j<4; j++){if (backup[i][j] != KeySta[i][j]) //检测按键动作{if (backup[i][j] != 0) //按键按下时执行动作{KeyAction(KeyCodeMap[i][j]); //调用按键动作函数}backup[i][j] = KeySta[i][j]; //刷新前一次的备份值}}}}/* 按键扫描函数,需在定时中断中调用,推荐调用间隔 1ms */void KeyScan(){unsigned char i;static unsigned char keyout = 0; //矩阵按键扫描输出索引static unsigned char keybuf[4][4] = { //矩阵按键扫描缓冲区{0xFF 0xFF 0xFF 0xFF} {0xFF 0xFF 0xFF 0xFF}{0xFF 0xFF 0xFF 0xFF} {0xFF 0xFF 0xFF 0xFF}};//将一行的 4 个按键值移入缓冲区keybuf[keyout][0] = (keybuf[keyout][0] << 1) | KEY_IN_1;keybuf[keyout][1] = (keybuf[keyout][1] << 1) | KEY_IN_2;keybuf[keyout][2] = (keybuf[keyout][2] << 1) | KEY_IN_3;keybuf[keyout][3] = (keybuf[keyout][3] << 1) | KEY_IN_4;//消抖后更新按键状态for (i=0; i<4; i++) //每行 4 个按键,所以循环 4 次{if ((keybuf[keyout][i] & 0x0F) == 0x00){ //连续 4 次扫描值为 0,即 4*4ms 内都是按下状态时,可认为按键已稳定的按下 KeySta[keyout][i] = 0;}else if ((keybuf[keyout][i] & 0x0F) == 0x0F){ //连续 4 次扫描值为 1,即 4*4ms 内都是弹起状态时,可认为按键已稳定的弹起 KeySta[keyout][i] = 1;}}//执行下一次的扫描输出keyout++; //输出索引递增keyout &= 0x03; //索引值加到 4 即归零switch (keyout) //根据索引,释放当前输出引脚,拉低下次的输出引脚{case 0: KEY_OUT_4 = 1; KEY_OUT_1 = 0; break;case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break;case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0; break;case 3: KEY_OUT_3 = 1; KEY_OUT_4 = 0; break;default: break;}}keyboard.c 是对之前已经用过多次的矩阵按键驱动的封装,具体到某个按键要执行的动作函数都放到上层的 main.c 中实现,在这个按键驱动文件中只负责调用上层实现的按键动作函数即可。
/*****************************main.c 文件程序源代码******************************/ keyboard.c 是对之前已经用过多次的矩阵按键驱动的封装,具体到某个按键要执行的动作函数都放到上层的 main.c 中实现,在这个按键驱动文件中只负责调用上层实现的按键动作函数即可。
/*****************************main.c 文件程序源代码******************************/ #include <reg52.h>unsigned char step = 0; //操作步骤unsigned char oprt = 0; //运算类型signed long num1 = 0; //操作数 1signed long num2 = 0; //操作数 2signed long result = 0; //运算结果unsigned char T0RH = 0; //T0 重载值的高字节unsigned char T0RL = 0; //T0 重载值的低字节void ConfigTimer0(unsigned int ms);extern void KeyScan();extern void KeyDriver();extern void InitLcd1602();extern void LcdShowStr(unsigned char x unsigned char y unsigned char *str);extern void LcdAreaClear(unsigned char x unsigned char y unsigned char len);extern void LcdFullClear();void main(){EA = 1; //开总中断ConfigTimer0(1); //配置 T0 定时 1msInitLcd1602(); //初始化液晶LcdShowStr(15 1 "0"); //初始显示一个数字 0while (1){KeyDriver(); //调用按键驱动}}/* 长整型数转换为字符串,str-字符串指针,dat-待转换数,返回值-字符串长度 */unsigned char LongToString(unsigned char *str signed long dat){signed char i = 0;unsigned char len = 0;unsigned char buf[12];if (dat < 0) //如果为负数,首先取绝对值,并在指针上添加负号 {dat = -dat;*str++ = '-';len++;}do { //先转换为低位在前的十进制数组buf[i++] = dat % 10;dat /= 10;} while (dat > 0);len += i; //i 最后的值就是有效字符的个数while (i-- > 0) //将数组值转换为 ASCII 码反向拷贝到接收指针上 {*str++ = buf[i] + '0';}*str = '\0'; //添加字符串结束符return len; //返回字符串长度}/* 显示运算符,显示位置 y,运算符类型 type */void ShowOprt(unsigned char y unsigned char type){switch (type){case 0: LcdShowStr(0 y "+"); break; //0 代表+case 1: LcdShowStr(0 y "-"); break; //1 代表-case 2: LcdShowStr(0 y "*"); break; //2 代表*case 3: LcdShowStr(0 y "/"); break; //3 代表/default: break;}}/* 计算器复位,清零变量值,清除屏幕显示 */void Reset(){num1 = 0;num2 = 0;step = 0;LcdFullClear();}/* 数字键动作函数,n-按键输入的数值 */void NumKeyAction(unsigned char n){unsigned char len;unsigned char str[12];if (step > 1) //如计算已完成,则重新开始新的计算{Reset();}if (step == 0) //输入第一操作数{num1 = num1*10 + n; //输入数值累加到原操作数上len = LongToString(str num1); //新数值转换为字符串LcdShowStr(16-len 1 str); //显示到液晶第二行上}else //输入第二操作数{num2 = num2*10 + n; //输入数值累加到原操作数上len = LongToString(str num2); //新数值转换为字符串LcdShowStr(16-len 1 str); //显示到液晶第二行上}}/* 运算符按键动作函数,运算符类型 type */void OprtKeyAction(unsigned char type){unsigned char len;unsigned char str[12];if (step == 0) //第二操作数尚未输入时响应,即不支持连续操作 {len = LongToString(str num1); //第一操作数转换为字符串 LcdAreaClear(0 0 16-len); //清除第一行左边的字符位LcdShowStr(16-len 0 str); //字符串靠右显示在第一行ShowOprt(1 type); //在第二行显示操作符LcdAreaClear(1 1 14); //清除第二行中间的字符位LcdShowStr(15 1 "0"); //在第二行最右端显示 0oprt = type; //记录操作类型step = 1;}}/* 计算结果函数 */void GetResult(){unsigned char len;unsigned char str[12];if (step == 1) //第二操作数已输入时才执行计算{step = 2;switch (oprt) //根据运算符类型计算结果,未考虑溢出问题{case 0: result = num1 + num2; break;case 1: result = num1 - num2; break;case 2: result = num1 * num2; break;case 3: result = num1 / num2; break;default: break;}len = LongToString(str num2); //原第二操作数和运算符显示到第一行 ShowOprt(0 oprt);LcdAreaClear(1 0 16-1-len);LcdShowStr(16-len 0 str);len = LongToString(str result); //计算结果和等号显示在第二行LcdShowStr(0 1 "=");LcdAreaClear(1 1 16-1-len);LcdShowStr(16-len 1 str);}}/* 按键动作函数,根据键码执行相应的操作,keycode-按键键码 */void KeyAction(unsigned char keycode){if ((keycode>='0') && (keycode<='9')) //输入字符{NumKeyAction(keycode - '0');}else if (keycode == 0x26) //向上键,+{OprtKeyAction(0);}else if (keycode == 0x28) //向下键,-{OprtKeyAction(1);}else if (keycode == 0x25) //向左键,*{OprtKeyAction(2);}else if (keycode == 0x27) //向右键,÷{OprtKeyAction(3);}else if (keycode == 0x0D) //回车键,计算结果{GetResult();}else if (keycode == 0x1B) //Esc 键,清除{Reset();LcdShowStr(15 1 "0");}}/* 配置并启动 T0,ms-T0 定时时间 */void ConfigTimer0(unsigned int ms){unsigned long tmp; //临时变量tmp = 11059200 / 12; //定时器计数频率tmp = (tmp * ms) / 1000; //计算所需的计数值tmp = 65536 - tmp; //计算定时器重载值tmp = tmp + 28; //补偿中断响应延时造成的误差T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节T0RL = (unsigned char)tmp;TMOD &= 0xF0; //清零 T0 的控制位TMOD |= 0x01; //配置 T0 为模式 1TH0 = T0RH; //加载 T0 重载值TL0 = T0RL;ET0 = 1; //使能 T0 中断TR0 = 1; //启动 T0}/* T0 中断服务函数,执行按键扫描 */void InterruptTimer0() interrupt 1{TH0 = T0RH; //重新加载重载值TL0 = T0RL;KeyScan(); //按键扫描}main.c 文件实现所有应用层的操作函数,即计算器功能所需要信息显示、按键动作响应等,另外还包括主循环和定时中断的调度。