找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1615|回复: 7
收起左侧

单片机仿真不了,应该不会是我接线有问题吧?

[复制链接]
ID:1050683 发表于 2022-11-10 00:57 | 显示全部楼层 |阅读模式
1.png

  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
复制代码


回复

使用道具 举报

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没有显示报错
回复

使用道具 举报

ID:1050683 发表于 2022-11-10 11:01 来自手机 | 显示全部楼层
zhxiufan 发表于 2022-11-10 09:40
这个代码太长了,谁有那个耐心来找错呀。再说你这个图画的...........真不好说那啥了。

不好意思,我太小白了不大会用。图里比较乱的地方就P1接了8个独立按键,P3接矩阵键盘
回复

使用道具 举报

ID:1050683 发表于 2022-11-10 11:12 来自手机 | 显示全部楼层
yzwzfyz 发表于 2022-11-10 08:34
没有提示信息吗?打开提示。

烧录到单片机的话没问题主要是
回复

使用道具 举报

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
回复

使用道具 举报

ID:635635 发表于 2022-11-11 22:06 | 显示全部楼层
你有在proteous中加入hex文件吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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