当前位置:首页 > 单片机 > 单片机
[导读] 51 单片机,本质上是微控制器,以逻辑运算见长。用它来设计计算器 ?不知道谁想出来的这样的题目,思路明显就是跑偏了,呵呵特别是后一个的题目,不仅要求能加减乘除,竟然还要求选用数码管来显示。如果

51 单片机,本质上是微控制器,以逻辑运算见长。

用它来设计计算器

不知道谁想出来的这样的题目,思路明显就是跑偏了,呵呵


特别是后一个的题目,不仅要求能加减乘除,竟然还要求选用数码管来显示。

如果是选用 LCD1602 液晶屏来显示,勉强还算对路。

数码管,只能显示出来减号,让它显示加号、乘号、除号,都是不可能的。


一些网友为这个题目提供了答案,可是没有一个像样的,呵呵

提问者也明显不满意,又反复提问了好几次。


前一个设计计算器的题目,提问者提供了部分程序和电路,要求如下:


老师要求只要3个数码管,完成10以内加减。

第一个数码管表示第1个数字,

第二个数码管表示符号(+或-,用A-F任意表示),

第三个数码管表示第2个数字。

按下等号(等号也用A-F任意表示)三个数码管熄灯,第一个数码管显示答案。


因为提问者给出的资料较多,要求也非常简明,故此做而论道针对这个题目,给出了一个答案。

(另外一个题目,就不回答了。)


做而论道设计的计算器电路,和提问者给定的,稍有不同。


仿真运行后的画面如下:

图片:http://xiangce.baidu.com/picture/detail/3e030be4be33ec2bebcd56569dee061f50d6848d

题目:http://zhidao.baidu.com/question/2075214728949956868.html


这是在输入了 1+8 时的截图,其中的+,数码管显示不出来,只好用【-1】冒充了一下。



做而论道的设计,有几个特点:


1.具有光标显示功能。


在等待用户按键时,光标会在指定的位置上闪动。

当输入一个数字后,光标自动向右移动一位,继续闪烁。


2.选用了计算器的标准键盘。


由于自定义的 4×4 键盘不好看,而且电路复杂,不如用 PROTEUS 带来的标准键盘。

只是这样弄,键盘的编码表就要重新编写了,这也是一般人难以胜任的工作。


3.具有无效键排除功能。


在不同的位置只能输入特定的按键,比如在输入数字时,只能输入0~9,按下其它的按键,

本系统不予理会。

同样,在需要输入等号=时,按下数字键,本系统也不予理会。


4.可以显示大于两位数的结果。


题目仅仅要求显示一位数字的结果。而本系统最大可以显示 18,即 9 + 9 的结果。


5.可以显示负数。


题目对此没有要求。本系统则可以显示负号和绝对值,比如,输入 4 - 9 =,

本系统就能显示出来:-5。


6.可以循环工作。


题目对此也没有要求。本系统则在显示结果之后,再按下 ON/C,即可清除显示屏,重新开始工作。


还有一些有特色的地方,就不多说了,请大家自己发掘。


全部程序如下:


//一位数的加减计算器


#include


//------------------------------------

char led_mod[] = {

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71,0x46,0x40};

//------------------------------------

char key_buf[] = {

0xd7,0xeb,0xdb,0xbb,0xed,0xdd,0xbd,0xee,

0xde,0xbe,0xe7,0xb7,0x77,0x7b,0x7d,0x7e};

//------------------------------------

void delay(char i)

{

unsigned char j, k;

for(j = i; j > 0; j--) for(k = 125; k > 0; k--);

}

//------------------------------------

char getKey(void)

{

char key_scan[] = {0xef, 0xdf, 0xbf, 0x7f};

char i, j;

for(i = 0; i < 4; i++){

P2 = key_scan[i];

if((P2 & 0x0f) != 0x0f)

for(j = 0; j < 16; j++)

if(key_buf[j] == P2)

return j;

}

return -1;

}

//------------------------------------

//以上,基本上都是提问者给出的资料

//------------------------------------

char FlashKey(char p, char d)

{

unsigned char i, k;

while(1) {

for(i = 100; i > 0; i--) {

delay(10);

k = getKey();

if (k < 16) return k;

}

if (p == 0) P0 = d;

if (p == 1) P1 = d;

if (p == 3) P3 = d;

for(i = 100; i > 0; i--) {

delay(10);

k = getKey();

if (k < 16) return k;

}

if (p == 0) P0 = 255;

if (p == 1) P1 = 255;

if (p == 3) P3 = 255;

}

}

