找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机计算器,但是lcd1602显示屏不显示数字

[复制链接]
跳转到指定楼层
楼主
ID:866545 发表于 2021-1-12 15:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1黑币
设计一个简易计算器,但是lcd1602显示屏不显示数字,代码如下,硬件检查无错,求救,急急急!
  1. #include <reg52.h>
  2. #include <math.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit rs=P2^0;//指令0,数据1
  6. sbit rw=P2^1;//读0,写1,引脚
  7. sbit lcden=P2^2;//使能端
  8. sbit P1_0=P1^0;
  9. sbit P1_1=P1^1;
  10. sbit P1_2=P1^2;
  11. uchar temp,num,flag,i,j,k,n,m,aa[10]={0},bb[11]={0};
  12. bit flag_1;
  13. uint sum[20]={0},count;
  14. uint m_delay;
  15. /*我自己写的一个pow,只能算整数*/
  16. int pow_wozijxiede(int xx,int yy)
  17. {
  18.         uint i;
  19.         int product=1;
  20.         for(i=0;i<yy;i++)
  21.         {
  22.                 product=product*xx;        
  23.         }
  24.                 return product;

  25. }
  26. /**********************************************
  27.     延时函数  ms
  28. *********************************************/        
  29. void delayms(uint t)
  30. {
  31.     uint x,y;
  32.         for(x=t;x>0;x--)
  33.         for(y=110;y>0;y--);
  34. }
  35. /**********************************************
  36.     1602指令,数据,初始化
  37. *********************************************/
  38. void write_1602com(uchar com)
  39. {
  40.     P0=com;
  41.         rs=0;//指令
  42.         rw=0;//写
  43.         lcden=0;
  44.         delayms(20);
  45.         lcden=1;
  46.         delayms(20);
  47.         lcden=0;
  48. }
  49. void write_1602date(uchar date)
  50. {
  51.     P0=date;
  52.         rs=1;//数据
  53.         rw=0;//写
  54.         lcden=0;
  55.         delayms(20);
  56.         lcden=1;
  57.         delayms(20);
  58.         lcden=0;
  59. }
  60. void init_lcd1602()
  61. {
  62.         write_1602com(0x38);//选择16x2显示,5x7点阵
  63.         delayms(20);
  64.         write_1602com(0x0f);//开显示,开光标,光标闪烁
  65.         delayms(20);
  66.         write_1602com(0x06);//读或写后,指针加一,光标加一
  67.         delayms(20);
  68.         write_1602com(0x01);//清屏
  69.         delayms(20);
  70. }
  71. /*****************************************
  72.         检测按键并输出
  73. ******************************************/
  74. uchar keyscan()                           
  75. {
  76.         P3=0xfe;
  77.         temp=P3;
  78.         while(temp!=0xfe)
  79.         {
  80.                 delayms(5);
  81.                 temp=P3;
  82.                 while(temp!=0xfe)
  83.                 {
  84.                         switch(temp)
  85.                         {
  86.                                 case 0xee:num=7;
  87.                                         break;
  88.                                 case 0xde:num=8;
  89.                                         break;
  90.                                 case 0xbe:num=9;
  91.                                         break;
  92.                                 case 0x7e:num='/';
  93.                                         break;
  94.                         }
  95.                         while(temp!=0xfe)
  96.                         {
  97.                                 flag=1;
  98.                                 temp=P3;
  99.                         }
  100.                 }
  101.         }
  102.         P3=0xfd;
  103.         temp=P3;
  104.         while(temp!=0xfd)
  105.         {
  106.                 delayms(5);
  107.                 temp=P3;
  108.                 while(temp!=0xfd)
  109.                 {
  110.                         switch(temp)
  111.                         {
  112.                                 case 0xed:num=4;
  113.                                         break;
  114.                                 case 0xdd:num=5;
  115.                                         break;
  116.                                 case 0xbd:num=6;
  117.                                         break;
  118.                                 case 0x7d:num='*';
  119.                                         break;
  120.                         }
  121.                         while(temp!=0xfd)
  122.                         {
  123.                                 flag=1;
  124.                                 temp=P3;
  125.                         }
  126.                 }
  127.         }

  128.         P3=0xfb;
  129.         temp=P3;
  130.         while(temp!=0xfb)
  131.         {
  132.                 delayms(5);
  133.                 temp=P3;
  134.                 while(temp!=0xfb)
  135.                 {
  136.                         switch(temp)
  137.                         {
  138.                                 case 0xeb:num=1;
  139.                                         break;
  140.                                 case 0xdb:num=2;
  141.                                         break;
  142.                                 case 0xbb:num=3;
  143.                                         break;
  144.                                 case 0x7b:num='-';
  145.                                         break;
  146.                         }
  147.                         while(temp!=0xfb)
  148.                         {
  149.                                 flag=1;
  150.                                 temp=P3;
  151.                         }
  152.                 }
  153.         }
  154.         P3=0xf7;
  155.         temp=P3;
  156.         while(temp!=0xf7)
  157.         {
  158.                 delayms(5);
  159.                 temp=P3;
  160.                 while(temp!=0xf7)
  161.                 {
  162.                         switch(temp)
  163.                         {
  164.                                 case 0xe7:num='c';
  165.                                         break;
  166.                                 case 0xd7:num=0;
  167.                                         break;
  168.                                 case 0xb7:num='=';
  169.                                         break;
  170.                                 case 0x77:num='+';
  171.                                         break;
  172.                         }
  173.                         while(temp!=0xf7)
  174.                         {
  175.                                 flag=1;
  176.                                 temp=P3;
  177.                         }
  178.                 }
  179.         }
  180.                                 if(P1_0==0)
  181.                                 {
  182.                                         for(m_delay=0;m_delay<3000;m_delay++);
  183.                                                 if(P1_0==0)
  184.                                                 {
  185.                                                         num='^';
  186.                                                   flag=1;
  187.                                                         while(!P1_0);                                                
  188.                                                 }                        
  189.                                 }
  190.                                         if(P1_1==0)
  191.                                 {
  192.                                         for(m_delay=0;m_delay<3000;m_delay++);
  193.                                                 if(P1_1==0)
  194.                                                 {
  195.                                                         num='#';
  196.                                                   flag=1;
  197.                                                         while(!P1_1);                                                
  198.                                                 }                        
  199.                                 }
  200.                                         if(P1_2==0)
  201.                                 {
  202.                                         for(m_delay=0;m_delay<3000;m_delay++);
  203.                                                 if(P1_2==0)
  204.                                                 {
  205.                                                         num='&';
  206.                                                   flag=1;
  207.                                                         while(!P1_2);                                                
  208.                                                 }                        
  209.                                 }
  210.                                 
  211.         return num;
  212. }
  213. /*********************************************
  214.         将逐个输入数 aa[] 转化为整数
  215. *********************************************/
  216. void zuan_shu()                                   
  217. {
  218.          switch(n)
  219.         {
  220.                 case 0:sum[j++]=0;break;
  221.                 case 1:sum[j++]=aa[0];break;
  222.                 case 2:sum[j++]=aa[0]*10+aa[1];break;
  223.                 case 3:sum[j++]=aa[0]*100+aa[1]*10+aa[2];break;
  224.                 case 4:sum[j++]=aa[0]*1000+aa[1]*100+aa[2]*10+aa[3];break;
  225. /*                case 5:sum[j++]=aa[0]*10000+aa[1]*1000+aa[2]*100+aa[3]*10+aa[4];break;
  226.                 case 6:sum[j++]=aa[0]*100000+aa[1]*10000+aa[2]*1000+aa[3]*100+aa[4]*10+aa[5];break;
  227.                 case 7:sum[j++]=aa[0]*1000000+aa[1]*100000+aa[2]*10000+aa[3]*1000+aa[4]*100+aa[5]*10+aa[6];break;
  228.                 case 8:sum[j++]=aa[0]*10000000+aa[1]*1000000+aa[2]*100000+aa[3]*10000+aa[4]*1000+aa[5]*100+aa[6]*10+aa[7];break;
  229. */               
  230.         }                                
  231. }
  232. /****************************************************
  233.         液晶显示函数
  234. ******************************************************/
  235. void lcd1602_display(uint count)                                   
  236. {
  237.          uchar a,b,c,d,e;  //f,g,h;
  238.         a=count%10;
  239.         b=count/10%10;
  240.         c=count/100%10;
  241.         d=count/1000%10;
  242.         e=count/10000%10;
  243. /*        f=count/100000%10;
  244.         g=count/1000000%10;
  245.         h=count/10000000%10;


  246.         write_date(0x30+h);
  247.         write_date(0x30+g);
  248.         write_date(0x30+f);
  249. */
  250.         if(e!=0)
  251.         write_1602date(0x30+e);
  252.         if((e==0&&d!=0)||e!=0)
  253.         write_1602date(0x30+d);
  254.         if((e==0&&d==0&&c!=0)||e!=0||d!=0)
  255.         write_1602date(0x30+c);
  256.         if((e==0&&d==0&&c==0&&b!=0)||e!=0||d!=0||c!=0)
  257.         write_1602date(0x30+b);
  258.         write_1602date(0x30+a);        
  259. }
  260. /*************************************************
  261.         运算结果函数并保存至   sum[k]
  262. **************************************************/
  263. void yunsuan()                                                   
  264. {
  265.          uchar m;
  266.      for(k=0;bb[k]!=0&&k<10;k++)                                  //先找出高级运算符运算
  267.         {
  268.                 if(bb[k]=='*')
  269.                 {
  270.                         sum[k+1]=sum[k]*sum[k+1];
  271.                         sum[k]='N';
  272.                 }
  273.                 if(bb[k]=='/')
  274.                 {
  275.                                                                         if(sum[k+1]!=0)
  276.                                                                         {
  277.                                                                          sum[k+1]=sum[k]/sum[k+1];
  278.                    sum[k]='N';                                                                                       
  279.                                                                         }
  280.                                                                         else
  281.                                                                         {
  282.                                                                                                         for(m_delay=0;m_delay<10;m_delay++)
  283.                                                                                                         {
  284.                                                                                                                 sum[m_delay]=0;
  285.                                                                                                         }   
  286.                                                                                 flag_1=1;
  287.                                                                                 
  288.                                                                         }                       
  289.                 }
  290.         }
  291.         for(k=0;bb[k]!=0&&k<10;k++)
  292.         {
  293.                  if(bb[k]=='+')
  294.                 {
  295.                         for(m=1;sum[k+m]=='N';)
  296.                         {
  297.                                  m++;        
  298.                         }
  299.                         sum[k+m]=sum[k]+sum[k+m];
  300.                 }
  301.                 if(bb[k]=='-')
  302.                 {
  303.                         for(m=1;sum[k+m]=='N';)
  304.                         {
  305.                                  m++;        
  306.                         }
  307.                         sum[k+m]=sum[k]-sum[k+m];
  308.                 }
  309.                                                                 if(bb[k]=='^')
  310.                 {
  311.                         for(m=1;sum[k+m]=='N';)
  312.                         {
  313.                                  m++;        
  314.                         }
  315.                         sum[k+m]=pow_wozijxiede(sum[k],sum[k+m]);
  316.                 }
  317.                                                     if(bb[k]=='#')
  318.                 {
  319.                         for(m=1;sum[k+m]=='N';)
  320.                         {
  321.                                  m++;        
  322.                         }
  323.                        sum[k+m]=sqrt(sum[k]);
  324.                 }
  325.         }
  326. }
  327. /*************************************************  
  328.         main函数
  329. ***************************************************/
  330. void main()
  331. {
  332.     init_lcd1602();
  333.         while(1)
  334.         {         
  335.             flag=0;
  336.                  keyscan();
  337.                 if(flag!=0)
  338.                 {
  339.                         if(num>=0&&num<=9)
  340.                         {
  341.                                  aa[i++]=num;
  342.                                 write_1602date(0x30+num);
  343.                                 n++;
  344.                         }
  345.                         if(num=='+')
  346.                         {
  347.                                 write_1602date(0x20+11);//1602   '+'符
  348.                                 bb[k++]=num;
  349.                                 zuan_shu();
  350.                                 for(i=0;i<n;i++)
  351.                                 aa[i]=0;
  352.                                 i=0;
  353.                                 n=0;
  354.                         }
  355.                         if(num=='-')
  356.                         {
  357.                                 write_1602date(0x20+13);//1602   '-'符
  358.                                 bb[k++]=num;
  359.                                 zuan_shu();
  360.                                 for(i=0;i<n;i++)
  361.                                 aa[i]=0;
  362.                                 i=0;
  363.                                 n=0;
  364.                         }
  365.                         if(num=='*')
  366.                         {
  367.                                 write_1602date(0x20+10);//1602   '*'符
  368.                                 bb[k++]=num;
  369.                                 zuan_shu();
  370.                                 for(i=0;i<n;i++)
  371.                                 aa[i]=0;
  372.                                 i=0;
  373.                                 n=0;
  374.                         }
  375.                         if(num=='/')
  376.                         {
  377.                                 write_1602date(0xf0+13);//1602   '/'符
  378.                                 bb[k++]=num;
  379.                                 zuan_shu();
  380.                                 for(i=0;i<n;i++)
  381.                                 aa[i]=0;
  382.                                 i=0;
  383.                                 n=0;
  384.                         }
  385.                         if(num=='c'&&m==0)                                 //删除一个数或一个运算符
  386.                         {
  387.                                 write_1602com(0x04);//读或写后,指针减一,光标减一
  388.                                 write_1602date(' ');//1602   空符                        
  389.                                 write_1602com(0x06);//读或写后,指针加一,光标加一
  390.                                 if(n!=0)
  391.                                 {
  392.                                          n--;
  393.                                         aa[--i]=0;
  394.                                 }
  395.                                 else
  396.                                 {
  397.                                          bb[--k]=0;
  398.                                 }
  399.                         }
  400.                                                                                                     if(num=='^')
  401.                         {
  402.                                 write_1602date(0xdf);//1602   '^'符
  403.                                 bb[k++]=num;
  404.                                 zuan_shu();
  405.                                 for(i=0;i<n;i++)
  406.                                 aa[i]=0;//[/i][i]
  407.                                 i=0;
  408.                                 n=0;
  409.                         }            
  410.                         if(num=='#')
  411.                         {
  412.                                 write_1602date(0xde);//1602   '#'符
  413.                                 bb[k++]=num;
  414.                                 zuan_shu();
  415.                                 for(i=0;i<n;i++)
  416.                                 aa[i]=0;//[/i][i]
  417.                                 i=0;
  418.                                 n=0;
  419.                         }
  420.                                                                                           if(num=='&')
  421.                         {                                                                                                        
  422.                                                                                                         for(m_delay=0;m_delay<10;m_delay++)
  423.                                                                                                         {
  424.                                                                                                                 aa[m_delay]=0;
  425.                                                                                                                 sum[m_delay]=0;
  426.                                                                                                                 bb[m_delay]=0;
  427.                                                                                                         }                                
  428.                                 i=0;
  429.                                 n=0;
  430.                                                                                                               k=0;
  431.                                                                                                               j=0;
  432.                                                                                                                                 m=0;
  433.                                                                                                         flag_1=0;
  434.                                                                                         init_lcd1602();
  435.                                                                                                                 write_1602com(0x01);//清屏
  436.                                                                                                                                         delayms(20);
  437.                         }                                                                                       
  438.                         if(num=='=')
  439.                         {
  440.                                 m=1;
  441.                                 write_1602com(0xc0);
  442.                                 write_1602date(0x30+13);//1602   '='符
  443.                                 zuan_shu();
  444.                                 yunsuan();
  445.                                                                                                                                 if(flag_1)
  446.                                 {
  447.                                                                                                                                         count=0;                                                                                                                                
  448.                                                                                                                                         write_1602date(0x45);//1602   '#'符
  449.                                                                                                                                 }
  450.                                                                                                                                 else
  451.                                                                                                                                 {
  452.                                                                                                                                 count=sum[k];
  453.                                 lcd1602_display(count);
  454.                                                                                                                                 }                                                                                                                                
  455.                                 write_1602com(0x0c);
  456.                                                                                                                                 flag_1=0;
  457.                         }                                                                                                      
  458.                 }        
  459.         }
  460. }
复制代码

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

使用道具 举报

沙发
ID:748788 发表于 2021-1-12 17:14 | 只看该作者
先确认1602能不能正常显示字符或字符串
回复

使用道具 举报

板凳
ID:390416 发表于 2021-1-12 18:22 | 只看该作者
看这个贴子 单片机+LCD1602显示℃ 这种自定义符号 http://www.51hei.com/bbs/dpj-200685-1.html
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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