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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 13718|回復(fù): 30
打印 上一主題 下一主題
收起左側(cè)

基于c51的簡(jiǎn)易計(jì)算器的制作(含c語(yǔ)言代碼與Proteus原理圖)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
基于4*4矩陣,89c51,lcd1602顯示器
附件中內(nèi)容如下:原理圖,hex文件,.c文件(源碼),仿真程序
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

代碼如下:
  1. #include <reg51.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <math.h>
  6. #define uint unsigned int
  7. #define uchar unsigned char
  8. sbit pinRS=P2^0;
  9. sbit pinRW=P2^1;
  10. sbit pinE=P2^2;
  11. #define pindata P0
  12. #define clearscreen() writeinstruc(0x01)
  13. #define cursorreturn() writeinstruc(0x02)
  14. #define inputmode(temp) writeinstruc(temp)
  15. //temp取值如下:
  16. //0x04:減量方式,不移位
  17. //0x05:減量方式,移位
  18. //0x06:增量方式,不移位
  19. //0x07:增量方式,移位
  20. #define dispcontrol(temp) writeinstruc(temp)
  21. //temp取值如下:
  22. //0x08:顯示關(guān),光標(biāo)關(guān),閃爍關(guān)
  23. //0x0c:顯示關(guān),光標(biāo)關(guān),閃爍關(guān)
  24. //0x0d:顯示開(kāi),光標(biāo)關(guān),閃爍開(kāi)
  25. //0x0e:顯示開(kāi),光標(biāo)開(kāi),閃爍關(guān)
  26. //0x0f:顯示開(kāi),光標(biāo)開(kāi),閃爍開(kāi)
  27. #define dispshift(temp) writeinstruc(temp)
  28. //temp取值如下:
  29. //0x10:光標(biāo)左移
  30. //0x14:光標(biāo)右移
  31. //0x18:顯示整體左移
  32. //0x1c:顯示整體右移
  33. #define functionset(temp) writeinstruc(temp)
  34. //temp取值如下:
  35. //0x20:4位,1行,5*7
  36. //0x24:4位,1行,5*10
  37. //0x28:4位,2行,5*7
  38. //0x2c:4位,2行,5*10
  39. //0x30:8位,1行,5*7
  40. //0x34:8位,1行,5*10
  41. //0x38:8位,2行,5*7
  42. //0x3c:8位,2行,5*10
  43. #define setCGRAM_Add(address) writeinstruc(0x40|address)
  44. #define setDDRAM_Add(address) writeinstruc(0x80|address)//短延時(shí)
  45. //void shortdelay(uchar i);
  46. //長(zhǎng)延時(shí)
  47. //void longdelay(uint i);
  48. //P2口初始化
  49. //void initP2(bit i);
  50. //寄存器選擇信號(hào)
  51. //void setRS(bit i);
  52. //讀寫(xiě)操作控制
  53. //void setRW(bit i);
  54. //使能信號(hào)
  55. //void setE(bit i);
  56. //讀BF以及AC的值
  57. //uint read_BF_AC();
  58. //判忙
  59. //bit statuscheck();
  60. //寫(xiě)指令函數(shù)
  61. //void writeinstruc(uint instruc);
  62. //寫(xiě)數(shù)據(jù)到RAM
  63. //void writedata(uint data1);
  64. //從RAM中讀數(shù)據(jù)函數(shù)
  65. //uint readdata(void);
  66. //顯示程序 X為行號(hào),Y為列號(hào),date為要顯示的數(shù)據(jù)
  67. //void dispcharacter(int x,uint y,uint data1);
  68. //LCD復(fù)位函數(shù)
  69. //void LCDreset();
  70. #define uchar unsigned char
  71. uchar k=0,result1;
  72. void shortdelay(uchar i)//短延時(shí)
  73. {
  74. for(;i>0;i--);
  75. }
  76. //長(zhǎng)延時(shí)
  77. void longdelay(uint i)
  78. {
  79. uint j;
  80. for(;i>0;i--)
  81. {for(j=100;j>0;j--);}
  82. }
  83. //延時(shí)程序
  84. void delay(int i)
  85. {int j;
  86. for(;i>0;i--)
  87.    for(j=0;j<100;j++);
  88. }
  89. //初試狀態(tài)
  90. void io_init()
  91. {P1=0xff;
  92. }
  93. //?---------------------------鍵盤(pán)掃描部分-----------------------------//
  94. unsigned char key_scan()
  95. { unsigned char key;
  96.   unsigned char temp;
  97.   uint flag;
  98.   io_init();
  99.    P1=0xf0;
  100.    flag=0;
  101. loop: temp=P1^0xf0;
  102.    while(temp)
  103.     {
  104.      P1=0xfe;
  105.      delay(1);
  106.      if((P1&0xfe)!=0xfe)
  107.      switch(P1)
  108.      {
  109.      case 0xee: key=0x11;flag=1;break;//讀7鍵和值
  110.      case 0xde: key=0x12;flag=1;break;
  111.      case 0xbe: key=0x13;flag=1;break;
  112.      case 0x7e: key=0x14;flag=1;break;//讀除鍵的值
  113.      }
  114.   if(flag)
  115.   goto exit;
  116.   else
  117.      P1=0xfd;
  118.      delay(1);
  119.      if((P1&0xfd)!=0xfd)
  120.      switch(P1)
  121.      {
  122.      case 0xed: key=0x21;flag=1;break;
  123.      case 0xdd: key=0x22;flag=1;break;
  124.      case 0xbd: key=0x23;flag=1;break;
  125.      case 0x7d: key=0x24;flag=1;break; //讀4到乘的鍵值
  126.      }
  127.      if(flag)
  128.   goto exit;
  129.   else
  130.      P1=0xfb;
  131.      delay(1);
  132.      if((P1&0xfb)!=0xfb)
  133.      switch(P1)
  134.      {
  135.      case 0xeb: key=0x31;flag=1;break;
  136.      case 0xdb: key=0x32;flag=1;break;
  137.      case 0xbb: key=0x33;flag=1;break;
  138.      case 0x7b: key=0x34;flag=1;break;//讀1到減的鍵值
  139.      }
  140.      if(flag)
  141.   goto exit;
  142.   else
  143.   P1=0xf7;
  144.      delay(1);
  145.      if((P1&0xf7)!=0xf7)
  146.      switch(P1)
  147.      {
  148.      case 0xe7: key=0x41;flag=1;break;//后退
  149.      case 0xd7: key=0x42;flag=1;break;//0
  150.      case 0xb7: key=0x43;flag=1;break;//等于
  151.      case 0x77: key=0x44;flag=1;break;//加
  152.      }
  153.      
  154. exit: return key;
  155.    }
  156.   if(temp==0)
  157.   goto loop;
  158.   }
  159. //---------------------------------鍵盤(pán)掃描完--------------------------------------------//
  160. //---------------------------------顯示初始化?----------------------------------------//
  161. //P0口初始化
  162. void initpindata(bit i)
  163. {
  164. if(i==1) pindata=0xff;
  165. else pindata=0X00;
  166. }
  167. //寄存器選擇信號(hào)
  168. void setRS(bit i)
  169. {
  170. if(i==1) pinRS=1;
  171. else pinRS=0;
  172. }
  173. //讀寫(xiě)操作控制
  174. void setRW(bit i)
  175. {
  176. if(i==1) pinRW=1;
  177. else pinRW=0;
  178. }
  179. //使能信號(hào)
  180. void setE(bit i)
  181. {
  182. if(i==1) pinE=1;
  183. else pinE=0;
  184. }
  185. //讀BF以及AC的值
  186. uint read_BF_AC()
  187. {
  188. uint temp;
  189. initpindata(1);
  190. setRS(0);
  191. setRW(1);
  192. setE(1);
  193. shortdelay(1);
  194. temp=pindata;
  195. shortdelay(10);
  196. setE(0);
  197. return(temp);
  198. }
  199. //判忙
  200. bit statuscheck()
  201. {
  202. return((bit)(read_BF_AC()&0x80));
  203. }
  204. //寫(xiě)指令函數(shù)
  205. void writeinstruc(uint instruc)
  206. {
  207. while(statuscheck());
  208. initpindata(0);
  209. setRS(0);
  210. setRW(0);
  211. setE(0);
  212. pindata=instruc;
  213. //short delay(1);
  214. setE(1);
  215. shortdelay(10);
  216. setE(0);
  217. }
  218. //寫(xiě)數(shù)據(jù)到RAM
  219. void writedata(uint data1)
  220. {
  221. initpindata(0);
  222. setRS(1);
  223. setRW(0);
  224. setE(0);
  225. pindata=data1;
  226. setE(1);
  227. shortdelay(10);
  228. setE(0);
  229. }
  230. //從RAM中讀數(shù)據(jù)函數(shù)
  231. uint readdata(void)
  232. {
  233. uint temp;
  234. initpindata(1);
  235. setRS(1);
  236. setRW(1);
  237. setE(1);
  238. shortdelay(1);
  239. temp=pindata;
  240. shortdelay(10);
  241. setE(0);
  242. return(temp);
  243. }
  244. //顯示程序 X為行號(hào),Y為列號(hào),date為要顯示的數(shù)據(jù)
  245. void dispcharacter(int x,uint y,uint data1)
  246. {
  247. uint temp;
  248. while(statuscheck());
  249. temp=y&0x0f;
  250. x&=0x01;
  251. if(x) temp|=0x40;
  252. setDDRAM_Add(temp);
  253. writedata(data1);
  254. // writedata(data1);
  255. }
  256. //LCD復(fù)位函數(shù)
  257. void LCDreset()
  258. {
  259. clearscreen();
  260. cursorreturn();
  261. }
  262. //LCD初始化
  263. void initLCD()
  264. {
  265. LCDreset();
  266. inputmode(0x06);//增量方式,不移位
  267. dispcontrol(0x0c);//顯示開(kāi),光標(biāo)關(guān),閃爍關(guān)
  268. functionset(0x38);//8位,2行,5*7
  269. }
  270. //-----------------------------------準(zhǔn)備工作完成-----------------------------------//
  271. //-----------------------------------計(jì)算器-----------------------------------------//
  272.   compute(char key1,i)
  273. {
  274. signed char m,n,c,act;
  275. long int num1,num2,result;
  276. signed char str[4][4]={{'7','8','9','/'},
  277.                 {'4','5','6','*'},
  278.                 {'1','2','3','-'},
  279.                 {'c','0','=','+'}};
  280. signed char str1[11],string1[2];
  281. m=(key1&0xf0);
  282. m=m/16;
  283. m=m-1;
  284. n=key1&0x0f;
  285. n=n-1;
  286. c=str[m][n];
  287. sprintf(string1,"%c",c);
  288. strcat(str1,string1);
  289. if((c=='+')||(c=='-')||(c=='*')||(c=='/'))
  290. {
  291. act=c;
  292. num1=atoi(str1);
  293. memset(str1,0,11);
  294. memset(string1,0,2);
  295. }
  296. if(c=='=')
  297. {
  298. num2=atoi(str1);
  299. switch(act)
  300. {
  301. case'+':
  302. { if(k==0)
  303.     {result=num1+num2;k++;break;}
  304.    else
  305.    {result+=num2;k++;break;}
  306.    }
  307. case'-':
  308.   {if(k==0)
  309.    {result=num1-num2;k++;break;}
  310.    else
  311.    {result-=num2;k++;break;}
  312.    }
  313. case'*':
  314. {if(k==0)
  315.    {result=num1*num2;k++;break;}
  316.    else
  317.    {result*=num2;k++;break;}
  318.    }
  319. case'/':
  320. {if(k==0)
  321.    {result=num1/num2;k++;break;}
  322.    else
  323.   { result/=num2;k++;break;}
  324.    }
  325. }
  326. }
  327. if(c=='c')
  328. {
  329. act=0;
  330. num1=str1[0];
  331. num1=str1[8];
  332. memset(str1,0,11);
  333. memset(string1,0,2);
  334. num1=str1[0];
  335. num1=str1[8];
  336. k=0;
  337. }
  338. longdelay(350);
  339. switch(key1)  //顯示部分
  340. {case 0x11:   dispcharacter(0,i,'7');i++;break;
  341. case 0x12:    dispcharacter(0,i,'8');i++; break;
  342. case 0x13:    dispcharacter(0,i,'9');i++; break;
  343. case 0x14:    dispcharacter(0,i,'/');i++;break;
  344. case 0x21:    dispcharacter(0,i,'4');i++;break;
  345. case 0x22:    dispcharacter(0,i,'5');i++;break;
  346. case 0x23:    dispcharacter(0,i,'6');i++;break;
  347. case 0x24:    dispcharacter(0,i,'*');i++;break;
  348. case 0x31:    dispcharacter(0,i,'1');i++;break;
  349. case 0x32:    dispcharacter(0,i,'2');i++;break;
  350. case 0x33:    dispcharacter(0,i,'3');i++;break;
  351. case 0x34:    dispcharacter(0,i,'-');i++;break;
  352. case 0x41:    clearscreen();             break;
  353. case 0x42:    dispcharacter(0,i,'0');i++;break;
  354. case 0x43:    dispcharacter(0,i,'=');i++;
  355.                m=result/10000;
  356.                result1=result%10000;
  357.                if(m!=0||result==0)
  358.                {
  359.                n=0;
  360.       m=m+'0';
  361.                dispcharacter(0,i,m);i++;
  362.                }
  363.                m=result1/1000;
  364.                result1=result1%1000;
  365.                if(m!=0||n==0)
  366.         {
  367.                m=m+'0';
  368.       n=0;
  369.                dispcharacter(0,i,m);i++;
  370.       }
  371.                m=result1/100;
  372.                result1=result1%100;
  373.                if(m!=0||n==0)
  374.       {
  375.                m=m+'0';
  376.       n=0;
  377.             dispcharacter(0,i,m);i++;
  378.       }
  379.                m=result1/10;
  380.                result1=result1%10;
  381.                if(m!=0||n==0)
  382.       {
  383.                m=m+'0';
  384.       n=0;
  385.                dispcharacter(0,i,m);i++;
  386.       }
  387.                m=result1;
  388.                if(m!=0||n==0)
  389.                m=m+'0';
  390.                dispcharacter(0,i,m);i++;break;
  391. case 0x44:    dispcharacter(0,i,'+');i++;break;
  392. }
  393. return(i);
  394. }
  395. //---------------------------------------------------------------------------------//
  396. //-------------------------------------主函數(shù)---------------------------------------//
  397. void main()
  398. {
  399. char key1,i;
  400. start:initpindata(0);
  401. P2=0X00;
  402. initLCD();
  403. i=0;
  404. scan:key1=key_scan();
  405. i=compute(key1,i);
  406. if(key1==0x41)
  407. goto start;
  408. else
  409. goto scan;
  410. }
