|
自己寫了一段將單片機串口控制led燈亮滅,然后在LCD顯示燈狀態(tài)的程序。現(xiàn)有一下問題,向各位壇友請教:1.1602查忙程序,在下面程序130行中,只要我加入了帶忙檢測的清屏語句,LCD就不顯示,但我串口調(diào)試助手還是能接收到返回值(例如ok_1)。而且在我顯示字符串函數(shù)中(72行)加入忙檢測,LCD也不能正常顯示字符。(本人對查忙函數(shù)存在意義還是不怎么明白,只知道需要查忙來確定LCD是否在寫入數(shù)據(jù),防止數(shù)據(jù)丟失)
2.在我字符串定義中(13-15行),如果我在后面加上感嘆號(如“uchar code error[]="error!";"),則我在串口助手中發(fā)送02之后,1602正常顯示,串口助手正常收到返回值ok_2,但無法之后再次發(fā)送數(shù)據(jù),就像串口中斷沒有再次打開一樣,無論我在串口助手中發(fā)送什么,LCD以及串口助手都得不到返回值。但是,如果我縮短數(shù)組長度(如“uchar code error[]="er!";"),則程序正常運行(據(jù)我測試,兩個字母加一個感嘆號是上限了,像off!就已經(jīng)出現(xiàn)跟error!一樣的問題)。
希望有大神能給我解答,感激不盡。
單片機代碼:
- #include <reg52.h>
- #include <stdio.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define PORT P2
- sbit RS=P3^5; //寄存器選擇位
- sbit RW=P3^6; //讀寫選擇位
- sbit EN=P3^7; //使能位
- sbit LED=P3^4;
- uchar code led_on[]="on";
- uchar code led_off[]="off";
- uchar code error[]="error";
- uchar a,flag_uart,flag_led;
- void delay_us(uchar n) //微秒級別的延時
- {
- while(n--);
- }
-
- void delay_ms(uint x) //延時1ms
- {
- uint i,j;
- for(i=x;i>0;i--)
- for(j=114;j>0;j--);
- }
- void lcd_write_command(uchar command) //寫命令函數(shù)
- {
- RS=0;
- RW=0;
- PORT=command;
- EN=1;
- delay_us(5);
- EN=0;
- }
- void lcd_write_data(uchar dat) //寫數(shù)據(jù)函數(shù)
- {
- RS=1;
- RW=0;
- PORT=dat;
- EN=1;
- delay_us(5);
- EN=0;
- }
- void lcd_check_busy() //查忙函數(shù)
- {
- RS=0;
- RW=1;
- PORT=0xFF; //51IO口拉高,準(zhǔn)備讀狀態(tài)
- EN=1;
- while(PORT & 0x01);
- EN=0;
- }
- void lcd_write_command_busy(uchar command) //帶查忙的寫命令函數(shù)
- {
- lcd_check_busy();
- RS=0;
- RW=0;
- PORT=command;
- EN=1;
- delay_us(5);
- EN=0;
- }
- void lcd_write_str(uchar x,uchar y,uchar *p) //顯示字符串函數(shù)
- {
- if(x==0)
- lcd_write_command_busy(0x80+y); //x=0 第一行顯示
- else
- lcd_write_command_busy(0xC0+y); //x=1 第二行顯示
- while(*p)
- {
-
- lcd_write_data(*p); //顯示字符串
- p++;
- }
- }
- void lcd_init()
- {
- delay_ms(15);
- lcd_write_command(0x38);
- delay_ms(5);
- lcd_write_command(0x38);
- delay_ms(5);
- lcd_write_command(0x38);
- lcd_write_command_busy(0x38);
- lcd_write_command_busy(0x0C); //開顯示,關(guān)光標(biāo),光標(biāo)不顯示
- lcd_write_command_busy(0x01); //清屏
- lcd_write_command_busy(0x06); //地址指針+1,光標(biāo)右移
- }
- void uart_init()
- {
- TMOD = 0x20;
- TH1 = 0xfd;
- TL1 = 0xfd;
- TR1 = 1;
- SCON = 0x50;
- EA = 1;
- ES = 1;
-
- }
- void main()
- {
- uchar *p;
- p="Light:";
- lcd_init();
- uart_init();
- while(1)
- {
- lcd_write_str(0,0,p);
- if(flag_uart==1)
- {
- flag_uart=0;
- ES=0;
- TI=1;
- switch(flag_led)
- {
- case 0:
- LED=0;
- //lcd_write_command_busy(0x01); //清屏
- lcd_write_str(0,0,p);
- lcd_write_str(1,5,led_off);
- printf("ok_0\n");
- break;
- case 1:
- LED=1;
- //lcd_write_command_busy(0x01); //清屏
- lcd_write_str(0,0,p);
- lcd_write_str(1,5,led_on);
- printf("ok_1\n");
- break;
- case 2:
- lcd_write_str(1,5,error);
- printf("ok_2\n");
- break;
- }
- while(!TI);
- TI=0;
- ES=1;
- }
- }
- }
- void ser() interrupt 4
- {
- RI=0;
- a=SBUF;
- flag_uart=1;
- if (a==0)
- flag_led=0;
- else if(a==1)
- flag_led=1;
- else
- flag_led=2;
- }
復(fù)制代碼
|
|