找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1343|回复: 4
收起左侧

求教单片机+LCD1602应用时出现第一行空白部分出现了第二行的数据

[复制链接]
回帖奖励 20 黑币 回复本帖可获得 20 黑币奖励! 每人限 1 次
ID:360656 发表于 2019-6-2 22:43 | 显示全部楼层 |阅读模式
以下是全部的程序 LCD数据写入的部分我标记了下,求大大们帮个忙
  1. #include <reg52.h>                         //此文件中定义了单片机的一些特殊功能寄存器
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define GPIO_DIG P0  //lcd
  5. #define GPIO_KEY P1 //矩阵键盘
  6. #define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
  7. #define Coil_A2 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电
  8. #define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
  9. #define Coil_B2 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电
  10. #define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
  11. #define Coil_C2 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电
  12. #define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
  13. #define Coil_D2 {A1=1;B1=0;C1=0;D1=1;}//DA相通电,其他相断电
  14. #define LCD_IO P0
  15. typedef unsigned int u16;          //对数据类型进行声明定义
  16. typedef unsigned char u8;
  17. sbit jiaoliuzhengzhuan=P2^3;
  18. sbit jiaoliufanzhuan=P2^4;
  19. sbit k1=P3^0;
  20. sbit k2=P3^1;
  21. sbit A1=P3^2; //定义步进电机连接端口
  22. sbit B1=P3^3;
  23. sbit C1=P3^4;
  24. sbit D1=P3^5;
  25. int zqianwei,zbaiwei,zshiwei,zgewei;
  26. int zjiaodu=0;
  27. int b=0,c=0,d=0;
  28. int j=0,i=0,k=0;
  29. int jiaodu=180;
  30. int shiwei;
  31. int shanshuo;
  32. int gewei;
  33. int e,v,n;
  34. int baiwei;
  35. int weight=0;
  36. int z=0;
  37. int KeyValue;        //用来存放读取到的键值
  38. sbit sheng1=P1^4;
  39. sbit sheng2=P1^5;
  40. sbit LCD_RS = P2^6;
  41. sbit LCD_RW = P2^5;
  42. sbit LCD_EN = P2^7;
  43. char code LCD_line2[] = "Weight: 0kg ";
  44. char Timer_buf[] = "00";
  45. char code LCD_line1[] = "jiaodu:  0  du ";
  46. char weight_1[] = "";
  47. unsigned char SetPlace;
  48. unsigned char Speed;
  49. /*******************************************************************************
  50. * 函 数 名         : delay
  51. * 函数功能                   : 延时函数,i=1时,大约延时10us
  52. *******************************************************************************/

  53. void delay1(uint z)
  54. {
  55.     uint  x, y;
  56.     for(x = z; x > 0; x--)  for(y = 100; y > 0; y--);
  57. }

  58. //---------------------------------------------------
  59. void W_LCD_Com(uchar com)      //写指令
  60. {
  61.     LCD_RS = 0;  LCD_IO = com; // LCD_RS和R/W都为低电平时,写入指令
  62.     LCD_EN = 1;  delay1(5); LCD_EN = 0; //用EN输入一个高脉冲
  63. }
  64. //---------------------------------------------------
  65. void W_LCD_Dat(uchar dat)      //写数据
  66. {
  67.     LCD_RS = 1;  LCD_IO = dat; // LCD_RS为高、R/W为低时,写入数据
  68.     LCD_EN = 1;  delay1(5); LCD_EN = 0; //用EN输入一个高脉冲
  69. }
  70. //---------------------------------------------------
  71. void W_LCD_STR(uchar *s)       //写字符串
  72. {
  73.     while(*s)  W_LCD_Dat(*s++);
  74. }
  75. //---------------------------------------------------
  76. void W_BUFF(void)              //填写显示缓冲区   LCD数据写入
  77. {gewei=jiaodu%10;
  78.   baiwei=jiaodu/100;
  79.   shiwei=(jiaodu/10)%10;
  80. weight_1[2] = gewei % 10+ 48;
  81. weight_1[1] = shiwei % 10+ 48;  
  82. weight_1[0] = baiwei % 10+ 48;
  83.   W_LCD_Com(0x80 + 7); W_LCD_STR(weight_1);
  84. zgewei=zjiaodu%10;
  85. zbaiwei=zjiaodu/100;
  86.   zshiwei=(zjiaodu/10)%10;
  87. zqianwei=zjiaodu/1000;
  88. Timer_buf[1] = zbaiwei % 10 + 48;Timer_buf[0] = zqianwei % 10+ 48;
  89. Timer_buf[2] = zshiwei % 10 + 48;Timer_buf[3] = zgewei % 10 + 48;
  90. W_LCD_Com(0xc0+7);W_LCD_STR(Timer_buf);
  91. }
  92. //---------------------------------------------------

  93. //---------------------------------------------------
  94. void Init()
  95. {
  96.     LCD_RW = 0;
  97.     W_LCD_Com(0x38); delay1(50);
  98.     W_BUFF();
  99.     W_LCD_Com(0x01);
  100.     W_LCD_Com(0x80); W_LCD_STR(LCD_line1);
  101.     W_LCD_Com(0xC0); W_LCD_STR(LCD_line2);


  102. }
  103. //---------------------------------------------------
  104. void delay(u16 i)
  105. {
  106.         while(i--);      
  107. }

  108. /*******************************************************************************
  109. * 函 数 名         : KeyDown
  110. * 函数功能                   : 检测有按键按下并读取键值
  111. * 输    入         : 无
  112. * 输    出         : 无
  113. *******************************************************************************/
  114. void KeyDown(void)
  115. {
  116.         char a=0;
  117.         GPIO_KEY=0x0f;
  118.         if(GPIO_KEY!=0x0f)//读取按键是否按下
  119.         {
  120.                 delay(1000);//延时10ms进行消抖
  121.                 if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
  122.                 {      
  123.                         //测试列
  124.                         GPIO_KEY=0X0F;
  125.                         switch(GPIO_KEY)
  126.                         {
  127.                                 case(0X07):        KeyValue=0;break;
  128.                                 case(0X0b):        KeyValue=1;break;
  129.                                 case(0X0d): KeyValue=2;break;
  130.                                 case(0X0e):        KeyValue=3;break;
  131.                         }
  132.                         //测试行
  133.                         GPIO_KEY=0XF0;
  134.                         switch(GPIO_KEY)
  135.                         {
  136.                                 case(0X70):        KeyValue=KeyValue;break;
  137.                                 case(0Xb0):        KeyValue=KeyValue+4;break;
  138.                                 case(0Xd0): KeyValue=KeyValue+8;break;
  139.                                 case(0Xe0):        KeyValue=KeyValue+12;break;
  140.                         }
  141.                         while((a<50)&&(GPIO_KEY!=0xf0))         //检测按键松手检测
  142.                         {
  143.                                 delay(1000);
  144.                                 a++;
  145.                         }
  146.                 }
  147.         }
  148. }
  149. zhengzhuan()
  150. {
  151. while(k!=j)  
  152.   {      
  153.      Coil_A1                 //遇到Coil_A1  用{A1=1;B1=0;C1=0;D1=0;}代替
  154.        delay(200);       //改变这个参数可以调整电机转速 ,
  155.          k--;
  156.          if(k==j)
  157.          break;     
  158.      Coil_A2               
  159.       delay(200);      
  160.          k--;
  161.          if(k==j)
  162.          break;                     
  163.      Coil_B1
  164.     delay(200);  
  165.          k--;
  166.          if(k==j)
  167.          break;
  168.      Coil_B2
  169.        delay(200);  
  170.          k--;
  171.          if(k==j)
  172.          break;
  173.      Coil_C1
  174.      delay(200);  
  175.          k--;
  176.          if(k==j)
  177.          break;
  178.      Coil_C2
  179.      delay(200);  
  180.          k--;
  181.          if(k==j)
  182.          break;
  183.      Coil_D1
  184.        delay(200);  
  185.          k--;
  186.          if(k==j)
  187.          break;
  188.      Coil_D2
  189.        delay(200);  
  190.          k--;
  191.          if(k==j)
  192.          break;
  193.          }}
  194.   fanzhuan()
  195. {
  196. while(k!=j)  
  197.   {   
  198.      Coil_D2                 //遇到Coil_A1  用{A1=1;B1=0;C1=0;D1=0;}代替
  199.      delay(200);        //改变这个参数可以调整电机转速 ,
  200.          k--;  
  201. if(k==j)
  202.          break;      
  203.      Coil_D1                 
  204.         delay(200);         
  205.          k--;  
  206. if(k==j)
  207.          break;                  
  208.      Coil_C2
  209.        delay(200);  
  210.          k--;
  211. if(k==j)
  212.          break;
  213.      Coil_C1
  214.      delay(200);  
  215.          k--;
  216. if(k==j)
  217.          break;
  218.      Coil_B2
  219.          delay(200);  
  220.          k--;
  221. if(k==j)
  222.          break;
  223.      Coil_B1
  224.        delay(200);  
  225.          k--;
  226. if(k==j)
  227.          break;
  228.      Coil_A2
  229.       delay(200);  
  230.          k--;
  231. if(k==j)
  232.          break;
  233.      Coil_A1
  234.        delay(200);  
  235.          k--;
  236.          if(k==j)
  237.          break;
  238.          }
  239.   }


  240. void anjian()
  241. {if(KeyValue==6&&b==1&&c==1&&d==1)//电机正转
  242. {k=jiaodu*11+jiaodu/2;i=i+k;zhengzhuan();KeyValue=20;}
  243. if(KeyValue==7&&b==1&&c==1&&d==1)//电机反转
  244. {k=jiaodu*12;if(i<=0){
  245. delay(1000);i=0;k=0;}
  246. i=i-k;fanzhuan();
  247. KeyValue=20;}
  248. if(KeyValue==5)
  249. {b=1;c=1;d=1;shanshuo=0;KeyValue=20;z=5;}
  250.         if(KeyValue==0)
  251. {z++;
  252. if (z>=7)
  253. z=0;
  254. KeyValue=20;}//百位选择
  255. if(z==0)
  256. {b=1;c=0;d=0;e=1;v=1;n=1;shanshuo=1;}
  257. if(z==1)//十位选择
  258. {b=0;c=1;d=0;e=1;v=1;n=1;shanshuo=2;}
  259. if(z==2)//个位选择
  260. {b=0;c=0;d=1;e=1;v=1;n=1;shanshuo=3;}
  261. if(z==3)//千位选择
  262. {b=0;c=0;d=0;e=1;v=0;n=0;shanshuo=4;}
  263. if(z==4)//百位选择
  264. {b=1;c=0;d=0;e=0;v=0;n=0;shanshuo=5;}
  265. if(z==5)//十位选择
  266. {b=0;c=1;d=0;e=0;v=0;n=1;shanshuo=6;}
  267. if(z==6)//个位选择
  268. {b=0;c=0;d=1;e=0;v=1;n=1;shanshuo=7;}
  269. if(KeyValue==1)
  270. {jiaoliuzhengzhuan=1;jiaoliufanzhuan=0;}
  271. if(KeyValue==2)
  272. {jiaoliufanzhuan=1;jiaoliuzhengzhuan=0;}
  273. if(KeyValue==9)
  274. {jiaoliufanzhuan=1;jiaoliuzhengzhuan=1;}
  275. if(KeyValue==3&&b==1&&c==0&&d==0&&e==1&&v==1&&n==1)//百位+1
  276. {jiaodu=jiaodu+100;KeyValue=20;}
  277. if(KeyValue==4&&b==1&&c==0&&d==0&&e==1&&v==1&&n==1)//百位-1
  278. {jiaodu=jiaodu-100;KeyValue=20;}
  279. if(KeyValue==3&&b==0&&c==1&&d==0&&e==1&&v==1&&n==1)//十位+1
  280. {jiaodu=jiaodu+10;KeyValue=20;}
  281. if(KeyValue==4&&b==0&&c==1&&d==0&&e==1&&v==1&&n==1)//十位-1
  282. {jiaodu=jiaodu-10;KeyValue=20;}
  283. if(KeyValue==3&&b==0&&c==0&&d==1&&e==1&&v==1&&n==1)//个位+1
  284. {jiaodu=jiaodu+1;KeyValue=20;}
  285. if(KeyValue==4&&b==0&&c==0&&d==1&&e==1&&v==1&&n==1)//个位-1
  286. {jiaodu=jiaodu-1;KeyValue=20;}
  287. if(KeyValue==3&&b==1&&c==0&&d==0&&e==0&&v==0&&n==0)//百位+1
  288. {zjiaodu=zjiaodu+100;KeyValue=20;}
  289. if(KeyValue==4&&b==1&&c==0&&d==0&&e==0&&v==0&&n==0)//百位-1
  290. {zjiaodu=zjiaodu-100;KeyValue=20;}
  291. if(KeyValue==3&&b==0&&c==1&&d==0&&e==0&&v==0&&n==1)//十位+1
  292. {zjiaodu=zjiaodu+10;KeyValue=20;}
  293. if(KeyValue==4&&b==0&&c==1&&d==0&&e==0&&v==0&&n==1)//十位-1
  294. {zjiaodu=zjiaodu-10;KeyValue=20;}
  295. if(KeyValue==3&&b==0&&c==0&&d==1&&e==0&&v==1&&n==1)//个位+1
  296. {zjiaodu=zjiaodu+1;KeyValue=20;}
  297. if(KeyValue==4&&b==0&&c==0&&d==1&&e==0&&v==1&&n==1)//个位-1
  298. {zjiaodu=zjiaodu-1;KeyValue=20;}
  299. if(KeyValue==3&&b==0&&c==0&&d==0&&e==1&&v==0&&n==0)//千位+1
  300. {zjiaodu=zjiaodu+1000;KeyValue=20;}
  301. if(KeyValue==4&&b==0&&c==0&&d==0&&e==1&&v==0&&n==0)//千位-1
  302. {zjiaodu=zjiaodu-1000;KeyValue=20;}
  303. if(KeyValue==8){if(i<=0)i=0;k=i;
  304. i=i-k;fanzhuan();
  305. KeyValue=20;}
  306. if(k1==0)
  307. {KeyValue=6;}
  308. if(k2==0)
  309. {KeyValue=7;}
  310. }
  311. /*******************************************************************************
  312. * 函 数 名       : main
  313. * 函数功能                 : 主函数
  314. * 输    入       : 无
  315. * 输    出             : 无
  316. *******************************************************************************/
  317. void main()
  318. {
  319. delay(100);
  320.     Init();      
  321. shanshuo=0;
  322. delay(100);
  323. weight=30;
  324. P1=0x00;
  325.         while(1)
  326.         {        KeyDown();

  327.         anjian();
  328.     weight=i/1900;
  329.         switch (shanshuo)
  330. {case 0:W_LCD_Com(0x0c);W_BUFF();break;
  331. case 1: W_LCD_Com(0x87);
  332.     W_LCD_Com(0x0f);delay(1000); W_BUFF();break;
  333. case 2:W_LCD_Com(0x88);
  334.     W_LCD_Com(0x0f);delay(1000); W_BUFF();break;
  335. case 3:W_LCD_Com(0x89);
  336.     W_LCD_Com(0x0f);delay(1000); W_BUFF();break;
  337.         case 4:W_LCD_Com(0xc7);
  338.     W_LCD_Com(0x0f);delay(1000); W_BUFF();break;
  339.         case 5:W_LCD_Com(0xc8);
  340.     W_LCD_Com(0x0f);delay(1000); W_BUFF();break;
  341.         case 6:W_LCD_Com(0xc9);
  342.     W_LCD_Com(0x0f);delay(1000); W_BUFF();break;
  343.         case 7:W_LCD_Com(0xca);
  344.     W_LCD_Com(0x0f);delay(1000); W_BUFF();break;
  345.         default :W_LCD_Com(0x0c);W_BUFF();break;
  346. }//写显示
  347.         }               
  348. }
复制代码





第一行后面的俩个数我并没有编写

第一行后面的俩个数我并没有编写
回复

使用道具 举报

ID:332444 发表于 2019-6-4 20:48 | 显示全部楼层
得空看看,你用什么板子?
回复

使用道具 举报

ID:332444 发表于 2019-6-4 21:03 | 显示全部楼层
修改一下试看
char code LCD_line1[] = "jiaodu: 0du ";
回复

使用道具 举报

ID:332444 发表于 2019-6-4 21:05 | 显示全部楼层
修改一下45行代码如下
char code LCD_line1[] = "jiaodu: 0du ";
回复

使用道具 举报

ID:511890 发表于 2019-6-5 03:42 | 显示全部楼层

char Timer_buf[] = "00";
char code LCD_line1[] = "jiaodu:  0  du ";
char weight_1[] = "";
改成:
char code LCD_line2[] = "Weight:   0kg ";
char Timer_buf[5];
char code LCD_line1[] = "jiaodu:  0  du ";
unsigned char weight_1[4];
没固定长度的数组系统会默认给一个长的值。显示不好控制。再加上你的W_LCD_STR()遍历了整个数组。所有才会出现后面的乱码。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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