復(fù)制代碼


全部資料51hei下載地址:
簡(jiǎn)易計(jì)算器.zip (207.35 KB, 下載次數(shù): 278)


評(píng)分

參與人數(shù) 2黑幣 +55 收起 理由
51單片機(jī)1234 + 5
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏13 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:350833 發(fā)表于 2018-6-14 16:22 | 只看該作者
歡迎各位參觀學(xué)習(xí)!!!
回復(fù)

使用道具 舉報(bào)

板凳
ID:354047 發(fā)表于 2018-6-19 10:08 | 只看該作者
樓主 這個(gè)程序能在15系列上實(shí)現(xiàn)嗎
回復(fù)

使用道具 舉報(bào)

地板
ID:362129 發(fā)表于 2018-6-30 09:39 | 只看該作者
學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

5#
ID:362129 發(fā)表于 2018-6-30 10:37 | 只看該作者
這個(gè)可以用嗎
回復(fù)

使用道具 舉報(bào)

6#
ID:362129 發(fā)表于 2018-6-30 10:39 | 只看該作者
這個(gè)里面是直接有proteus的仿真文件是嗎 ?就直接可以運(yùn)行?
回復(fù)

使用道具 舉報(bào)

7#
ID:362129 發(fā)表于 2018-6-30 10:41 | 只看該作者
看到的話可以加qq聯(lián)系一下嗎?1347634544
回復(fù)

