用TX-1C的开发板写了一个简易的计算器

前不久看完了矩阵键盘和数码管的应用,自己动手花了一天时间写了一个简单的计算器

下面贴上源代码,大家可以测试一下。

上面4*4的矩阵键盘,作用分别是:

1  2  3  +

4  5  6  —

7  8  9  *

on/c 0  =  /

其中矩阵键盘的部分基本是照着书本的代码改的,然后自己做了部分修改。

由于是直接用 int 变量做的计算,而如果用 long 变量的话又要用到大数的运算,所以只能计算小于65536的数。

计算的步骤是这样的:

(主操作数)(操作符)(被操作数)(=)

//main.c
#include<reg52.h>
#include"involve.h"

uint num = 0;  //主操作数
uint temp_num = 0;  //被操作的数
uint show = 0;  //用于显示的数
uint mode = 0;  //当前计算器处于的操作状态(操纵符)
//‘+‘是1,‘-‘是2,‘*‘是3,‘/‘是4,‘=‘是5,之前无操纵状态则是0.
void main()
{
    while(1)  //不停地扫描键盘和展示当前状态
    {
        keyscan();
        display(show);
    }
}
  1 //keyscan.c
  2 #include"involve.h"
  3 extern num;
  4 extern temp_num;
  5 extern show;
  6 extern mode;
  7 void keyscan()  //键盘扫描程序
  8 {
  9     uchar temp;
 10     int key;
 11     P3 = 0xfe;
 12     temp = P3;
 13     temp = temp&0xf0;
 14     if(temp!=0xf0)
 15     {
 16         delay(10);
 17         temp = P3;
 18         temp = temp&0xf0;
 19         if(temp!=0xf0)
 20         {
 21             temp = P3;
 22             switch(temp)
 23             {
 24                 case 0xee:
 25                     key = 1;
 26                     break;
 27                 case 0xde:
 28                     key = 2;
 29                     break;
 30                 case 0xbe:
 31                     key = 3;
 32                     break;
 33                 case 0x7e:
 34                     key = 10;
 35                     if(mode==5) {temp_num = 0; } //如果之前是等号,被操作数重新置为0
 36                     mode = 1;
 37                     break;
 38             }
 39
 40             while(temp!=0xf0)
 41             {
 42                 temp = P3;
 43                 temp = temp&0xf0;
 44
 45             }
 46
 47             if(key>=0&&key<=9)  //无操纵状态则将操作数输入,有操纵状态则将被操纵数输入。
 48                   if(mode==0)
 49                 {
 50                     num = num*10 + key;show = num;
 51                 }
 52                 else
 53                 {
 54                     temp_num = temp_num*10 + key;show = temp_num;
 55                 }
 56
 57         }
 58     }
 59
 60     P3 = 0xfd;
 61     temp = P3;
 62     temp = temp&0xf0;
 63     if(temp!=0xf0)
 64     {
 65         delay(10);
 66         temp = P3;
 67         temp = temp&0xf0;
 68         if(temp!=0xf0)
 69         {
 70             temp = P3;
 71             switch(temp)
 72             {
 73                 case 0xed:
 74                     key = 4;
 75                     break;
 76                 case 0xdd:
 77                     key = 5;
 78                     break;
 79                 case 0xbd:
 80                     key = 6;
 81                     break;
 82                 case 0x7d:
 83                     key = 11;
 84                     if(mode==5) {temp_num = 0; }
 85                     mode = 2;
 86                     break;
 87             }
 88
 89             while(temp!=0xf0)
 90             {
 91                 temp = P3;
 92                 temp = temp&0xf0;
 93
 94             }
 95             if(key>=0&&key<=9)
 96                 if(mode==0)
 97                 {
 98                     num = num*10 + key;show = num;
 99                 }
100                 else
101                 {
102                     temp_num = temp_num*10 + key;show = temp_num;
103                 }
104         }
105     }
106
107     P3 = 0xfb;
108     temp = P3;
109     temp = temp&0xf0;
110     if(temp!=0xf0)
111     {
112         delay(10);
113         temp = P3;
114         temp = temp&0xf0;
115         if(temp!=0xf0)
116         {
117             temp = P3;
118             switch(temp)
119             {
120                 case 0xeb:
121                     key = 7;
122                     break;
123                 case 0xdb:
124                     key = 8;
125                     break;
126                 case 0xbb:
127                     key = 9;
128                     break;
129                 case 0x7b:
130                     key = 12;
131                     if(mode==5) {temp_num = 0; }
132                     mode = 3;
133                     break;
134             }
135
136             while(temp!=0xf0)
137             {
138                 temp = P3;
139                 temp = temp&0xf0;
140
141             }
142             if(key>=0&&key<=9)
143                 if(mode==0)
144                 {
145                     num = num*10 + key;show = num;
146                 }
147                 else
148                 {
149                     temp_num = temp_num*10 + key; show = temp_num;
150                 }
151         }
152     }
153
154     P3 = 0xf7;
155     temp = P3;
156     temp = temp&0xf0;
157     if(temp!=0xf0)
158     {
159         delay(10);
160         temp = P3;
161         temp = temp&0xf0;
162         if(temp!=0xf0)
163         {
164             temp = P3;
165             switch(temp)
166             {
167                 case 0xe7:
168                     key = 15;initial();   //如果按下on/c键,所有数据都被置为0.
169                     break;
170                 case 0xd7:
171                     key = 0;
172                     break;
173                 case 0xb7:
174                     key = 14;calculate(mode);  //按下‘=‘号,开始计算。
175                     mode = 5;
176                     break;
177                 case 0x77:
178                     key = 13;
179                     if(mode==5) {temp_num = 0; }
180                     mode = 4;
181                     break;
182             }
183
184             while(temp!=0xf0)
185             {
186                 temp = P3;
187                 temp = temp&0xf0;
188
189             }
190             if(key>=0&&key<=9)
191                 if(mode==0)
192                 {
193                     num = num*10 + key;show = num;
194                 }
195                 else
196                 {
197                     temp_num = temp_num*10 + key;show = temp_num;
198                 }
199         }
200     }
201 }
//function.c//各种函数的定义都在这儿。
#include"involve.h"
extern num;
extern temp_num;
extern show;
extern mode;
void delay(uint xms)
{
    uint i,j;
    for(i=0;i<xms;i++)
        for(j=0;j<110;j++);
}

