找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机程序明明写的是+1,为什么出来的效果是+2

[复制链接]
跳转到指定楼层
楼主
ID:213280 发表于 2018-12-11 00:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
写了个程序用串口发送数据给单片机,12864显示:发送0第一行的数字+1,发送1第二行的数字+1。可是为什么出来的效果是+2呢,求大佬解答
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include <stdlib.h>        
  4. #define uchar unsigned char
  5. #define uint  unsigned int
  6. /* 端口定义*/
  7. #define LCD_data  P0            //数据口
  8. sbit LCD_RS  =  P3^4;            //寄存器选择输入                                                                                                                                                          0
  9. sbit LCD_RW  =  P3^3;            //液晶读/写控制
  10. sbit LCD_EN  =  P3^2;            //液晶使能控制
  11. sbit LCD_PSB =  P2^7;            //串/并方式控制
  12. sbit LCD_RST =  P2^6;


  13. uchar   data_temp,data_temp1,data_temp2;
  14. uchar num1=0,num2=0;num3=0;num4=0;
  15. typedef unsigned int u16;          //对数据类型进行声明定义
  16. typedef unsigned char u8;
  17. u8 cmd;

  18. void delay_1ms(uint x)
  19. {
  20. uint i,j;
  21. for(j=0;j<x;j++)  
  22.         for(i=0;i<110;i++);
  23. }

  24. unsigned char Convert(unsigned char In_Date)
  25. {
  26.     unsigned char i, Out_Date = 0, temp = 0;
  27.     for(i=0; i<8; i++)
  28.     {
  29.         temp = (In_Date >> i) & 0x01;
  30.         Out_Date |= (temp << (7 - i));
  31.     }
  32.     return Out_Date;
  33. }
  34. /*******************************************************************/
  35. /*                                                                 */
  36. /*写指令数据到LCD                                                  */
  37. /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
  38. /*                                                                 */
  39. /*******************************************************************/
  40. void write_cmd(uchar cmd)
  41. {                          
  42.     LCD_RS = 0;
  43.     LCD_RW = 0;
  44.     LCD_EN = 0;
  45.     P0 = Convert(cmd);
  46.         delay_1ms(5);
  47.     LCD_EN = 1;
  48.         delay_1ms(5);
  49.     LCD_EN = 0;  
  50. }

  51. /*******************************************************************/
  52. /*                                                                 */
  53. /*写显示数据到LCD                                                  */
  54. /*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
  55. /*                                                                 */
  56. /*******************************************************************/
  57. void write_dat(uchar dat)
  58. {                          
  59.     LCD_RS = 1;
  60.     LCD_RW = 0;
  61.     LCD_EN = 0;
  62.     P0 = Convert(dat);
  63.         delay_1ms(5);
  64.     LCD_EN = 1;
  65.         delay_1ms(5);
  66.     LCD_EN = 0;  
  67. }

  68. /*********************************************************/
  69. /*                                                       */
  70. /* 设定显示位置                                          */
  71. /*                                                       */
  72. /*********************************************************/
  73. void lcd_pos(uchar X,uchar Y)
  74. {                          
  75.    uchar  pos;
  76.    if (X==0)
  77.      {X=0x80;}
  78.    else if (X==1)
  79.      {X=0x90;}
  80.    else if (X==2)
  81.      {X=0x88;}
  82.    else if (X==3)
  83.      {X=0x98;}
  84.    pos = X+Y ;  
  85.    write_cmd(pos);     //显示地址
  86. }

  87. /*******************************************************************/
  88. /*                                                                 */
  89. /*  LCD初始化设定                                                  */
  90. /*                                                                 */
  91. /*******************************************************************/
  92. void lcd_init()
  93. {
  94.     LCD_PSB = 1;         //并口方式  
  95.     write_cmd(0x30);      //基本指令操作
  96.     delay_1ms(5);
  97.     write_cmd(0x0C);      //显示开,关光标
  98.     delay_1ms(5);
  99.     write_cmd(0x01);      //清除LCD的显示内容
  100.     delay_1ms(5);
  101. }

  102. void  data_conv()
  103. {
  104.      data_temp1=data_temp/10;       //高位
  105.          if(data_temp1==0)
  106.          {data_temp1=0x20;}             //高位为0不显示
  107.      else
  108.          {data_temp1=data_temp1+0x30;}

  109.           data_temp2=data_temp%10;       //低位
  110.      data_temp2=data_temp2+0x30;
  111. }

  112. void Com_Init(void)
  113. {
  114.      TMOD = 0x22;
  115.      PCON = 0x00;        //设置波特率不倍增
  116.      SCON = 0x50;        //SM1=1,SM0=0,REN=1,允许接收串行口中断方式1               
  117.      TH1 = 0xFd;    //设置波特率 9600
  118.      TL1 = 0xFd;
  119.          TH0  = 0xA4;    //定时时长为0.1ms的初值自动重载
  120.          TL0  = 0xA4;    //定时时长为0.1ms的初值
  121.      TR1 = 1;                //启动定时器1
  122.          TR0 = 1;            //启动定时器
  123.          ET0 = 1;        //打开定时器0中断
  124.          ES = 1;                //开串口中断
  125.          EA = 1;                //开总中断               
  126. }

  127. void Com_Int(void) interrupt 4
  128. {
  129.         if(RI == 1)   //当硬件接收到一个数据时,RI会置位
  130.         {
  131.                 cmd = SBUF; //这里接收到的是16进制
  132.                 RI = 0;  
  133.                 SBUF = cmd;               
  134.         }        
  135.         switch(cmd)
  136.                                 {
  137.                                 case 0:
  138.                                         num1=num1+1;
  139.                                         break;               
  140.                                 case 1:
  141.                                         num2=num2+1;
  142.                                         break;
  143.                                 case 3:
  144.                                         num3=num3+1;         
  145.                                         break;
  146.                                 case 4:
  147.                                         num4=num4+1;  
  148.                                         break;
  149.                                 default: break;
  150.         }

  151.         if (TI) //字节发送完毕
  152.         {
  153.                 TI = 0; //手动清零发送中断标志位
  154.         }              //TI清零
  155. }

  156. void Time0Int(void) interrupt 1 using 1
  157. {

  158. }         

  159. /* 主程序                                                                                    */
  160. main()
  161. {
  162.     delay_1ms(10);      //延时
  163.         Com_Init();
  164.     lcd_init();        
  165.         while(1)
  166.         {
  167.         data_temp=num1;
  168.         data_conv();                 //初始化LCD            
  169.     lcd_pos(0,0);             //设置显示位置为第一行的第1个字符
  170.         write_dat(data_temp1);
  171.         lcd_pos(0,1);
  172.         write_dat(data_temp2);

  173.         data_temp=num2;
  174.         data_conv();
  175.     lcd_pos(1,0);
  176.         write_dat(data_temp1);
  177.         lcd_pos(1,1);
  178.         write_dat(data_temp2);
  179.          }
  180. }
复制代码

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

使用道具 举报

沙发
ID:424598 发表于 2018-12-11 09:32 来自手机 | 只看该作者
num1=num1+1改成num1++试试
回复

使用道具 举报

板凳
ID:123289 发表于 2018-12-11 12:53 | 只看该作者
你能保证你只加了一次吗?
回复

使用道具 举报

地板
ID:213280 发表于 2018-12-11 21:16 | 只看该作者
ssk7793 发表于 2018-12-11 09:32
num1=num1+1改成num1++试试

试过了,一样
回复

使用道具 举报

5#
ID:213280 发表于 2018-12-11 21:18 | 只看该作者
yzwzfyz 发表于 2018-12-11 12:53
你能保证你只加了一次吗?

就是搞不懂呀
回复

使用道具 举报

6#
ID:246251 发表于 2018-12-12 13:31 | 只看该作者
把switch部分放进if(RI == 1)里面
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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