找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3172|回复: 9
打印 上一主题 下一主题
收起左侧

单片机程序没什么问题 就是实物图显示不出来,板子做出来用这个程序没反应

[复制链接]
跳转到指定楼层
楼主
10黑币
程序没什么问题 就是实物图显示不出来  板子做出来用这个程序没反应
电路原理图如下:

  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//数据端口
  10. //全局变量
  11. float num1;//第一操作数num1     (初始为零)
  12. float num2;//第二操作数num2     (初始为零)
  13. char yun_flag='+';//运算符号 yun_flag    (默认为+ )
  14. char key_last;//上次按键状态标志 key_last
  15. char sqrt_flag;//开方键按下标志   sqrt_flag
  16. unsigned long pos_flag=1;//小数位权pos_flag      (默认为1)
  17. char neg_flag;//正负标志 neg_flag
  18. char data c_num1[15]=" ";//c_num1 字符型第一操作数 (数组不定义大小与其他变量冲突)
  19. char data c_num2[15]=" ";//c_num2 字符型第二操作数
  20. char error;//运算法则错误;
  21. char len;//小数点后位数
  22. /*                    微秒延时函数                                */
  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. /*                    毫秒函数声明                                */
  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. /*                   写入命令函数                                 */
  45. /******************************************************************/
  46. void WriteCommand(unsigned char c)
  47. {
  48. DelayMs(5);//操作前短暂延时,保证信号稳定
  49. E=0;
  50. RS=0;
  51. RW=0;
  52. _nop_();
  53. E=1;
  54. Data=c;
  55. E=0;
  56. }
  57. /******************************************************************/
  58. /*                   写入数据函数                                 */
  59. /******************************************************************/
  60. void WriteData(unsigned char c)
  61. {
  62. DelayMs(5);  //操作前短暂延时,保证信号稳定
  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. /*                   写入字节函数                                 */
  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);   //写数据
  84. }
  85. /******************************************************************/
  86. /*                   写入字符串函数                               */
  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));//循环显示16个字符
  94. }
  95. /******************************************************************/
  96. /*                   初始化函数                                   */
  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); //显示光标移动位置
  105. WriteCommand(0x0c); //显示开及光标设置
  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);//记入列标志
  120.    P2=P2|0X1F;//P2低五位送1
  121.    P1=P1&0XF0;//P1低四位送0
  122.    h_data=~(P2|0xe0);//记入行标志
  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转为字符型
  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转为字符型
  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)//上次按键为 数字、小数点、+/-、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)//输入数字
  272. {
  273.   float Data1;

  274.   if(keynum==1)Data1=7;//分析输入数字
  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()//输入小数点
  297. {
  298.   if(pos_flag==1)//首次出现小数点
  299.   {
  300.    pos_flag=pos_flag*10;//小数位权*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反转
  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反转
  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  : //数字7
  394.         case 2  : //数字8
  395.         case 3  : //数字9
  396.         case 5  : //数字4
  397.         case 6  : //数字5
  398.         case 7  : //数字6
  399.         case 9  : //数字1
  400.         case 10 : //数字2
  401.         case 11 : //数字3
  402.         case 13 : //数字0
  403.                  {
  404.                          if(error==0)
  405.                          operation2(keynum);
  406.                          break;}
  407.                         
  408.         case 14 ://小数点                  
  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);       //延时保证信号稳定
  446. refresh();

  447.         //延时保证信号稳定
  448. while(1)
  449. {
  450. key(scan());
  451. }
  452. }
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:351958 发表于 2018-12-4 11:17 来自手机 | 只看该作者
大神帮忙看看什么问题
回复

使用道具 举报

板凳
ID:439040 发表于 2018-12-4 11:21 | 只看该作者
这种情况你可以复查下你的引脚是否接错,看看你的程序有没有错误,重新在试下,如果程序可以在电脑上运行,那说明你的板子有问题,可以重新检测然后打板子。
回复

使用道具 举报

地板
ID:439105 发表于 2018-12-4 11:42 | 只看该作者
或许是你板子没焊接好。引脚接错。程序下载错。。一个个排查吧
回复

使用道具 举报

5#
ID:303383 发表于 2018-12-4 12:10 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

6#
ID:202748 发表于 2018-12-4 14:02 | 只看该作者
图错了,U1的40脚到VCC干嘛串个10K电阻?
回复

使用道具 举报

7#
ID:213173 发表于 2018-12-4 14:18 | 只看该作者
你的原理图上单片机电源脚(40PIN)串联了一个10K电阻,如果PCB也是这样,那怎么可能正常工作???
回复

使用道具 举报

8#
ID:7485 发表于 2018-12-4 16:44 | 只看该作者
除了电源的电阻错误外,不知你的EA脚接的是什么?接高电平了没有?
回复

使用道具 举报

9#
ID:421499 发表于 2018-12-4 17:30 | 只看该作者
仿真可以不代表做实物的时候可以,电路设计时有要注意布局,布局不好会影响单片机的工作的
回复

使用道具 举报

10#
ID:432823 发表于 2018-12-4 20:26 | 只看该作者
液晶写命令、写数据时,要判断一下是否完成。在你程序中没有。/******************************************************************/
/*                                                                */
/*检查LCD忙状态                                                   */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。     */
/*                                                                */
/******************************************************************/

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);
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表