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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4330|回復(fù): 9
收起左側(cè)

單片機(jī)程序沒什么問題 就是實物圖顯示不出來,板子做出來用這個程序沒反應(yīng)

[復(fù)制鏈接]
ID:351958 發(fā)表于 2018-12-4 10:42 | 顯示全部樓層 |閱讀模式
10黑幣
程序沒什么問題 就是實物圖顯示不出來  板子做出來用這個程序沒反應(yīng)
電路原理圖如下:
JSUBTS1E2B6SJQXY_RE)HU1.png
  1. #include <reg51.H>
  2. #include<intrins.h>
  3. #include<stdio.h>
  4. #include<string.h>
  5. #include<math.h>
  6. sbit RS = P2^5;
  7. sbit RW = P2^6;
  8. sbit E  = P2^7;

  9. #define Data  P0//數(shù)據(jù)端口
  10. //全局變量
  11. float num1;//第一操作數(shù)num1     (初始為零)
  12. float num2;//第二操作數(shù)num2     (初始為零)
  13. char yun_flag='+';//運(yùn)算符號 yun_flag    (默認(rèn)為+ )
  14. char key_last;//上次按鍵狀態(tài)標(biāo)志 key_last
  15. char sqrt_flag;//開方鍵按下標(biāo)志   sqrt_flag
  16. unsigned long pos_flag=1;//小數(shù)位權(quán)pos_flag      (默認(rèn)為1)
  17. char neg_flag;//正負(fù)標(biāo)志 neg_flag
  18. char data c_num1[15]=" ";//c_num1 字符型第一操作數(shù) (數(shù)組不定義大小與其他變量沖突)
  19. char data c_num2[15]=" ";//c_num2 字符型第二操作數(shù)
  20. char error;//運(yùn)算法則錯誤;
  21. char len;//小數(shù)點(diǎn)后位數(shù)
  22. /*                    微秒延時函數(shù)                                */
  23. /******************************************************************/
  24. void DelayUs(unsigned char us)//delay us
  25. {
  26. unsigned char uscnt;
  27. uscnt=us>>1;        /*12MHz頻率*/
  28. while(--uscnt);
  29. }
  30. /******************************************************************/
  31. /*                    毫秒函數(shù)聲明                                */
  32. /******************************************************************/
  33. void DelayMs(unsigned char ms)
  34. {
  35. while(--ms)
  36.    {
  37.      DelayUs(250);
  38.      DelayUs(250);
  39.          DelayUs(250);
  40.          DelayUs(250);
  41.    }
  42. }
  43. /******************************************************************/
  44. /*                   寫入命令函數(shù)                                 */
  45. /******************************************************************/
  46. void WriteCommand(unsigned char c)
  47. {
  48. DelayMs(5);//操作前短暫延時,保證信號穩(wěn)定
  49. E=0;
  50. RS=0;
  51. RW=0;
  52. _nop_();
  53. E=1;
  54. Data=c;
  55. E=0;
  56. }
  57. /******************************************************************/
  58. /*                   寫入數(shù)據(jù)函數(shù)                                 */
  59. /******************************************************************/
  60. void WriteData(unsigned char c)
  61. {
  62. DelayMs(5);  //操作前短暫延時,保證信號穩(wěn)定
  63. E=0;
  64. RS=1;
  65. RW=0;
  66. _nop_();
  67. E=1;
  68. Data=c;
  69. E=0;
  70. RS=0;
  71. }
  72. /******************************************************************/
  73. /*                   寫入字節(jié)函數(shù)                                 */
  74. /******************************************************************/
  75. void ShowChar(unsigned char pos,unsigned char c)
  76. {
  77. unsigned char p;
  78. if (pos>=0x10)
  79.     p=pos+0xb0; //是第二行則命令代碼高4位為0xc
  80. else
  81.     p=pos+0x80; //是第二行則命令代碼高4位為0x8
  82. WriteCommand (p);//寫命令
  83. WriteData (c);   //寫數(shù)據(jù)
  84. }
  85. /******************************************************************/
  86. /*                   寫入字符串函數(shù)                               */
  87. /******************************************************************/
  88. void ShowString (unsigned char line,char *ptr)
  89. {
  90. unsigned char l,i;
  91. l=line<<4;
  92. for (i=0;*(ptr+i)!='\0';i++)
  93.   ShowChar (l++,*(ptr+i));//循環(huán)顯示16個字符
  94. }
  95. /******************************************************************/
  96. /*                   初始化函數(shù)                                   */
  97. /******************************************************************/
  98. void InitLcd()
  99. {
  100. DelayMs(15);
  101. WriteCommand(0x38); //display mode
  102. WriteCommand(0x38); //display mode
  103. WriteCommand(0x38); //display mode
  104. WriteCommand(0x06); //顯示光標(biāo)移動位置
  105. WriteCommand(0x0c); //顯示開及光標(biāo)設(shè)置
  106. WriteCommand(0x01); //顯示清屏

  107. }
  108. /*************按鍵掃描****************************/
  109. char scan()
  110. {

  111.   char h_data,l_data,i,key_num;
  112.   P2=P2&0XE0;//P2低5位送0
  113.   P1=P1|0X0F;//P1低4位送1
  114.   while((P1|0xf0)==0xff)//判斷P1低4位是否全為1
  115.   {
  116.    while((P1|0xf0)==0xff);
  117.    DelayMs(10);//延時10ms
  118.   }
  119.    l_data=~(P1|0xf0);//記入列標(biāo)志
  120.    P2=P2|0X1F;//P2低五位送1
  121.    P1=P1&0XF0;//P1低四位送0
  122.    h_data=~(P2|0xe0);//記入行標(biāo)志
  123.    for(i=0;i<=4;i++)//計算行號(0~4)
  124.             {
  125.            if(h_data==1)break;
  126.            h_data=h_data>>1;
  127.          }
  128. h_data=i;//行號
  129.   for(i=1;i<=4;i++)//計算列號(1~4)
  130.          {
  131.           if(l_data==1)break;
  132.           l_data=l_data>>1;
  133.         }
  134. l_data=i;//列號
  135.    key_num=h_data*4+l_data;        

  136.   P2=P2&0XE0;//P2低5位送0
  137.   P1=P1|0X0F;//P1低4位送1
  138.   while((P1|0xf0)!=0xff)//判斷P1低4位是否全為1
  139.   {
  140.    while((P1|0xf0)!=0xff);
  141.    DelayMs(10);//延時10ms
  142.   }
  143.   return key_num;
  144. }
  145. void float_to_char(float a,char* p)
  146. {
  147.   char i,flag,length;
  148.   flag=0;
  149.   sprintf(p,"%f",a);
  150.   length=strlen (p);
  151.   for(i=0;i<length;i++)
  152.   {
  153.     if(*(p+i)=='.')flag=1;
  154.   }
  155.   if(flag==1)
  156.   for(i=length-1;i>=0;i--)
  157.   {
  158.     if(*(p+i)=='.'){*(p+i)='\0';break;}
  159.     if(*(p+i)!='0'){*(p+i+1)='\0';break;}
  160.   }
  161. }
  162. /**********************更新液晶*************************/
  163. void refresh()//更新液晶
  164. {
  165.   char length,i,j;
  166.   char dot;
  167.   dot=0;
  168.          
  169.   float_to_char(num2,c_num2);//num2轉(zhuǎn)為字符型
  170.   length=strlen(c_num2);
  171.   for(i=0,j=0;i<length;i++)        
  172.   {
  173.     if(c_num2[i]=='.')
  174.         dot=1;
  175.         if(dot==1)
  176.     j++;
  177.   }
  178.   if(j<len)
  179.   {
  180.           if(dot==1)
  181.           {        
  182.             for(i=length;i<(length+len-j);i++)
  183.                  {
  184.                    c_num2[i]='0';
  185.         
  186.                  }
  187.                  c_num2[i]='\0';
  188.           }
  189.           else
  190.                 {
  191.                   
  192.                   c_num2[length]='.';
  193.                   if(len-j>1)
  194.                   {
  195.                     for(i=length+1;i<(length+len-j);i++)
  196.                          c_num2[i]='0';
  197.                   }
  198.                   c_num2[length+len-j]='\0';
  199.                 }  
  200.   }

  201.   if(neg_flag==1)//'+/-'按下首位加‘-’
  202.    {
  203.       length=strlen(c_num2);//計算c_num2長度         
  204.                     for(i=length-1;i>=0;i--)
  205.                   {
  206.                           c_num2[i+1]=c_num2[i];
  207.                   }
  208.                   c_num2[length+1]='\0';
  209.                   c_num2[0]='-';
  210.    }

  211.    if(sqrt_flag==1)
  212.            {
  213.       length=strlen(c_num2);//計算c_num2長度
  214.              for(i=length-1;i>=0;i--)
  215.           {
  216.                   c_num2[i+1]=c_num2[i];
  217.           }
  218.           c_num2[length+1]='\0';
  219.           c_num2[0]=0xe8;//字符根號
  220.    }


  221.    if(error==0)
  222.    {
  223.            float_to_char(num1,c_num1);//num1轉(zhuǎn)為字符型
  224.            WriteCommand(0x01); //顯示清屏
  225.            ShowString(0,c_num1);
  226.            ShowString(1,c_num2);  
  227.            ShowChar(15,yun_flag);
  228.    }else
  229.    {
  230.        WriteCommand(0x01); //顯示清屏
  231.            ShowString(0,"error!!!");
  232.    }
  233. }
  234. //鍵值處理
  235. void operation1(char keynum)//按下 ’+、-、*、/處理
  236. {
  237.   if(key_last==1)//上次按鍵為 數(shù)字、小數(shù)點(diǎn)、+/-、sqrt
  238.    {
  239.      if(neg_flag==1)num2=-num2;//'+/-'按下
  240.          if(sqrt_flag==1)//sqrt按下
  241.          {
  242.          if(num2>=0)
  243.          num2=sqrt(num2);
  244.          else
  245.          error=1;
  246.          }
  247.          if(yun_flag=='+')num1=num1+num2; //按下的是‘+’
  248.          if(yun_flag=='-')num1=num1-num2;//按下的是‘-’
  249.          if(yun_flag=='*')num1=num1*num2;//按下的是‘*’
  250.          if(yun_flag=='/')//按下的是‘/’
  251.          {
  252.            if(num2!=0)
  253.            num1=num1/num2;
  254.            else
  255.            error=1;
  256.          }
  257.          num2=0;//num2清零
  258.          sqrt_flag=0;//sqrt_flag清零
  259.      neg_flag=0;//neg_flag清零
  260.          pos_flag=1;//pos_flag回1
  261.    }
  262.    if(keynum==4)yun_flag='+';//yun_flag更新
  263.    if(keynum==8)yun_flag='-';
  264.    if(keynum==12)yun_flag='*';
  265.    if(keynum==16)yun_flag='/';
  266.    len=0;
  267.    key_last=0;//key_last更新   
  268.    refresh();
  269. }
  270. //////////////////////////////////////////////////////
  271. void operation2(char keynum)//輸入數(shù)字
  272. {
  273.   float Data1;

  274.   if(keynum==1)Data1=7;//分析輸入數(shù)字
  275.   if(keynum==2)Data1=8;
  276.   if(keynum==3)Data1=9;
  277.   if(keynum==5)Data1=4;
  278.   if(keynum==6)Data1=5;
  279.   if(keynum==7)Data1=6;
  280.   if(keynum==9)Data1=1;
  281.   if(keynum==10)Data1=2;
  282.   if(keynum==11)Data1=3;
  283.   if(keynum==13)Data1=0;
  284.   if(pos_flag==1)//更新num2
  285.   num2=num2*10+Data1;
  286.   else
  287.   {            
  288.     num2=num2+(Data1/pos_flag);
  289.         pos_flag=pos_flag*10;
  290.         len++;
  291.   }
  292.   key_last=1;//更新key_last        
  293.   refresh();
  294. }
  295. ////////////////////////////////////////////////////////////
  296. void operation3()//輸入小數(shù)點(diǎn)
  297. {
  298.   if(pos_flag==1)//首次出現(xiàn)小數(shù)點(diǎn)
  299.   {
  300.    pos_flag=pos_flag*10;//小數(shù)位權(quán)*10
  301.    len++;
  302.   }
  303.   key_last=1;//更新key_last
  304.   refresh();//更新液晶
  305. }
  306. /////////////////////////////////////////////////////
  307. void operation4()//輸入'='
  308. {
  309.      if(neg_flag==1)num2=-num2;//'+/-'按下
  310.          if(sqrt_flag==1)//sqrt按下
  311.          {
  312.          if(num2>=0)
  313.          num2=sqrt(num2);
  314.          else
  315.          error=1;
  316.          }
  317.          if(yun_flag=='+')num1=num1+num2; //按下的是‘+’
  318.          if(yun_flag=='-')num1=num1-num2;//按下的是‘-’
  319.          if(yun_flag=='*')num1=num1*num2;//按下的是‘*’
  320.          if(yun_flag=='/')//按下的是‘/’
  321.          {
  322.            if(num2!=0)
  323.            num1=num1/num2;
  324.            else
  325.            error=1;
  326.          }
  327.          num2=0;//num2清零
  328.          sqrt_flag=0;//sqrt_flag清零
  329.      neg_flag=0;//neg_flag清零
  330.          pos_flag=1;//pos_flag回1
  331.      yun_flag='+';//yun_flag更新
  332.          len=0;
  333.    key_last=0;//key_last更新   
  334.    refresh();
  335. }
  336. ////////////////////////////////////////////////////
  337. void operation5()//輸入clear all
  338. {

  339.    num1=0;// num1清零
  340.    num2=0;//num2清零
  341.    sqrt_flag=0;//清sqrt_flag
  342.    neg_flag=0;// 清neg_flag
  343.    pos_flag=1;// Pos_flag=1
  344.    yun_flag='+';// yun_flag(為'+')
  345.    error=0;//清error
  346.    len=0;
  347.    key_last=0;//更新key_flag
  348.    refresh();//更新液晶
  349. }
  350. ///////////////////////////////////////////////////////
  351. void operation6()//輸入'C'
  352. {
  353. num2=0;//num2清零
  354. sqrt_flag=0;//清sqrt_flag
  355. neg_flag=0;//清neg_flag
  356. pos_flag=1;//pos_flag=1
  357. len=0;
  358. key_last=0;//key_last
  359. refresh();//更新液晶
  360. }
  361. ////////////////////////////////////////////////////////////
  362. void operation7()//輸入'+/-'
  363. {
  364.   if(neg_flag==0)//neg_flag反轉(zhuǎn)
  365.   neg_flag=1;
  366.   else neg_flag=0;
  367.   key_last=1;//key_last
  368.   refresh();// 更新液晶
  369. }
  370. /////////////////////////////////////////////////////////////
  371. void operation8()//輸入'sqrt'
  372. {
  373. if(sqrt_flag==0)//sqrt_flag反轉(zhuǎn)
  374.   sqrt_flag=1;
  375. else sqrt_flag=0;
  376. key_last=1;//更新key_last
  377. refresh();//更新液晶
  378. }
  379. //鍵值分析
  380. void key(char keynum)
  381. {
  382.   switch(keynum)
  383.   {
  384.     case 4 :
  385.         case 8 :
  386.         case 12:
  387.         case 16://+、-、*、/
  388.                     {
  389.                          if(error==0)
  390.                  operation1(keynum);
  391.                  break;}
  392.                         
  393.         case 1  : //數(shù)字7
  394.         case 2  : //數(shù)字8
  395.         case 3  : //數(shù)字9
  396.         case 5  : //數(shù)字4
  397.         case 6  : //數(shù)字5
  398.         case 7  : //數(shù)字6
  399.         case 9  : //數(shù)字1
  400.         case 10 : //數(shù)字2
  401.         case 11 : //數(shù)字3
  402.         case 13 : //數(shù)字0
  403.                  {
  404.                          if(error==0)
  405.                          operation2(keynum);
  406.                          break;}
  407.                         
  408.         case 14 ://小數(shù)點(diǎn)                  
  409.                          {
  410.                            if(error==0)
  411.                            operation3();
  412.                            break;}
  413.                         
  414.         case 15 :// '='         
  415.                          {
  416.                            if(error==0)
  417.                            operation4();
  418.                            break;}
  419.                         
  420.         case 17 :// clear all  
  421.                          {
  422.                            operation5();
  423.                            break;}

  424.         case 18 :// 'C'  
  425.                          {
  426.                            if(error==0)
  427.                            operation6();
  428.                            break;}
  429.         case 19 :// '+/-'  
  430.                          {
  431.                            if(error==0)
  432.                            operation7();
  433.                            break;}
  434.         case 20 ://sqrt
  435.                          {
  436.                            if(error==0)
  437.                            operation8();
  438.                            break;}                                      
  439.                                                                        
  440.   }         
  441. }
  442. main()
  443. {

  444. InitLcd();         //初始化LCD
  445. DelayMs(15);       //延時保證信號穩(wěn)定
  446. refresh();

  447.         //延時保證信號穩(wěn)定
  448. while(1)
  449. {
  450. key(scan());
  451. }
  452. }
