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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機仿真不了,應該不會是我接線有問題吧?

[復制鏈接]
跳轉到指定樓層
樓主


  1. 主程序:
  2. #include <reg51.h>
  3. #include "lcd.h"
  4. #include "string.h"
  5. #include "math.h"
  6. #include "stdio.h"
  7.                         
  8. typedef unsigned char uint8;         //宏定義 :用uint8 重定義unsigned char 無符號char型
  9. typedef unsigned int uint16;


  10. uint8 Disp[]="1.calculate";
  11. uint8 fuhao;//定義具體的那個符號,是加減還是乘除。
  12. uint8 flag;        //定義有沒有按下符號鍵,這個是統稱
  13. long a,b,c,d;        //定義運算數據的第一個和第二個及等于的數變量
  14. double a_l,b_l;         //double類型存結果可正負帶小數點
  15. uint8 k,a_wei,b_wei; //定義小數點后面顯示的位數
  16. uint8 zh,xiao,key,num,num_d,i,j;
  17. uint16 biao,fhao_a,fhao_b;


  18. uint8 key_lie[] = {0xef,0xdf,0xbf,0x7f};                                           //列低電平組
  19. uint8 key_wei[] = {0xe7,0xd7,0xb7,0x77,                                           //位低電平組
  20.                                                                         0xeb,0xdb,0xbb,0x7b,
  21.                                                                         0xed,0xdd,0xbd,0x7d,
  22.                                                                         0xee,0xde,0xbe,0x7e};


  23. uint8 dat1[]={1,2,3,0x2b-0x30, 4,5,6,0x2d-0x30, 7,8,9,0x2a-0x30, 0,0x01-0x30,0x3d-0x30,0x2b-0x30 };//計算 123+  456-  789* 0R=/
  24. uint8 dat2[]={0,1,2,3,   4,5,6,7,   8,9,0x41-0x30,0x42-0x30,   0x43-0x30,0x44-0x30,0x45-0x30,0x46-0x30};// 進制轉換0123 4567 89ab cdef


  25. void delay(uint16 i)          //延時函數
  26. {
  27.         while(i--);
  28. }
  29. void lcdwrc(uint8 c)         //lcd指令函數
  30. {
  31.         LcdWriteCom(c);
  32. }
  33. void lcdwrd(uint8 dat)         //lcd顯示函數
  34. {
  35.         LcdWriteData(dat);
  36. }




  37. void lcdwrd_string(uint8 dat[],uint n)          //lcd顯示字符串
  38. {               
  39.         uint8 i;
  40.         for(i=0;i<n;i++)
  41.         {
  42.                 lcdwrd(dat[i]);        [/i][i]
  43.         }
  44. }


  45. void num_zero()                   //數據歸零
  46. {
  47.         key=0;
  48.         num=0;
  49.         flag=0;
  50.         fuhao=0;
  51.         a=0;
  52.         b=0;
  53.         c=0;
  54.         d=0;
  55.         biao=0;
  56.         zh = 0;
  57.         xiao = 0;
  58.         a_wei = 0;
  59.         b_wei = 0;
  60.         fhao_a = 0;
  61.         fhao_b = 0;
  62. }


  63. void keyscan()                  //鍵盤取值和運算
  64. {
  65.         
  66.         if(P3 == 0xf7&&xiao == 0)                  //小數點11110111
  67.         {        
  68.                 delay(1000);   //消除抖動 一般大約10ms
  69.                 if(P3 == 0xf7)         //再次判斷按鍵是否按下
  70.                 {
  71.                         xiao = 1;          //小數點標志
  72.                 }
  73.                 while(P3 == 0xf7);         //檢測按鍵是否松開
  74.                 lcdwrd(0x2e);          //顯示小數點
  75.         }
  76.         
  77.         if(P3 == 0xfb)                  //負號11111011
  78.         {        
  79.                 delay(1000);   //消除抖動 一般大約10ms
  80.                 if(P3 == 0xfb)         //再次判斷按鍵是否按下
  81.                 {
  82.                         if (flag==0)fhao_a++;          //運算符號之前的負號
  83.                         else fhao_b++;                          //運算符號之后的負號
  84.                 }
  85.                 while(P3 == 0xfb);         //檢測按鍵是否松開
  86.                 lcdwrd(0x2d);        
  87.         }




  88.         P1=0xfe;   //令第一行為0,然后判斷是哪一列按下11111110,低位第一行
  89.         if(P1!=0xfe)
  90.         {
  91.                 delay(1000);
  92.                 if(P1!=0xfe)
  93.                 {
  94.                         key=P1&0xf0;  // 將按下的鍵的電平給key  比如1110 1111 于 1111 0000 結果為1110 0000
  95.                         switch(key)
  96.                         {
  97.                                 case 0xe0: num=0;break;          //1
  98.                                 case 0xd0: num=1;break;          //2
  99.                                 case 0xb0: num=2;break;          //3
  100.                                 case 0x70: num=3;break;          //加
  101.                         }
  102.                 }               
  103.                 while(P1!=0xfe);
  104.                 if(num==0||num==1||num==2)         //確認第一行的數1,2,3
  105.                 {
  106.                         if(flag==0)         //沒有按下符號鍵
  107.                         {
  108.                                 if (xiao == 1){a_wei++;}  //有小數點的話要記錄小數點后有幾位
  109.                                 a=a*10+dat1[num];          //比如第一位輸入2第二位輸入1就是21  要存起來就是第一次是2 第二次是2*10+1
  110.                         
  111.                         }                                                  
  112.                         else//按下符號鍵
  113.                         {
  114.                                 if (xiao == 1){b_wei++;}
  115.                                 b=b*10+dat1[num];
  116.                         }
  117.                
  118.                 }
  119.                 if(num==3)
  120.                 {
  121.                         
  122.                         flag=1;
  123.                         fuhao=1;//加號+
  124.                         xiao=0;        
  125.                 }
  126.                 lcdwrd(0x30+dat1[num]);
  127.         }




  128.         P1=0xfd;                                //令第二行為0,判斷是哪一列按下,低位第二行
  129.         if(P1!=0xfd)
  130.         {
  131.                 delay(1000);
  132.                 if(P1!=0xfd)
  133.                 {
  134.                         key=P1&0xf0;
  135.                         switch(key)
  136.                         {
  137.                                 case 0xe0: num=4;break;          //4
  138.                                 case 0xd0: num=5;break;          //5
  139.                                 case 0xb0: num=6;break;          //6
  140.                                 case 0x70: num=7;break;          //減—
  141.                         }        
  142.                 }
  143.                 while(P1!=0xfd);
  144.                 if(num==4||num==5||num==6)
  145.                 {
  146.                         if(flag==0)         //沒有按下符號鍵
  147.                         {
  148.                                 if (xiao == 1){a_wei++;}
  149.                                 a=a*10+dat1[num];        
  150.                         }
  151.                         else
  152.                         {
  153.                                 if (xiao == 1){b_wei++;}
  154.                                 b=b*10+dat1[num];
  155.                         }                        
  156.                 }
  157.                 else
  158.                 {
  159.                         flag=1;
  160.                         fuhao=2;//帶表減號
  161.                         xiao=0;
  162.                 }
  163.                 lcdwrd(0x30+dat1[num]);
  164.         }




  165.         P1=0xfb;                 //令第三行為0,判斷哪一列按下
  166.         if(P1!=0xfb)
  167.         {
  168.                 delay(1000);
  169.                 if(P1!=0xfb)
  170.                 {
  171.                         key=P1&0xf0;
  172.                         switch(key)
  173.                         {
  174.                                 case 0xe0: num=8;break;          //7
  175.                                 case 0xd0: num=9;break;          //8
  176.                                 case 0xb0: num=10;break;  //9
  177.                                 case 0x70: num=11;break;  //乘*
  178.                         }        
  179.                 }
  180.                 while(P1!=0xfb);
  181.                 if(num==8||num==9||num==10)
  182.                 {
  183.                         if(flag==0)         //沒有按下符號鍵
  184.                         {
  185.                                 if (xiao == 1){a_wei++;}
  186.                                 a=a*10+dat1[num];        
  187.                         }
  188.                         else
  189.                         {
  190.                                 if (xiao == 1){b_wei++;}
  191.                                 b=b*10+dat1[num];
  192.                         }                        
  193.                 }
  194.                 else
  195.                 {
  196.                         flag=1;
  197.                         fuhao=3;//帶表乘號*
  198.                         xiao=0;
  199.                 }
  200.                 lcdwrd(0x30+dat1[num]);
  201.         }




  202.         P1=0xf7;                 //令第四行為0,判斷哪一列按下
  203.         if(P1!=0xf7)
  204.         {
  205.                 delay(1000);
  206.                 if(P1!=0xf7)
  207.                 {
  208.                         key=P1&0xf0;
  209.                         switch(key)
  210.                         {
  211.                                 case 0xe0: num=12;break;  //0
  212.                                 case 0xd0: num=13;break;  //清除rst
  213.                                 case 0xb0: num=14;break;  //等號=
  214.                                 case 0x70: num=15;break;  //除/
  215.                         }        
  216.                 }
  217.                 while(P1!=0xf7);
  218.                 switch(num)
  219.                 {
  220.                         case 12:
  221.                                         if(flag==0)         //沒有按下符號鍵
  222.                                         {
  223.                                                 if (xiao == 1){a_wei++;}
  224.                                                 a=a*10+dat1[num];
  225.                                                 lcdwrd(0x30);        
  226.                                         }
  227.                                         else
  228.                                         {
  229.                                                 if (xiao == 1){b_wei++;}
  230.                                                 b=b*10+dat1[num];
  231.                                                 lcdwrd(0x30);
  232.                                         }
  233.                                         break;
  234.                         
  235.                         case 13:
  236.                                         lcdwrc(0x01);        //清屏指令                        
  237.                                         num_zero();
  238.                                         break;


  239.                         case 15:
  240.                         
  241.                                         flag=1;
  242.                                         fuhao=4;
  243.                                         lcdwrd(0x2f);//除號/
  244.                                         xiao=0;
  245.                                         break;


  246.                         case 14:
  247.                                                                                 
  248.                                         lcdwrc(0xc0);//從第二行第一個開始顯示
  249.                                         lcdwrd(0x3d); //顯示等于號=
  250.                                         if(fhao_a==1){a_l = a*pow(0.1,a_wei)*(-1);}         //將結果保存到double精度的數中
  251.                                                                                                                                  //有幾位小數的話要乘0.1的幾次方
  252.                                                                                                                                  //負數的話要成-1
  253.                                         else {a_l = a*pow(0.1,a_wei);}                                                
  254.                                         if(fhao_b==1){b_l = b*pow(0.1,b_wei)*(-1);}
  255.                                         else {b_l = b*pow(0.1,b_wei);}
  256.                                         if(fuhao==1)//加
  257.                                         {
  258.                                                 sprintf(Disp,"%-6.3f",a_l+b_l);        //將結果存在數組中方便顯示
  259.                                                                                                                 //spintf將右邊的字符串到左邊數組中
  260.                                                                                                                 //%-6.3f為占位符既(1)表示靠左6位保留三位小數的浮點數
  261.                                                 lcdwrd_string(Disp,6);        //顯示                                       
  262.                                         }
  263.                                         if(fuhao==2)//減
  264.                                         {
  265.                                                 sprintf(Disp,"%-6.3f",a_l-b_l);
  266.                                                 lcdwrd_string(Disp,6);                                                
  267.                                         }
  268.                                         if(fuhao==3)//乘
  269.                                         {
  270.                                                 sprintf(Disp,"%-9.4f",a_l*b_l);
  271.                                                 lcdwrd_string(Disp,9);                                                
  272.                                         }
  273.                                         if(fuhao==4)//除
  274.                                         {
  275.                                                 sprintf(Disp,"%-9.4f",a_l/b_l);
  276.                                                 lcdwrd_string(Disp,9);                                                
  277.                                         }
  278.                                         num_zero();
  279.                 }
  280.         }


  281. }


  282. /*
  283. 進制轉換           先將輸入的數轉換成十進制存起來
  284. 不同進制轉10進制按權取數  比如 八進制的76  既7*8^1 +6*8^0= 62
  285. 10進制轉不同進制除進制取余 比如 十進制62轉八進制  62除8=7余數6  7除8=0余7 結果反過來寫就是76
  286. */


  287. void change()               
  288. {
  289.         if(P3 != 0xff)
  290.         {                 
  291.                 delay(1000);
  292.                 if(P3 != 0xff)
  293.                 {        
  294.                         switch(P3)
  295.                         {
  296.                                 case 0xef: num=5;break;  //1110 1111  2進制
  297.                                 case 0xdf: num=6;break;  //1101 1111  8進制
  298.                                 case 0xbf: num=7;break;  //1011 1111  10進制
  299.                                 case 0x7f: num=8;break;  //0111 1111  16進制
  300.                         }
  301.                 }
  302.                 while(P3 != 0xff);
  303.                 fuhao++;         //第幾次按進制鍵   第一次輸入  第二次輸出
  304.                 if (num == 5)
  305.                 {        
  306.                         if(fuhao==1)lcdwrd_string("0b",2);        //2進制前顯示0b               
  307.                         flag = 1;// 1 2進制  2 8進制  3 10進制  4 16進制                                                               
  308.                 }
  309.                 else if(num == 6)
  310.                 {        
  311.                         if(fuhao==1)lcdwrd_string("0o",2);                        
  312.                         flag = 2;               
  313.                 }
  314.                 else if(num == 7)
  315.                 {        
  316.                         if(fuhao==1)lcdwrd_string("SS",2);                        
  317.                         flag = 3;               
  318.                 }
  319.                 else if(num == 8)
  320.                 {        
  321.                         if(fuhao==1)lcdwrd_string("0x",2);                        
  322.                         flag = 4;               
  323.                 }
  324.                 if (fuhao == 2){lcdwrc(0x4f+0x80);//下一行
  325.                                                 lcdwrc(0x04);//設置光標左移,屏幕不移動
  326.                                                 }
  327.                 if(flag == 1&&fuhao >= 2)         //按兩次進制鍵 且第二次轉換為二進制
  328.                 {
  329.                         lcdwrc(0x4f+0x80);        //第二行最后一個
  330.                         lcdwrd_string("                ",16);           //清屏
  331.                         lcdwrc(0x4f+0x80);
  332.                         a = biao;        //將值付給a以免第二次轉換亂碼
  333.                         while(a!=0)         //一位一位顯示          值到零
  334.                         {
  335.                                 lcdwrd(0x30+a%2);         //十進制轉二進制 初二取余        每次取余
  336.                                 a=a/2;                                 //每次除二
  337.                         }
  338.                         lcdwrd_string("b0",2);
  339.                 }
  340.                 else if(flag == 2&&fuhao >= 2)
  341.                 {
  342.                         lcdwrc(0x4f+0x80);
  343.                         lcdwrd_string("                ",16);
  344.                         lcdwrc(0x4f+0x80);
  345.                         b = biao;
  346.                         while(b!=0)         //一位一位顯示
  347.                         {
  348.                                 lcdwrd(0x30+b%8);         //十進制轉8進制 初8取余        每次取余
  349.                                 b=b/8;                                 //每次除8
  350.                         }
  351.                         lcdwrd_string("o0",2);
  352.                 }
  353.                 else if(flag == 3&&fuhao >= 2)
  354.                 {
  355.                         lcdwrc(0x4f+0x80);
  356.                         lcdwrd_string("                ",16);
  357.                         lcdwrc(0x4f+0x80);
  358.                         c = biao;
  359.                         while(c!=0)         //一位一位顯示
  360.                         {
  361.                                 lcdwrd(0x30+c%10);
  362.                                 c=c/10;        
  363.                         }
  364.                         lcdwrd_string("SS",2);
  365.                 }
  366.                 else if(flag == 4&&fuhao >= 2)
  367.                 {
  368.                         lcdwrc(0x4f+0x80);
  369.                         lcdwrd_string("                ",16);
  370.                         lcdwrc(0x4f+0x80);
  371.                         d = biao;
  372.                         while(d!=0)         //一位一位顯示
  373.                         {
  374.                                 zh = d%16;
  375.                                 if(zh < 10){lcdwrd(0x30+d%16);} //如果小于10正常顯示
  376.                                 else {lcdwrd(0x37+d%16);}                 //大于等于10要顯示abcdef  ascall碼要推遲7
  377.                                 d=d/16;        
  378.                         }
  379.                         lcdwrd_string("x0",2);
  380.                 }
  381.         }
  382.         if(flag!=0)
  383.         {
  384.                 P1 = key_lie[i];                                                                                  //掃描列[/i][i]
  385.                 i++;
  386.                 if(i >= 4)
  387.                 i = 0;
  388.                 k = 50;
  389.                 if(P1 != key_lie[i])                                                                          //如果有按鍵按下[/i][i]
  390.                 {
  391.                         delay(300);                                                                                          //消抖
  392.                         if(P1 != key_lie[i])                                                                  //按鍵真的按下[/i][i]
  393.                         {
  394.                                 for(j = 0;j <= 16;j++)                                                          //掃描位
  395.                                 {
  396.                                         if(P1 == key_wei[j])                                                  //掃描到
  397.                                         k = j;                                                                                  //賦值給k顯示函數
  398.                                 }
  399.                         }
  400.                         while(P1==key_wei[k]);        
  401.                 }
  402.                 if(k != 50)
  403.                 {        
  404.                         if(flag == 1&&fuhao == 1){if(k < 2){biao = biao*2 + k;lcdwrd(0x30+dat2[k]);}} //轉為10進制存起來  按每位的權取數
  405.                         else if(flag == 2&&fuhao == 1){if(k < 8){biao = biao*8 + k;lcdwrd(0x30+dat2[k]);}}
  406.                         else if(flag == 3&&fuhao == 1){if(k < 10){biao = biao*10 + k;lcdwrd(0x30+dat2[k]);}}
  407.                         else if(flag == 4&&fuhao == 1){if(k < 16){biao = biao*16 + k;lcdwrd(0x30+dat2[k]);}}                        
  408.                 }
  409.         }        
  410. }


  411. /*
  412. 進制計算


  413. void jinzhi()
  414. {
  415.     if(P3 != 0xff)
  416.         {                 
  417.                 delay(1000);
  418.                 if(P3 != 0xff)
  419.                 {        
  420.                         switch(P3)
  421.                         {
  422.                                 case 0xfe: num=1;break;  //1111 1110  +
  423.                                 case 0xfd: num=2;break;  //1111 1101  -
  424.                                 case 0xfb: num=3;break;  //1111 1011  *
  425.                                 case 0xf7: num=4;break;  //1111 0111  =
  426.                                 case 0xef: num=5;break;  //1110 1111  2進制
  427.                                 case 0xdf: num=6;break;  //1101 1111  8進制
  428.                                 case 0xbf: num=7;break;  //1011 1111  10進制
  429.                                 case 0x7f: num=8;break;  //0111 1111  16進制
  430.                         }
  431.                 }
  432.                 while(P3 != 0xff);         
  433.                 if (num == 5)
  434.                 {        
  435.                         lcdwrd_string("0b",2);        //2進制前顯示0b               
  436.                         flag = 1;// 1 2進制  2 8進制  3 10進制  4 16進制                                                               
  437.                 }
  438.                 else if(num == 6)
  439.                 {        
  440.                         lcdwrd_string("0o",2);                        
  441.                         flag = 2;               
  442.                 }
  443.                 else if(num == 7)
  444.                 {        
  445.                         lcdwrd_string("SS",2);                        
  446.                         flag = 3;               
  447.                 }
  448.                 else if(num == 8)
  449.                 {        
  450.                         lcdwrd_string("0x",2);                        
  451.                         flag = 4;               
  452.                 }


  453.                 // +-*
  454.                 if (num == 1)
  455.                 {        
  456.                         lcdwrd(0x2b);        
  457.                         fuhao = 1;        //加                                                        
  458.                 }
  459.                 else if(num == 2)
  460.                 {        
  461.                         lcdwrd(0x2d);                        
  462.                         fuhao = 2;               
  463.                 }
  464.                 else if(num == 3)
  465.                 {        
  466.                         lcdwrd(0x2a);                        
  467.                         fuhao = 3;               
  468.                 }
  469.                 else if(num == 4)
  470.                 {                                
  471.                         zh = 1;                        //按下等號
  472.                         lcdwrc(0x04);
  473.                         lcdwrc(0xcf);        //第二行最后一個
  474.                         lcdwrd(0x3d);
  475.                 }


  476.                 if(fuhao == 1 && zh == 1){biao = fhao_a + fhao_b;}             //+
  477.                 else if(fuhao == 2 && zh == 1){biao = fhao_a - fhao_b;} //-
  478.                 else if(fuhao == 3 && zh == 1){biao = fhao_a * fhao_b;} //*


  479.                 if(flag == 1&&zh == 1)         //二進制顯示結果
  480.                 {




  481.                         while(biao!=0)         //一位一位顯示
  482.                         {
  483.                                 lcdwrd(0x30+biao%2);
  484.                                 biao=biao/2;                                
  485.                         }
  486.                         lcdwrd_string("b0",2);
  487.                 }
  488.                 else if(flag == 2&&zh == 1)        //八進制顯示結果
  489.                 {
  490.                         
  491.                         while(biao!=0)         //一位一位顯示
  492.                         {
  493.                                 lcdwrd(0x30+biao%8);         //十進制轉8進制 初8取余        每次取余
  494.                                 biao=biao/8;                                 //每次除8
  495.                         }
  496.                         lcdwrd_string("o0",2);
  497.                 }
  498.                 else if(flag == 3&&zh == 1)        //八進制顯示結果
  499.                 {
  500.                         
  501.                         while(biao!=0)         //一位一位顯示
  502.                         {
  503.                                 lcdwrd(0x30+biao%10);         //十進制轉8進制 初8取余        每次取余
  504.                                 biao=biao/10;                                 //每次除8
  505.                         }
  506.                         lcdwrd_string("SS",2);
  507.                 }


  508.                 else if(flag == 4&&zh == 1)
  509.                 {        
  510. //                        while(biao!=0)         //一位一位顯示
  511. //                        {
  512. //                                lcdwrd(0x30+biao%10);         //十進制轉8進制 初8取余        每次取余
  513. //                                biao=biao/10;                                 //每次除8
  514. //                        }
  515.                         while(biao!=0)         //一位一位顯示
  516.                         {
  517.                                 d = biao%16;
  518.                                 if(d < 10){lcdwrd(0x30+biao%16);} //如果小于10正常顯示
  519.                                 else {lcdwrd(0x37+biao%16);}                 //大于等于10要顯示abcdef  ascall碼要推遲7
  520.                                 biao=biao/16;        
  521.                         }
  522.                         lcdwrd_string("x0",2);
  523.                 }
  524.         }
  525.         if(flag!=0)
  526.         {
  527.                 P1 = key_lie[i];                                                                                  //掃描列[/i][i]
  528.                 i++;
  529.                 if(i >= 4)
  530.                 i = 0;
  531.                 k = 50;
  532.                 if(P1 != key_lie[i])                                                                          //如果有按鍵按下[/i][i]
  533.                 {
  534.                         delay(300);                                                                                          //消抖
  535.                         if(P1 != key_lie[i])                                                                  //按鍵真的按下[/i][i]
  536.                         {
  537.                                 for(j = 0;j <= 16;j++)                                                          //掃描位
  538.                                 {
  539.                                         if(P1 == key_wei[j])                                                  //掃描到
  540.                                         k = j;                                                                                  //賦值給k顯示函數
  541.                                 }
  542.                         }
  543.                         while(P1==key_wei[k]);        
  544.                 }
  545.                 if(k != 50)
  546.                 {        
  547.                         if(flag == 1&&fuhao == 0){if(k < 2){fhao_a = fhao_a*2 + k;lcdwrd(0x30+dat2[k]);}} //轉為10進制存起來  按每位的權取數
  548.                         else if(flag == 2&&fuhao == 0){if(k < 8){fhao_a = fhao_a*8 + k;lcdwrd(0x30+dat2[k]);}}
  549.                         else if(flag == 3&&fuhao == 0){if(k < 10){fhao_a = fhao_a*10 + k;lcdwrd(0x30+dat2[k]);}}
  550.                         else if(flag == 4&&fuhao == 0){if(k < 16){fhao_a = fhao_a*16 + k;lcdwrd(0x30+dat2[k]);}}
  551.                         if(flag == 1&&fuhao != 0){if(k < 2){fhao_b = fhao_b*2 + k;lcdwrd(0x30+dat2[k]);}} //轉為10進制存起來  按每位的權取數
  552.                         else if(flag == 2&&fuhao != 0){if(k < 8){fhao_b = fhao_b*8 + k;lcdwrd(0x30+dat2[k]);}}
  553.                         else if(flag == 3&&fuhao != 0){if(k < 10){fhao_b = fhao_b*10 + k;lcdwrd(0x30+dat2[k]);}}
  554.                         else if(flag == 4&&fuhao != 0){if(k < 16){fhao_b = fhao_b*16 + k;lcdwrd(0x30+dat2[k]);}}                                                               
  555.                 }
  556.         }
  557. }*/






  558. void main()
  559. {
  560.         LcdInit();                 //初始化lcd
  561.         num_zero();                 //數據清零
  562.         lcdwrd_string("1.calculate",11);        //初始顯示
  563.         lcdwrc(0xc0);
  564.         lcdwrd_string("2.change3.jinzhi",16);
  565.         while(1)
  566.         {
  567.                
  568.                 if(P3 == 0xfe | P3 == 0xfd | P3 == 0xfb)
  569.                 {                 
  570.                         delay(1000);
  571.                         if(P3 == 0xfe | P3 == 0xfd | P3 == 0xfb)
  572.                         {        
  573.                                 switch(P3)
  574.                                 {
  575.                                         case 0xfe: num_d=1;break;  //1111 1110
  576.                                         case 0xfd: num_d=2;break;  //1111 1101
  577.                                         case 0xfb: num_d=3;break;  //1111 1011
  578.                                 }
  579.                         }
  580.                         while(P3 == 0xfe | P3 == 0xfd | P3 == 0xfb);
  581.                         lcdwrc(0x01);
  582.                         num_zero();
  583.                 }


  584.                 if (num_d == 1)
  585.                 {                                                
  586.                         keyscan();                //按1 計算                                                
  587.                 }
  588.                 else if(num_d == 2)
  589.                 {                                
  590.                         change();        //按2 進制轉換        
  591.                 }
  592. /*                else if(num_d == 3)
  593.                 {        
  594.                         
  595.                         while(1){jinzhi();}  //按3 進制計算        
  596.                 }                */               
  597.         }
  598. }





  599. lcd.c模塊
  600. #include"lcd.h"


  601. /*******************************************************************************
  602. * 函 數 名         : Lcd1602_Delay1ms
  603. * 函數功能                   : 延時函數,延時1ms
  604. * 輸    入         : c
  605. * 輸    出         : 無
  606. * 說    名         : 該函數是在12MHZ晶振下,12分頻單片機的延時。
  607. *******************************************************************************/


  608. void Lcd1602_Delay1ms(uint c)   //誤差 0us
  609. {
  610.     uchar a,b;
  611.         for (; c>0; c--)
  612.         {
  613.                  for (b=199;b>0;b--)
  614.                  {
  615.                           for(a=1;a>0;a--);
  616.                  }      
  617.         }
  618.             
  619. }


  620. /*******************************************************************************
  621. * 函 數 名         : LcdWriteCom
  622. * 函數功能                   : 向LCD寫入一個字節的命令
  623. * 輸    入         : com
  624. * 輸    出         : 無
  625. *******************************************************************************/
  626. #ifndef         LCD1602_4PINS         //當沒有定義這個LCD1602_4PINS時
  627. void LcdWriteCom(uchar com)          //寫入命令
  628. {
  629.         LCD1602_E = 0;     //使能
  630.         LCD1602_RS = 0;           //選擇發送命令
  631.         LCD1602_RW = 0;           //選擇寫入
  632.         
  633.         LCD1602_DATAPINS = com;     //放入命令
  634.         Lcd1602_Delay1ms(1);                //等待數據穩定


  635.         LCD1602_E = 1;                  //寫入時序
  636.         Lcd1602_Delay1ms(5);          //保持時間
  637.         LCD1602_E = 0;
  638. }
  639. #else
  640. void LcdWriteCom(uchar com)          //寫入命令
  641. {
  642.         LCD1602_E = 0;         //使能清零
  643.         LCD1602_RS = 0;         //選擇寫入命令
  644.         LCD1602_RW = 0;         //選擇寫入


  645.         LCD1602_DATAPINS = com;        //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
  646.         Lcd1602_Delay1ms(1);


  647.         LCD1602_E = 1;         //寫入時序
  648.         Lcd1602_Delay1ms(5);
  649.         LCD1602_E = 0;


  650. //        Lcd1602_Delay1ms(1);
  651.         LCD1602_DATAPINS = com << 4; //發送低四位
  652.         Lcd1602_Delay1ms(1);


  653.         LCD1602_E = 1;         //寫入時序
  654.         Lcd1602_Delay1ms(5);
  655.         LCD1602_E = 0;
  656. }
  657. #endif
  658. /*******************************************************************************
  659. * 函 數 名         : LcdWriteData
  660. * 函數功能                   : 向LCD寫入一個字節的數據
  661. * 輸    入         : dat
  662. * 輸    出         : 無
  663. *******************************************************************************/                  
  664. #ifndef         LCD1602_4PINS                  
  665. void LcdWriteData(uchar dat)                        //寫入數據
  666. {
  667.         LCD1602_E = 0;        //使能清零
  668.         LCD1602_RS = 1;        //選擇輸入數據
  669.         LCD1602_RW = 0;        //選擇寫入


  670.         LCD1602_DATAPINS = dat; //寫入數據
  671.         Lcd1602_Delay1ms(1);


  672.         LCD1602_E = 1;   //寫入時序
  673.         Lcd1602_Delay1ms(5);   //保持時間
  674.         LCD1602_E = 0;
  675. }
  676. #else
  677. void LcdWriteData(uchar dat)                        //寫入數據
  678. {
  679.         LCD1602_E = 0;          //使能清零
  680.         LCD1602_RS = 1;          //選擇寫入數據
  681.         LCD1602_RW = 0;          //選擇寫入


  682.         LCD1602_DATAPINS = dat;        //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
  683.         Lcd1602_Delay1ms(1);


  684.         LCD1602_E = 1;          //寫入時序
  685.         Lcd1602_Delay1ms(5);
  686.         LCD1602_E = 0;


  687.         LCD1602_DATAPINS = dat << 4; //寫入低四位
  688.         Lcd1602_Delay1ms(1);


  689.         LCD1602_E = 1;          //寫入時序
  690.         Lcd1602_Delay1ms(5);
  691.         LCD1602_E = 0;
  692. }
  693. #endif
  694. /*******************************************************************************
  695. * 函 數 名       : LcdInit()
  696. * 函數功能                 : 初始化LCD屏
  697. * 輸    入       : 無
  698. * 輸    出       : 無
  699. *******************************************************************************/                  
  700. #ifndef                LCD1602_4PINS
  701. void LcdInit()                                                  //LCD初始化子程序
  702. {
  703.          LcdWriteCom(0x38);  //開顯示
  704.         LcdWriteCom(0x0c);  //開顯示不顯示光標
  705.         LcdWriteCom(0x06);  //寫一個指針加1
  706.         LcdWriteCom(0x01);  //清屏
  707.         LcdWriteCom(0x80);  //設置數據指針起點
  708. }
  709. #else
  710. void LcdInit()                                                  //LCD初始化子程序
  711. {
  712.         LcdWriteCom(0x32);         //將8位總線轉為4位總線
  713.         LcdWriteCom(0x28);         //在四位線下的初始化
  714.         LcdWriteCom(0x0c);  //開顯示不顯示光標
  715.         LcdWriteCom(0x06);  //寫一個指針加1
  716.         LcdWriteCom(0x01);  //清屏
  717.         LcdWriteCom(0x80);  //設置數據指針起點
  718. }
  719. #endif



  720. lcd.h頭文件
  721. #ifndef __LCD_H_
  722. #define __LCD_H_
  723. /**********************************
  724. 當使用的是4位數據傳輸的時候定義,
  725. 使用8位取消這個定義
  726. **********************************/
  727. //#define LCD1602_4PINS


  728. /**********************************
  729. 包含頭文件
  730. **********************************/
  731. #include<reg51.h>


  732. //---重定義關鍵詞---//
  733. #ifndef uchar
  734. #define uchar unsigned char
  735. #endif


  736. #ifndef uint
  737. #define uint unsigned int
  738. #endif


  739. /**********************************
  740. PIN口定義
  741. **********************************/
  742. #define LCD1602_DATAPINS P0
  743. sbit LCD1602_E=P2^7;
  744. sbit LCD1602_RW=P2^5;
  745. sbit LCD1602_RS=P2^6;


  746. /**********************************
  747. 函數聲明
  748. **********************************/
  749. /*在51單片機12MHZ時鐘下的延時函數*/
  750. void Lcd1602_Delay1ms(uint c);   //誤差 0us
  751. /*LCD1602寫入8位命令子函數*/
  752. void LcdWriteCom(uchar com);
  753. /*LCD1602寫入8位數據子函數*/        
  754. void LcdWriteData(uchar dat)        ;
  755. /*LCD1602初始化子程序*/               
  756. void LcdInit();                                                  


  757. #endif