//------------------------------------

void main(void)

{

char key, aa, ff, bb, cc;

while(1) {

//-------------------------------

key = FlashKey(0, 0xf7);

while (key > 9) key = FlashKey(0, 0xf7);

P0 = ~led_mod[key]; aa = key; //0~9

while (getKey() != -1); //等待释放

//-------------------------------

key = FlashKey(1, 0xf7);

while ((key != 12) && (key != 13)) key = FlashKey(1, 0xf7);

P1 = ~led_mod[key + 4]; ff = key; //加减运算

while (getKey() != -1); //等待释放

//-------------------------------

key = FlashKey(3, 0xf7);

while (key > 9) key = FlashKey(3, 0xf7);

P3 = ~led_mod[key]; bb = key; //0~9

while (getKey() != -1); //等待释放

//-------------------------------

while (getKey() != 11); //等号

if(ff == 12) cc = aa + bb; //进行计算

if(ff == 13) cc = aa - bb;

P0 = 255; P1 = 255; P3 = 255; //清屏

if (cc < 0) {P1 = 0xbf; P3 = ~led_mod[-cc];}

else if (cc > 9) {P1 = ~led_mod[cc / 10]; P3 = ~led_mod[cc % 10];}

else P3 = ~led_mod[cc];

while (getKey() != -1); //等待释放

//-------------------------------

while (getKey() != 10); //ON/C

P0 = 255; P1 = 255; P3 = 255; //清屏

while (getKey() != -1); //等待释放

//-------------------------------

}

}

//------------------------------------



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

8位单片机在嵌入式设计领域已经成为半个多世纪以来的主流选择。尽管嵌入式系统市场日益复杂,8位单片机依然不断发展,积极应对新的挑战和系统需求。如今,Microchip推出的8位PIC®和AVR®单片机系列,配备了先进的独立...

关键字: 单片机 嵌入式 CPU

在嵌入式系统开发中,程序烧录是连接软件设计与硬件实现的关键环节。当前主流的单片机烧录技术已形成ICP(在电路编程)、ISP(在系统编程)、IAP(在应用编程)三大技术体系,分别对应开发调试、量产烧录、远程升级等不同场景。...

关键字: 单片机 ISP ICP IAP 嵌入式系统开发

在嵌入式系统开发中,看门狗(Watchdog Timer, WDT)是保障系统可靠性的核心组件,其初始化时机的选择直接影响系统抗干扰能力和稳定性。本文从硬件架构、软件流程、安全规范三个维度,系统分析看门狗初始化的最佳实践...

关键字: 单片机 看门狗 嵌入式系统

本文中,小编将对单片机予以介绍,如果你想对它的详细情况有所认识,或者想要增进对它的了解程度,不妨请看以下内容哦。

关键字: 单片机 开发板 Keil

随着单片机系统越来越广泛地应用于消费类电子、医疗、工业自动化、智能化仪器仪表、航空航天等各领域,单片机系统面临着电磁干扰(EMI)日益严重的威胁。电磁兼容性(EMC)包含系统的发射和敏感度两方面的问题。

关键字: 单片机 电磁兼容

以下内容中,小编将对单片机的相关内容进行着重介绍和阐述,希望本文能帮您增进对单片机的了解,和小编一起来看看吧。

关键字: 单片机 复位电路

在这篇文章中,小编将为大家带来单片机的相关报道。如果你对本文即将要讲解的内容存在一定兴趣,不妨继续往下阅读哦。

关键字: 单片机 异常复位

今天,小编将在这篇文章中为大家带来单片机的有关报道,通过阅读这篇文章,大家可以对它具备清晰的认识,主要内容如下。

关键字: 单片机 仿真器

单片机将是下述内容的主要介绍对象,通过这篇文章,小编希望大家可以对它的相关情况以及信息有所认识和了解,详细内容如下。

关键字: 单片机 中断 boot

一直以来,单片机都是大家的关注焦点之一。因此针对大家的兴趣点所在,小编将为大家带来单片机的相关介绍,详细内容请看下文。

关键字: 单片机 数字信号 模拟信号
关闭