找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機(jī)計(jì)算器源程序 矩陣鍵盤 數(shù)碼管和lcd1602顯示

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主



下面是1602顯示的版本:


利用矩陣鍵盤和lcd1602顯示:
  1. #include<reg51.h>   //頭文件
  2. typedef unsigned char uchar;
  3. typedef unsigned int  uint;
  4. sbit RW=P3^5;
  5. sbit RS=P3^6;
  6. sbit E=P3^4;        
  7. long x=0,y=0,num=0;
  8. uint aa,bb=0;
  9. uchar key;
  10. uchar code tab1[5]="ERROR";
  11. uchar code tab2[8]="OVERFLOW";
  12. //LCD1602液晶檢查忙碌子函數(shù)
  13. void LCD1602_busy()
  14. {
  15.         char i,x=0x80;
  16.         P0=0xff;
  17.         while(x&0x80)
  18.         {
  19.                 RS=0;
  20.                 RW=1;
  21.                 E=1;
  22.                 x=P0;
  23.                 E=0;
  24.                 for(i=0;i<10;i++);
  25.         }
  26.         E=0;
  27. }
  28. //LCD1602液晶寫命令子函數(shù)
  29. void write_com(uchar com)
  30. {               
  31.         RS=0;
  32.         RW=0;                        
  33.         E=1;
  34.         P0=com;
  35.         E=0;
  36.         LCD1602_busy();
  37. }
  38. //LCD1602液晶寫數(shù)據(jù)子函數(shù)
  39. void write_date(uchar date)
  40. {
  41.         RS=1;
  42.         RW=0;                        
  43.         E=1;
  44.         P0=date;
  45.         E=0;
  46.         LCD1602_busy();
  47. }
  48. //LCD1602液晶初始化子函數(shù)
  49. void LCD1602_init()
  50. {
  51.         write_com(0x30);
  52.         write_com(0x30);
  53.         write_com(0x30);
  54.         write_com(0x38);
  55.         write_com(0x08);
  56.         write_com(0x01);
  57.         write_com(0x06);
  58.         write_com(0x0e);
  59. }
  60. //LCD1602液晶清屏子函數(shù)
  61. void LCD1602_clear()
  62. {
  63.         write_com(0x01);
  64. }
  65. //除數(shù)為處理子函數(shù)
  66. void sfj1()
  67. {
  68.         int i=0;
  69.         LCD1602_clear();
  70.         for(i=0;i<5;i++)
  71.                 write_date(tab1[i]);
  72. }
  73. //數(shù)值溢出處理子函數(shù)
  74. void sfj2()
  75. {
  76.         int i=0;
  77.         LCD1602_clear();
  78.         for(i=0;i<8;i++)
  79.                 write_date(tab2[i]);
  80. }
  81. //鍵值轉(zhuǎn)化為鍵盤上按鍵值子函數(shù)
  82. char sfj3(int keycode)
  83. {
  84.         switch(keycode)
  85.         {
  86.                 case 0:
  87.                                 return '7';
  88.                                 break;
  89.                 case 1:
  90.                                 return '4';
  91.                                 break;
  92.                 case 2:
  93.                                 return '1';
  94.                                 break;
  95.                 case 3:
  96.                                 return 'c';
  97.                                 break;
  98.                 case 4:
  99.                                 return '8';
  100.                                 break;
  101.                 case 5:
  102.                                 return '5';
  103.                                 break;
  104.                 case 6:
  105.                                 return '2';
  106.                                 break;
  107.                 case 7:
  108.                                 return '0';
  109.                                 break;
  110.                 case 8:
  111.                                 return '9';
  112.                                 break;
  113.                 case 9:
  114.                                 return '6';
  115.                                 break;
  116.                 case 10:
  117.                                 return '3';
  118.                                 break;
  119.                 case 11:
  120.                                 return '=';
  121.                                 break;
  122.                 case 12:
  123.                                 return '/';
  124.                                 break;
  125.                 case 13:
  126.                                 return '*';
  127.                                 break;
  128.                 case 14:
  129.                                 return '-';
  130.                                 break;
  131.                 case 15:
  132.                                 return '+';
  133.                                 break;
  134.         }      
  135. }
  136. //LCD1602液晶顯示子函數(shù)
  137. void display(long a)
  138. {
  139.         long temp,b,c=-1;
  140.         int lenth=1,i,j;
  141.         LCD1602_clear();
  142.         if(a<0)
  143.         {
  144.                 a=a*c;
  145.                 write_date('-');
  146.         }         
  147.         temp=a;
  148.         while((temp=temp/10)!=0)
  149.         {
  150.                 lenth++;
  151.         }
  152.         for(i=lenth;i>0;i--)
  153.         {
  154.                 b=1;
  155.                 for(j=0;j<i-1;j++)
  156.                 {
  157.                         b=b*10;
  158.                 }
  159.                 write_date(0x30+a/b);
  160.                 a=a%b;
  161.         }
  162. }
  163. //算術(shù)運(yùn)算子函數(shù)
  164. void sfj4()
  165. {
  166.         if(bb)
  167.         {
  168.                 switch(aa)
  169.                 {
  170.                         case 1:
  171.                                         x=x+y;
  172.                                         num=x;
  173.                                         if(num<134217728&&num>-134217728)
  174.                                         {
  175.                                                 display(num);
  176.                                         }
  177.                                         else
  178.                                                 sfj2();
  179.                                         break;
  180.                         case 2:
  181.                                         x=x-y;
  182.                                         num=x;
  183.                                         if(num<134217728&&num>-134217728)
  184.                                         {        
  185.                                                 display(num);
  186.                                         }
  187.                                         else
  188.                                                 sfj2();
  189.                                                 break;
  190.                         case 3:
  191.                                         x=x*y;
  192.                                         num=x;
  193.                                         if(num<134217728&&num>-134217728)
  194.                                         {        
  195.                                                 display(num);
  196.                                         }
  197.                                         else
  198.                                                 sfj2();
  199.                                                 break;
  200.                         case 4:
  201.                                         if(y==0)
  202.                                                 sfj1();
  203.                                         else
  204.                                         {
  205.                                                 x=x/y;
  206.                                                 num=x;
  207.                                                 if(num<134217728&&num>-134217728)
  208.                                                 {        
  209.                                                         display(num);
  210.                                                 }
  211.                                                 else
  212.                                                         sfj2();
  213.                                         }        
  214.                                         break;
  215.                 }
  216.                 y=0;
  217.         }
  218. }
  219. //主函數(shù)
  220. void main()
  221. {
  222.         EA=1;
  223.         EX0=1;
  224.         IT0=1;
  225.         P2=0xff;
  226.         display(0);
  227.         LCD1602_init();
  228.         write_date(0x30);
  229.         while(1)
  230.         {
  231.         }
  232. }
  233. //外部0中斷處理子函數(shù)
  234. void wb0() interrupt 0 using 0
  235. {
  236.         key=sfj3(P2&0x0f);
  237.         if(key<='9'&&key>='0')      //判斷按下的鍵是否為數(shù)值
  238.         {
  239.                 num=num*10+(key-'0');
  240.                 if(aa>0)
  241.                 {
  242.                         y=num;
  243.                         bb=1;
  244.                 }
  245.                 else
  246.                         x=num;
  247.                 if(num<134217728&&num>-134217728)    //當(dāng)前數(shù)值是否超出限定范圍
  248.                 {        
  249.                         display(num);
  250.                 }
  251.                 else
  252.                         sfj2();
  253.         }
  254.         else
  255.         {
  256.                 switch(key)
  257.                 {
  258.                         case 'c':
  259.                                                 x=0;
  260.                                                 y=0;
  261.                                                 num=0;
  262.                                                 bb=0;
  263.                                                 aa=0;
  264.                                                 display(num);
  265.                                                 break;
  266.                         case '=':
  267.                                                 sfj4();
  268.                                                 bb=0;
  269.                                                 aa=0;
  270.                                                 num=0;
  271.                                                 break;
  272.                         case '+':
  273.                                             if(aa)
  274.                                                         sfj4();
  275.                                                 aa=1;
  276.                                                 num=0;
  277.                                                 break;
  278.                         case '-':
  279.                                             if(aa)
  280.                                                         sfj4();
  281.                                                 aa=2;
  282.                                                 num=0;
  283.                                                 break;
  284.                         case '*':
  285.                                             if(aa)
  286.                                                         sfj4();
  287.                                                 aa=3;
  288.                                                 num=0;
  289.                                                 break;
  290.                         case '/':
  291.                                                 if(aa)
  292.                                                         sfj4();
  293.                                                 aa=4;
  294.                                                 num=0;
  295.                                                 break;
  296.                 }
  297.         }
  298. }

復(fù)制代碼


下載:
51單片機(jī)簡易計(jì)算器.rar (50.24 KB, 下載次數(shù): 66)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

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

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:156133 發(fā)表于 2016-12-20 13:21 | 只看該作者
有點(diǎn)難啊
回復(fù)

使用道具 舉報(bào)

板凳
ID:156133 發(fā)表于 2016-12-20 13:56 | 只看該作者
樓主在不?求教。QQ278959526
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表