復制代碼


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

使用道具 舉報

沙發
ID:123289 發表于 2022-11-10 08:34 | 只看該作者
沒有提示信息嗎?打開提示。
回復

使用道具 舉報

板凳
ID:121859 發表于 2022-11-10 09:40 | 只看該作者
這個代碼太長了,誰有那個耐心來找錯呀。再說你這個圖畫的...........真不好說那啥了。
回復

使用道具 舉報

地板
ID:1050683 發表于 2022-11-10 11:00 來自手機 | 只看該作者
yzwzfyz 發表于 2022-11-10 08:34
沒有提示信息嗎?打開提示。

沒有提示信息protues沒有顯示報錯
回復

使用道具 舉報

5#
ID:1050683 發表于 2022-11-10 11:01 來自手機 | 只看該作者
zhxiufan 發表于 2022-11-10 09:40
這個代碼太長了,誰有那個耐心來找錯呀。再說你這個圖畫的...........真不好說那啥了。

不好意思,我太小白了不大會用。圖里比較亂的地方就P1接了8個獨立按鍵,P3接矩陣鍵盤
回復

使用道具 舉報

6#
ID:1050683 發表于 2022-11-10 11:12 來自手機 | 只看該作者
yzwzfyz 發表于 2022-11-10 08:34
沒有提示信息嗎?打開提示。

