久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 14407|回復: 15
打印 上一主題 下一主題
收起左側

C51簡單計算器設計思想、Proteus仿真及源代碼

  [復制鏈接]
跳轉到指定樓層
樓主
ID:98923 發表于 2015-12-9 00:36 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式










硬件部分比較簡單,當鍵盤按鍵按下時它的那一行、那一列的端口為低電平。因此,只要掃描行、列端口是否都為低電平就可以確定是哪個鍵被按下。

二、主程序流程圖



程序的主要思想是:將按鍵抽象為字符,然后就是對字符的處理。將操作數分別轉化為字符串存儲,操作符存儲為字符形式。然后調用compute()函數進行計算并返回結果。具體程序及看注釋還有流程圖。


三、程序源代碼

#include <reg51.h>#include <intrins.h>

#include <ctype.h>

#include <stdlib.h>


#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;



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)

;

}

}



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)

;

}

}




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)

;

}

}




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;

uchar ckey, cut1 = 0, cut2 = 0;

uchar operator;

uchar i, bool = 0;


init:


buf(0);

disp();

value = 0;

cut1 = cut2 = 0;

bool = 0;

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

{

operand1 = '\0';

operand2 = '\0';

}


while(1)

{

ckey = keyscan();

if(ckey != '#')

{

if(isdigit(ckey))

{

switch(bool)

{

case 0:

operand1[cut1] = ckey;

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

value1 = atoi(operand1);

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 = val % 10;

val /= 10;

}


for( ; i > 0; i--)

dbuf = 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;

}

}

C51簡單計算器.zip

1.24 MB, 下載次數: 244, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:112618 發表于 2016-4-10 10:08 | 只看該作者
樓主你好,我剛入門,對51引腳不懂,下載你的帖子還是一部分看不懂,你能幫我改下這個嗎?

E1A{TO2{G5LH8BKS$@OG134.png (15.72 KB, 下載次數: 178)

E1A{TO2{G5LH8BKS$@OG134.png
回復

使用道具 舉報

板凳
ID:117574 發表于 2016-5-10 18:33 來自手機 | 只看該作者
Fandy 發表于 2016-4-10 10:08
樓主你好,我剛入門,對51引腳不懂,下載你的帖子還是一部分看不懂,你能幫我改下這個嗎?

你現在回了嗎
回復

使用道具 舉報

地板
ID:114732 發表于 2016-5-14 16:19 | 只看該作者
先謝樓主的分享
回復

使用道具 舉報

5#
ID:145691 發表于 2016-11-2 14:34 | 只看該作者
負數能運算不
回復

使用道具 舉報

6#
ID:146409 發表于 2016-11-6 14:01 | 只看該作者
初學者來參考參考
回復

使用道具 舉報

7#
ID:156892 發表于 2016-12-22 16:07 | 只看該作者
計算按鍵和顯示屏元件名是什么呀
回復

使用道具 舉報

8#
ID:157940 發表于 2016-12-27 08:53 | 只看該作者
謝謝樓主
回復

使用道具 舉報

9#
ID:153199 發表于 2017-1-1 12:22 | 只看該作者
很詳細的資料
回復

使用道具 舉報

10#
ID:171316 發表于 2017-3-16 20:05 | 只看該作者
謝謝樓主
回復

使用道具 舉報

11#
ID:168012 發表于 2017-3-17 08:57 | 只看該作者
厲害,厲害
回復

使用道具 舉報

12#
ID:212212 發表于 2017-6-19 09:26 | 只看該作者
有沒有匯編語言的
回復

使用道具 舉報

13#
ID:242365 發表于 2017-10-24 17:59 | 只看該作者
可以共享一下嗎
回復

使用道具 舉報

14#
ID:336429 發表于 2018-5-24 14:52 | 只看該作者
被認為是不安全的文件不能下載,想要下載下來學習學習的。

捕獲.PNG (6.08 KB, 下載次數: 118)

捕獲.PNG
回復

使用道具 舉報

15#
ID:794325 發表于 2020-7-1 15:35 | 只看該作者
樓主你好,用了你的代碼,有一些問題,不知道如何修改,想詢問一下您,不知道如何上傳圖片。。。
  1. operand1 = '\0';
復制代碼
這里出現錯誤
error C213: left side of asn-op not an lvalue,是下面這部分代碼中的
  1. init:

  2. buf(0);
  3. disp();
  4. value = 0;
  5. cut1 = cut2 = 0;
  6. bool = 0;
  7. for(i = 0;i < 9;i++)
  8. {
  9. operand1 = '\0';
  10. operand2 = '\0';
  11. }
復制代碼
回復

使用道具 舉報

16#
ID:794325 發表于 2020-7-1 17:00 | 只看該作者
上面那個我加了個[i]就可以了,但是運行的時候為什么數碼管不顯示數字啊
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产真实精品久久二三区 | 激情毛片| 99久久婷婷| 伊人久久伊人 | 在线观看免费高清av | 午夜视频大全 | 精品国产久| 久久久精品网站 | 91亚洲精品久久久电影 | 国产精品视频一区二区三区 | 福利片在线观看 | 亚洲免费久久久 | 96国产精品久久久久aⅴ四区 | 日韩欧美视频 | 成人免费视频观看视频 | 99亚洲综合 | www.日韩 | 天天碰夜夜操 | 玖玖操 | 久久97精品 | 伊色综合久久之综合久久 | 中文字幕免费视频 | 国产高清一区二区 | 一区二区三区亚洲 | 91成人在线视频 | 欧美美女爱爱 | 夜久久 | 亚洲综合天堂网 | 中文字幕精品视频 | 91爱爱·com | 久久久久久久国产精品视频 | 精品视频99 | 久久精品国产一区二区电影 | 美女福利网站 | 免费久久网站 | 中文字幕精品一区二区三区精品 | 国产精品自拍啪啪 | 亚洲精品91 | www狠狠爱com | 伦理午夜电影免费观看 | 免费h视频 |