復(fù)制代碼

回復(fù)

使用道具 舉報

ID:351958 發(fā)表于 2018-12-4 11:17 來自手機(jī) | 顯示全部樓層
大神幫忙看看什么問題
回復(fù)

使用道具 舉報

ID:439040 發(fā)表于 2018-12-4 11:21 | 顯示全部樓層
這種情況你可以復(fù)查下你的引腳是否接錯,看看你的程序有沒有錯誤,重新在試下,如果程序可以在電腦上運(yùn)行,那說明你的板子有問題,可以重新檢測然后打板子。
回復(fù)

使用道具 舉報

ID:439105 發(fā)表于 2018-12-4 11:42 | 顯示全部樓層
或許是你板子沒焊接好。引腳接錯。程序下載錯。。一個個排查吧
回復(fù)

使用道具 舉報

ID:303383 發(fā)表于 2018-12-4 12:10 | 顯示全部樓層
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
回復(fù)

使用道具 舉報

ID:202748 發(fā)表于 2018-12-4 14:02 | 顯示全部樓層
圖錯了,U1的40腳到VCC干嘛串個10K電阻?
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2018-12-4 14:18 | 顯示全部樓層
你的原理圖上單片機(jī)電源腳(40PIN)串聯(lián)了一個10K電阻,如果PCB也是這樣,那怎么可能正常工作???
回復(fù)