使用道具 舉報(bào)

8#
ID:392176 發(fā)表于 2018-8-31 23:38 | 只看該作者
參觀學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

9#
ID:393375 發(fā)表于 2018-9-7 15:29 來(lái)自手機(jī) | 只看該作者
小白一個(gè),學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

10#
ID:393375 發(fā)表于 2018-9-12 09:35 來(lái)自手機(jī) | 只看該作者
請(qǐng)問(wèn)這個(gè)程序能在單片機(jī)開(kāi)發(fā)板上實(shí)現(xiàn)功能嘛
回復(fù)

使用道具 舉報(bào)

11#
ID:396896 發(fā)表于 2018-9-12 11:04 | 只看該作者
學(xué)習(xí)了,謝謝
回復(fù)

使用道具 舉報(bào)

12#
ID:396896 發(fā)表于 2018-9-12 11:29 | 只看該作者
謝謝,我要好好學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

13#
ID:308173 發(fā)表于 2018-9-12 12:14 | 只看該作者
為什么KEIL打不開(kāi)呢
回復(fù)

使用道具 舉報(bào)

14#
ID:399809 發(fā)表于 2018-9-19 08:56 | 只看該作者
不錯(cuò),感謝樓主分享
回復(fù)

使用道具 舉報(bào)

15#
ID:338810 發(fā)表于 2018-9-27 16:28 | 只看該作者

