标题:
单片机程序明明写的是+1,为什么出来的效果是+2
[打印本页]
作者:
蓝琪
时间:
2018-12-11 00:43
标题:
单片机程序明明写的是+1,为什么出来的效果是+2
写了个程序用串口发送数据给单片机,12864显示:发送0第一行的数字+1,发送1第二行的数字+1。可是为什么出来的效果是+2呢,求大佬解答
#include <reg51.h>
#include <intrins.h>
#include <stdlib.h>
#define uchar unsigned char
#define uint unsigned int
/* 端口定义*/
#define LCD_data P0 //数据口
sbit LCD_RS = P3^4; //寄存器选择输入 0
sbit LCD_RW = P3^3; //液晶读/写控制
sbit LCD_EN = P3^2; //液晶使能控制
sbit LCD_PSB = P2^7; //串/并方式控制
sbit LCD_RST = P2^6;
uchar data_temp,data_temp1,data_temp2;
uchar num1=0,num2=0;num3=0;num4=0;
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
u8 cmd;
void delay_1ms(uint x)
{
uint i,j;
for(j=0;j<x;j++)
for(i=0;i<110;i++);
}
unsigned char Convert(unsigned char In_Date)
{
unsigned char i, Out_Date = 0, temp = 0;
for(i=0; i<8; i++)
{
temp = (In_Date >> i) & 0x01;
Out_Date |= (temp << (7 - i));
}
return Out_Date;
}
/*******************************************************************/
/* */
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/* */
/*******************************************************************/
void write_cmd(uchar cmd)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
P0 = Convert(cmd);
delay_1ms(5);
LCD_EN = 1;
delay_1ms(5);
LCD_EN = 0;
}
/*******************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/* */
/*******************************************************************/
void write_dat(uchar dat)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = Convert(dat);
delay_1ms(5);
LCD_EN = 1;
delay_1ms(5);
LCD_EN = 0;
}
/*********************************************************/
/* */
/* 设定显示位置 */
/* */
/*********************************************************/
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
pos = X+Y ;
write_cmd(pos); //显示地址
}
/*******************************************************************/
/* */
/* LCD初始化设定 */
/* */
/*******************************************************************/
void lcd_init()
{
LCD_PSB = 1; //并口方式
write_cmd(0x30); //基本指令操作
delay_1ms(5);
write_cmd(0x0C); //显示开,关光标
delay_1ms(5);
write_cmd(0x01); //清除LCD的显示内容
delay_1ms(5);
}
void data_conv()
{
data_temp1=data_temp/10; //高位
if(data_temp1==0)
{data_temp1=0x20;} //高位为0不显示
else
{data_temp1=data_temp1+0x30;}
data_temp2=data_temp%10; //低位
data_temp2=data_temp2+0x30;
}
void Com_Init(void)
{
TMOD = 0x22;
PCON = 0x00; //设置波特率不倍增
SCON = 0x50; //SM1=1,SM0=0,REN=1,允许接收串行口中断方式1
TH1 = 0xFd; //设置波特率 9600
TL1 = 0xFd;
TH0 = 0xA4; //定时时长为0.1ms的初值自动重载
TL0 = 0xA4; //定时时长为0.1ms的初值
TR1 = 1; //启动定时器1
TR0 = 1; //启动定时器
ET0 = 1; //打开定时器0中断
ES = 1; //开串口中断
EA = 1; //开总中断
}
void Com_Int(void) interrupt 4
{
if(RI == 1) //当硬件接收到一个数据时,RI会置位
{
cmd = SBUF; //这里接收到的是16进制
RI = 0;
SBUF = cmd;
}
switch(cmd)
{
case 0:
num1=num1+1;
break;
case 1:
num2=num2+1;
break;
case 3:
num3=num3+1;
break;
case 4:
num4=num4+1;
break;
default: break;
}
if (TI) //字节发送完毕
{
TI = 0; //手动清零发送中断标志位
} //TI清零
}
void Time0Int(void) interrupt 1 using 1
{
}
/* 主程序 */
main()
{
delay_1ms(10); //延时
Com_Init();
lcd_init();
while(1)
{
data_temp=num1;
data_conv(); //初始化LCD
lcd_pos(0,0); //设置显示位置为第一行的第1个字符
write_dat(data_temp1);
lcd_pos(0,1);
write_dat(data_temp2);
data_temp=num2;
data_conv();
lcd_pos(1,0);
write_dat(data_temp1);
lcd_pos(1,1);
write_dat(data_temp2);
}
}
复制代码
作者:
ssk7793
时间:
2018-12-11 09:32
num1=num1+1改成num1++试试
作者:
yzwzfyz
时间:
2018-12-11 12:53
你能保证你只加了一次吗?
作者:
蓝琪
时间:
2018-12-11 21:16
ssk7793 发表于 2018-12-11 09:32
num1=num1+1改成num1++试试
试过了,一样
作者:
蓝琪
时间:
2018-12-11 21:18
yzwzfyz 发表于 2018-12-11 12:53
你能保证你只加了一次吗?
就是搞不懂呀
作者:
new_hand
时间:
2018-12-12 13:31
把switch部分放进if(RI == 1)里面
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1