void initial()
{
    num = 0;
    temp_num = 0;
    mode = 0;
    show = 0;
}

void calculate(int x)
{
    switch(x)
    {
    case 1:
        show = num + temp_num;break;
    case 2:
        show = num - temp_num;break;
    case 3:
        show = num * temp_num; break;
    case 4:
        if(temp_num==0)
            show = 1000000;  //之前以为long变量也可以进行四则运算,就想用一个7位数(数码管是6位),来表示被除数是 0 的错误状态。现在开来多次一举了
        else
            show = num / temp_num;
    }
    display(show);
    num = show;

}
//involve.h//各种申明。 1 #include<reg52.h>
 2 #define uint unsigned int
 3 #define uchar unsigned char
 4
 5 sbit dula = P2^6;
 6 sbit wela = P2^7;
 7
 8 void delay(uint);
 9 void keyscan();
10 void display(unsigned long);
11 void calculate(int);
12 void initial();
//display.c//数码管显示程序。 1 #include<reg52.h>
 2 #include"involve.h"
 3 uchar code table[]={
 4 0x3f,0x06,0x5b,0x4f,
 5 0x66,0x6d,0x7d,0x07,
 6 0x7f,0x6f,0x77,0x7c,
 7 0x39,0x5e,0x79,0x71
 8 };
 9 void display(unsigned long int x)