樓主 這個(gè)程序能在15系列上實(shí)現(xiàn)嗎
回復(fù)

使用道具 舉報(bào)

16#
ID:92810 發(fā)表于 2018-10-9 23:08 | 只看該作者
感覺(jué)挺不錯(cuò)的樣子,可以下載學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

17#
ID:229361 發(fā)表于 2018-10-10 00:54 | 只看該作者

請(qǐng)問(wèn)這個(gè)程序能在單片機(jī)開(kāi)發(fā)板上實(shí)現(xiàn)功能嘛
回復(fù)

使用道具 舉報(bào)

18#
ID:403554 發(fā)表于 2018-10-10 09:36 | 只看該作者
如何把它改為4*6的鍵盤(pán)呢
回復(fù)

使用道具 舉報(bào)

19#
ID:116400 發(fā)表于 2018-12-23 15:22 | 只看該作者
你這個(gè)程序是不可以的,有些簡(jiǎn)單的數(shù)值是算不出來(lái)的,總是出錯(cuò)你看看看,用你的程序用你的仿真源文件計(jì)算的結(jié)果
回復(fù)

使用道具 舉報(bào)

20#
ID:450444 發(fā)表于 2018-12-25 12:48 | 只看該作者
WANGCHONG 發(fā)表于 2018-12-23 15:22
你這個(gè)程序是不可以的,有些簡(jiǎn)單的數(shù)值是算不出來(lái)的,總是出錯(cuò)你看看看,用你的程序用你的仿真源文件計(jì)算的 ...

