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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 14595|回復: 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引腳不懂,下載你的帖子還是一部分看不懂,你能幫我改下這個嗎?

你現在回了嗎
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

8#
無效樓層,該帖已經被刪除
9#
ID:156892 發表于 2016-12-22 16:07 | 只看該作者
計算按鍵和顯示屏元件名是什么呀
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

14#
無效樓層,該帖已經被刪除
15#
ID:212212 發表于 2017-6-19 09:26 | 只看該作者
有沒有匯編語言的
回復

使用道具 舉報

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

使用道具 舉報

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

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

捕獲.PNG
回復

使用道具 舉報

18#
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. }
復制代碼
回復

使用道具 舉報

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

使用道具 舉報

20#
無效樓層,該帖已經被刪除
21#
無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕精品一区久久久久 | 日韩电影中文字幕在线观看 | 国产一区 | 色网在线观看 | 97国产在线观看 | 亚洲精品一区二区三区免 | 天天干天天爱天天爽 | 亚洲成av人片在线观看无码 | 免费在线观看av网站 | 日韩一二区 | 青娱乐自拍 | 国产一区二区在线免费观看 | 亚洲一区二区三区在线播放 | 日韩中文一区二区三区 | 天天综合久久网 | 亚洲精品日本 | 国产中的精品av涩差av | 国产精品久久久久久妇女 | 精品久久久久久亚洲综合网 | av在线一区二区三区 | 色播久久 | 久久手机在线视频 | 欧美国产日韩一区 | 久久r久久| 一级做受毛片免费大片 | 亚洲免费视频在线观看 | 免费观看一区二区三区毛片 | 久久精品黄色 | 国产精品色 | 91国在线高清视频 | 999精品在线| 玖玖玖在线观看 | 狠狠干美女| 国产91久久久久蜜臀青青天草二 | 黄色片av| 亚洲91视频 | 精品欧美激情精品一区 | 久久91| 欧美精品一区二区三区在线播放 | 蜜桃视频在线观看免费视频网站www | 亚洲理论在线观看电影 |