欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機程序明明寫的是+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://m.raoushi.com/bbs/)
Powered by Discuz! X3.1