你說(shuō)的都對(duì)
回復(fù)

使用道具 舉報(bào)

21#
ID:462368 發(fā)表于 2019-1-5 11:54 | 只看該作者
good
回復(fù)

使用道具 舉報(bào)

22#
ID:558095 發(fā)表于 2019-6-9 16:59 | 只看該作者


樓主 這個(gè)程序能在C52單片機(jī)上實(shí)現(xiàn)嗎
回復(fù)

使用道具 舉報(bào)

23#
ID:558629 發(fā)表于 2019-6-10 08:46 | 只看該作者
真好真好真好
回復(fù)

使用道具 舉報(bào)

24#
ID:496206 發(fā)表于 2019-6-12 09:48 | 只看該作者
keil根本打不開(kāi)
回復(fù)

使用道具 舉報(bào)

25#
ID:577482 發(fā)表于 2019-7-3 22:35 | 只看該作者
學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

26#
ID:654919 發(fā)表于 2019-12-3 10:33 | 只看該作者
厲害了
回復(fù)

使用道具 舉報(bào)

27#
ID:665084 發(fā)表于 2019-12-16 21:17 | 只看該作者
哇,學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

28#
ID:655938 發(fā)表于 2019-12-31 20:27 | 只看該作者
參觀學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

29#
ID:730070 發(fā)表于 2020-5-10 01:50 來(lái)自手機(jī) | 只看該作者
51單片機(jī)也能實(shí)現(xiàn)大部分功能,ARM雖然高效,很多用51和PIC單片機(jī)也夠了
回復(fù)

使用道具 舉報(bào)

30#
ID:753881 發(fā)表于 2020-5-17 11:30 | 只看該作者
很好用很方便
回復(fù)

使用道具 舉報(bào)

31#
ID:631764 發(fā)表于 2020-5-17 12:24 | 只看該作者
參觀學(xué)習(xí),感謝樓主
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美一级欧美一级在线播放 | 18gay男同69亚洲网站 | 自拍偷拍中文字幕 | 国产成人精品视频 | 91成人午夜性a一级毛片 | 91精品国产自产精品男人的天堂 | 亚洲一区亚洲二区 | 视频一区二区在线观看 | 日日日色| 国产精品一区一区三区 | 久久久久久久久久久久久久国产 | 欧美成人综合 | 亚洲色图综合 | 少妇无套高潮一二三区 | 国产精品91视频 | 免费久久视频 | 精品一区在线免费观看 | 日本 欧美 三级 高清 视频 | 久久av综合 | 成人网在线看 | 国产精久久久久久 | 亚洲欧美在线免费观看 | 成年男女免费视频网站 | 亚洲成人av| 国产欧美精品一区二区 | 欧美日韩免费视频 | 九九伊人sl水蜜桃色推荐 | 欧美成视频| 超碰人人在线 | 久久精品国产一区二区电影 | 91久久国产综合久久 | 最新国产精品精品视频 | 欧美一区二区视频 | 日韩高清成人 | 日本一本在线 | 亚洲欧美一区二区三区在线 | 国产精品国产 | 久久男女视频 | 亚洲精久 | 久久伊人精品一区二区三区 | 欧美一级免费看 |