10 {
11         uint temp;
12         int ge,shi,bai,qian,wan,shiwan;
13         if(x==1000000)      //之前以为long变量也可以进行四则运算,就想用一个7位数(数码管是6位),来表示被除数是 0 的错误状态。现在开来多次一举了。
14         {
15
16         }
17         else
18         {
19         ge = x%10;
20         shi = x%100/10;
21         bai = x%1000/100;
22         qian = x%10000/1000;
23         wan = x%100000/10000;
24         shiwan = x%1000000/100000;
25
26         P0 = table[ge];
27         dula = 1;
28         dula = 0;
29         P0 = 0xff;
30         wela = 1;
31         P0 = 0xdf;
32         wela = 0;
33         //delay(5);
34
35         temp = x/10;
36         P0 = table[shi];
37         dula = 1;
38         dula = 0;
39         P0 = 0xff;
40         wela = 1;
41         if(temp) P0 = 0xef;
42         wela = 0;
43         //delay(5);
44
45
46         temp = x/100;
47         P0 = table[bai];
48         dula = 1;
49         dula = 0;
50         P0 = 0xff;
51         wela = 1;
52         if(temp) P0 = 0xf7;
53         wela = 0;
54         //delay(5);
55
56         temp = x/1000;
57         P0 = table[qian];
58         dula = 1;
59         dula = 0;
60         P0 = 0xff;
61         wela = 1;
62         if(temp) P0 = 0xfb;
63         wela = 0;
64         //delay(5);
65
66         temp = x/10000;
67         P0 = table[wan];
68         dula = 1;
69         dula = 0;
70         P0 = 0xff;
71         wela = 1;
72         if(temp) P0 = 0xfd;
73         wela = 0;
74         //delay(5);
75
76
77         temp = x/100000;
78         P0 = table[shiwan];
79         dula = 1;
80         dula = 0;
81         P0 = 0xff;
82         wela = 1;
83         if(temp) P0 = 0xfe;
84         wela = 0;
85         //delay(5);
86         }
87 }

好了程序到这就结束了,下载生成hex文件试试效果吧!

时间: 2024-08-07 00:17:56

用TX-1C的开发板写了一个简易的计算器的相关文章

IMX6开发板创建第一个Android应用程序helloworld

运行行 AndroidStudio 程序.如下图,选择创建一个新的 androidstudio 工程(基于 迅为-i.mx6开发板)应用名称改为“helloworld”,项目保存路径修改为自己的保存路径.连续点击下一步,直到如下界面,选择“Basic Activity”模板.继续点击下一步直到出现如下界面.点击“Finish”按钮,完成创建工程. 部分视频观看地址( 更多视频教程可在B站上搜索‘迅为电子’ ) iTOP-4412精英版开发板硬件连接 https://www.bilibili.co

[maven学习笔记]第一节,认识maven,搭建maven开发环境,写第一个HelloWorld

本文地址:http://blog.csdn.net/sushengmiyan/article/details/40142771 maven官网:http://maven.apache.org/ 学习视频地址:http://www.icoolxue.com/album/show/45 5分钟学习maven:http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html maven的一个中央仓库:http://mvn

关于郭天祥51开发板无法烧写程序问题的解决(Prolific USB-to-Serial Comm Port)

1. 事件背景: 由于使用了win8系统,之前购买的郭天祥C51开发板在通过一个两头都是usb口的下载线下载程序时出现了问题:下载工具stc isp无法连接到开发板上的串口,所以无法下载程序到c51开发板上,错误显示如下 2. 寻求解决方法 本人尝试了网络几乎所有的方法,包括更新驱动.恢复驱动到旧版本(可能有用,我没用)等等方式都没有成功.这导致本人当时几乎放弃了这块板子.在尝试过程中我也想过用u转串连接板子上的串口到电脑的usb口来下载程序,但是也没有成功. 3. 踏破铁鞋无觅处,得来全不费工