使用道具 舉報

ID:7485 發(fā)表于 2018-12-4 16:44 | 顯示全部樓層
除了電源的電阻錯誤外,不知你的EA腳接的是什么?接高電平了沒有?
回復(fù)

使用道具 舉報

ID:421499 發(fā)表于 2018-12-4 17:30 | 顯示全部樓層
仿真可以不代表做實物的時候可以,電路設(shè)計時有要注意布局,布局不好會影響單片機(jī)的工作的
回復(fù)

使用道具 舉報

ID:432823 發(fā)表于 2018-12-4 20:26 | 顯示全部樓層
液晶寫命令、寫數(shù)據(jù)時,要判斷一下是否完成。在你程序中沒有。/******************************************************************/
/*                                                                */
/*檢查LCD忙狀態(tài)                                                   */
/*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數(shù)據(jù)。     */
/*                                                                */
/******************************************************************/

bit LCD_busy()
{                          
    bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    LCD_delayNOP();
    result = (bit)(P0&0x80);
    LCD_EN = 0;
    return(result);
}
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 黄色毛片黄色毛片 | 91久久 | 一区二区三区精品在线 | www.日韩高清 | 97精品超碰一区二区三区 | 日韩精品激情 | 久久伊人精品 | 四虎成人免费视频 | 欧美日韩a | 爱爱免费视频 | 在线观看中文字幕dvd播放 | av在线一区二区三区 | 香蕉久久久 | 亚洲免费婷婷 | 激情a| 国产高清一二三区 | 一区二区三区四区电影视频在线观看 | 日韩国产精品一区二区三区 | 狠狠艹| 精品国产一区二区在线 | 国产一二三区精品视频 | 国产视频精品在线观看 | 日本大片在线播放 | 日日操av | 蜜桃在线视频 | 亚洲福利av | 成人性生交大片免费看r链接 | 亚洲高清视频在线观看 | 91九色视频 | 午夜av电影院 | 6080亚洲精品一区二区 | 亚洲精品亚洲人成人网 | 亚洲 欧美 在线 一区 | 99re6在线视频精品免费 | 999观看免费高清www | 久久精品av | 91在线观看免费视频 | 二区三区在线观看 | 国产成人啪免费观看软件 | 亚洲精品一区在线 | 在线免费观看黄色av |