燒錄到單片機的話沒問題主要是
回復

使用道具 舉報

7#
ID:161164 發表于 2022-11-11 14:16 | 只看該作者
1 不要用a/b/c/d來命名變量
2 54行的是干啥的?
3 經過編譯會有*** ERROR L107: ADDRESS SPACE OVERFLOW
Program Size: data=144.1 xdata=0 const=81 code=7084
回復

使用道具 舉報

8#
ID:635635 發表于 2022-11-11 22:06 | 只看該作者
你有在proteous中加入hex文件嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人三级视频在线观看 | 久久午夜视频 | 国产高清在线精品 | 亚洲福利在线观看 | www久| 精品视频国产 | av永久| 欧美精品一区二区三区蜜桃视频 | 毛色毛片免费看 | 天天弄天天操 | 国产成人精品一区二三区在线观看 | 午夜精品一区 | 天天干天天谢 | 蜜桃官网 | 中文字幕一二三 | 成人激情视频 | 国产成人自拍av | 日韩精品一区二区三区中文在线 | 国产高清在线观看 | 美女激情av | 亚洲精品乱码久久久久久蜜桃 | 日本不卡在线视频 | 中文字幕av亚洲精品一部二部 | 91精品国产综合久久久久久丝袜 | 久久国产精品久久久久 | h视频在线观看免费 | 久久精品视频在线观看 | 色婷婷综合久久久久中文一区二区 | 日韩精品在线一区 | 亚洲高清免费观看 | 中文字幕久久久 | 一区二区三区四区免费观看 | 国产高清在线精品一区二区三区 | 一区二区三区日 | 午夜无码国产理论在线 | 91免费看片神器 | 日操操夜操操 | 一级毛片黄片 | 成人福利电影 | 成人精品久久 | 欧美男人天堂 |