寫了個程序用串口發送數據給單片機,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);
- }
- }
復制代碼
|