20150502 调试分析之 使用gdb远程调试ARM开发板

20150502 调试分析之 使用gdb远程调试ARM开发板 2015-05-02 Lover雪儿 今天我们要学习的是使用gdb和gdbserver来远程调试开发板程序. 下面是本人的一些具体步骤: 下载gdb-7.9.tar.gz地址: http://ftp.gnu.org/gnu/gdb/gdb-7.9.tar.gz 安装gdb tar -jxvf gdb-7.9.tar.bz2 ./configure -target=arm-none-linux-gnueabi --prefix=/hom

第五章搭建S3C6410开发板的测试环境

第五章本章主要介绍开发板的调试环境的搭建,以及如何将Android系统安装开发板上. 开发板是开发和学习嵌入式技术的主要硬件设备. 尽管可以在PC上开发Linux驱动,然后重新编译成ARM构架的Linux驱动模块,但最终都是要在开发板上进行测试的. 开发板从技术上说与手机类似,包含显示器.键盘.Wi-Fi.蓝牙等模块.开发板可扩展的端口多,容易开发定制的硬件. 第一节S3V6410开发板简介 S3C6410是一款低功耗.高性价比的RISC处理器,它给予ARM11内核,可以广泛应用于移动电话和通用

搭建S3C6410开发板的测试环境

开发板(demoboard)是用来进行嵌入式系统开发的电路板,包括中央处理器.存储器.输入设备.输出设备.数据通路/总线和外部资源接口等一系列硬件组件.在一般的嵌入式系统开发过程中,硬件一般被分成两个平台,一个是开发平台(host),一个是目标平台(target)即开发板.在此描述的开发平台指的是使用计算机,通过传输的界面,例如串口(RS-232).USB.并口.或者网络(Ethernet)与目标平台连接.ARM构架的开发板可基于X86构架的PC 在CPU指令以及二进制格式上有所不同.使用OK6

第五章 搭建 S3C6.410 开发板的 测试环境

一.前言 开发板从技术上说与我们经常用的手机类似, 也包含显示屏. 键盘. Wi-Fi. 蓝牙等模块(可 能有的是选配〉.但与手机不同的是在开发板上安装嵌入式系统要比手机容易得多.而且一般开发 扳都有很多扩展的端口,可以很容易开发定制的硬件, 并与开发板链接.因此,开发板相对于孚机 来说,更适合对程序进行测试,尤其适合对底层的 Linux 程序(如 Linux 驱动〉进行测试. 目前市面上的开发板型号和种类很多,但目前最流行的是基于三星S3C6410 ARM11架构的开发板.国内很多厂商在S3C

S3C6410开发板开发环境的搭建

本节主要介绍了S3C6410开发板及OK6410开发板.OK6410开发板是基于ARM11处理器的S3C6410,采用“核心版+底板”结构 主要步骤如下:. OK6410开发板自带一个串口,PC也需要与串口设备通信.Ubuntu Linux安装串口调试工具minicom步骤: 第1步:检测当前系统是否支持USB转串口 第2步:安装minicom 第3步:配置minicom 第4步:测试minicom OK6410默认安装WinCE6.0,需要先卸载再安装Android,烧写要启动Eboot擦除N

Android深度探索(卷1)HAL与驱动开发 第五章 搭建S3C6410 开发板的测试环境

第五章 搭建S3C6410 开发板的测试环境 心得体会 开始进行安装串口调试工具:minicom  OK6410开发板带了一个串口.可以通过串口线与PC连接.Linux驱动在输出调试信息的同时会通过串口线教调试信息发送到PC上,这样Linux驱动程序员就可以直接在PC上查看调试信息了.(对一些笔记本需要使用USB转RS232串口线) 1.检测当前系统是否支持USB转串口 #lsmod | grep usbserial 2.安装minicom #apt-get install minicom 3.