請問一下大家,我想通過STC12C5A60S2串口通信像12864液晶屏發送中文字符,卻沒辦法在中文屏中顯示,所以想問問大家到底是哪里除了問題。
代碼如下

- #include<include.h>
- sbit RXD=P3^0;
- sbit TXD=P3^1;
- bit Flage_Receive_Ok,Receive;
- uint idata receive_count;
- uchar xdata uart_buff[205]={0};
- /*****************************************************
- "廣告屏串口命令功能:"
- "help----幫助命令。"
- "ad*:&-----發送廣告詞,“*”為1~5時,寫入緩沖區和EEPROM第“*”條廣告地址;“*”不為1~5時,只寫入緩沖區。“&”為廣告詞。"
- "cmd:1-----查看EEPROM中保存的廣告詞。"
- "cmd:2*----刪除EEPROM中保存的廣告詞。"
- "cmd:3*----選擇需要顯示的廣告詞,“*”為1~5的數字。"
- "cmd:4-----查看當前時間。"
- "cmd:5*----設置當前時間,“*”為時間,格式:2016-1-05-05-05-05-05(2016年周一05月05日05時05分05秒)。"
- "命令格式:*命令$"
- *****************************************************/
- unsigned char code help1 []={"廣告屏串口命令功能:"};
- unsigned char code help2 []={"help------幫助命令。"};
- unsigned char code help3 []={"ad*:&-----發送廣告詞,“*”為1-5時,寫入緩沖區和EEPROM第“*”條廣告詞地址;“*”不為1-5時,只寫入緩沖區。“&”為廣告詞。"};
- unsigned char code help4 []={"cmd:1-----查看EEPROM中保存的廣告詞。返回格式:序號(EEPROM廣告詞序號):數據"};
- unsigned char code help5 []={"cmd:2*----刪除EEPROM中保存的廣告詞。"};
- unsigned char code help6 []={"cmd:3*----選擇需要顯示的廣告詞,“*”為1~5的數字。"};
- unsigned char code help7 []={"cmd:4-----查看當前時間。"};
- unsigned char code help8 []={"cmd:5*----設置當前時間,“*”為時間,格式:2016-01-05-05-05-05-05(2016年周一05月05日05時05分05秒)。"};
- unsigned char code help9 []={"命令格式:*命令$"};
- /*****************************************************
- 不同命令下的串口提示信息
- *****************************************************/
- unsigned char code uart_save_ad []={"寫入廣告詞成功!"};
- unsigned char code uart_show_ad []={"EEPROM中的廣告詞:"};
- unsigned char code uart_set_ad []={"選擇廣告詞成功!"};
- unsigned char code uart_dele_ad1 []={"EEPROM中無廣告詞可刪!"};
- unsigned char code uart_dele_ad2 []={"刪除廣告詞成功!"};
- unsigned char code uart_show_time []={"當前時間為:"};
- unsigned char code uart_set_time []={"設置時間成功!"};
- /*****************************************************
- 函數名:timer0_uart_init
- 功能:定時器0、串口初始化
- 參數:void
- 返回值:void
- 變量:
- *****************************************************/
- void timer0_uart_init()
- {
- //定時器初始化
- TMOD = 0x21;
- //初始化化定時1ms
- TH0 = 0x0FC;
- TL0 = 0x066;
- //EA = 1;
- ET0 = 1;
- TR0 = 1;
-
- //串口初始化
- //TMOD=0x20;
- TH1=0xfd;
- TL1=0xfd;
- SM0=0;
- SM1=1;
- RI=0;
- TI=0;
- REN=1;
- ES=1;
- TR1=1;
-
- //開總中斷
- EA=1;
- }
- /*****************************************************
- 函數名:send_LF_CR
- 功能:向串口發送回車、換行符
- 參數:void
- 返回值:void
- 變量:
- *****************************************************/
- void send_LF_CR()
- {
- SBUF = 0x0d;
- while(!TI);
- TI=0;
- SBUF = 0x0a;
- while(!TI);
- TI=0;
- }
- /*****************************************************
- 函數名:send_help
- 功能:發送串口命令幫助
- 參數:void
- 返回值:void
- 變量:
- *****************************************************/
- void send_help()
- {
- uint i;
- //發送回車換行
- send_LF_CR();
- //發送help內容
- for(i=0;i<strlen(help1);i++)
- {
- SBUF=help1[i];
- while(!TI);
- TI=0;
- }
- send_LF_CR();
- for(i=0;i<strlen(help2);i++)
- {
- SBUF=help2[i];
- while(!TI);
- TI=0;
- }
- send_LF_CR();
- for(i=0;i<strlen(help3);i++)
- {
- SBUF=help3[i];
- while(!TI);
- TI=0;
- }
- send_LF_CR();
- for(i=0;i<strlen(help4);i++)
- {
- SBUF=help4[i];
- while(!TI);
- TI=0;
- }
- send_LF_CR();
- for(i=0;i<strlen(help5);i++)
- {
- SBUF=help5[i];
- while(!TI);
- TI=0;
- }
- send_LF_CR();
- for(i=0;i<strlen(help6);i++)
- {
- SBUF=help6[i];
- while(!TI);
- TI=0;
- }
- send_LF_CR();
- for(i=0;i<strlen(help7);i++)
- {
- SBUF=help7[i];
- while(!TI);
- TI=0;
- }
- send_LF_CR();
- for(i=0;i<strlen(help8);i++)
- {
- SBUF=help8[i];
- while(!TI);
- TI=0;
- }
- send_LF_CR();
- for(i=0;i<strlen(help9);i++)
- {
- SBUF=help9[i];
- while(!TI);
- TI=0;
- }
- send_LF_CR();
- }
- /*****************************************************
- 函數名:uart_control
- 功能:串口控制函數,執行串口命令
- 參數:void
- 返回值:void
- 變量:
- *****************************************************/
- void uart_control()
- {
- uint i,j;
- if(Flage_Receive_Ok==1)
- {
- ES=0;
- send_LF_CR();
- for(j=0;j<receive_count;j++)
- {
- SBUF=uart_buff[j];
- while(!TI);
- TI=0;
- }
- //接收到的數據為廣告數據
- if((uart_buff[0]=='a')&&(uart_buff[1]=='d')&&(uart_buff[3]==':'))
- {
- input=receive_count-4;
-
- for(i=0;i<input;i++)
- store[i]=uart_buff[i+4];
- begin = 0;
- one_save = 0;
- /****************************************************
- 指定保存地址才進行寫入到EEPROM,否則只存入顯示緩沖區
- uart_buff[2]中的值對應EEPROM的廣告保存地址
- *********uart_buff[2]***********EEPROM地址***********
- 1 3
- 2 6
- 3 9
- 4 12
- 5 15
- *****************************************************/
- if(((uart_buff[2]-'0')>=1)&&((uart_buff[2]-'0')<=5))
- {
- i = uart_buff[2]-'0'-1;
-
- if((i<2)||((i==2)&&(input<=88)))
- {
- for(j=0; j< USING_CHAR_NUM; j++)
- eepromBUF[j] = IapReadByte(IAP_ADDRESS+j);
- if((eepromBUF[0]<5)&&(eepromBUF[IAP_ADDRESS+3+i*3]==0))
- eepromBUF[0] = eepromBUF[0]+1;//廣告詞數加1
- eepromBUF[IAP_ADDRESS+3+i*3] = input;//修改廣告詞長度
-
- for(j=0;j< input; j++)
- eepromBUF[24+i*200+j] = store[j];
-
- IapEraseSector(IAP_ADDRESS);
- //寫入EEPROM
- for(j=0; j< USING_CHAR_NUM; j++)
- IapProgramByte(IAP_ADDRESS+j,eepromBUF[j]);
- }
- else if((i==2)&&(input>88))
- {
- //寫第一個扇區
- for(j=0; j< USING_CHAR_NUM; j++)
- eepromBUF[j] = IapReadByte(IAP_ADDRESS+j);
- if((eepromBUF[0]<5)&&(eepromBUF[IAP_ADDRESS+3+i*3]==0))
- eepromBUF[0] = eepromBUF[0]+1;//廣告詞數加1
- eepromBUF[IAP_ADDRESS+3+i*3] = input;//修改廣告詞長度
-
- for(j=0;j< 88; j++)
- eepromBUF[424+j] = store[j];
-
- IapEraseSector(IAP_ADDRESS);
- //寫入EEPROM
- for(j=0; j< USING_CHAR_NUM; j++)
- IapProgramByte(IAP_ADDRESS+j,eepromBUF[j]);
-
- //寫第二個扇區
- for(j=0; j< USING_CHAR_NUM; j++)
- eepromBUF[j] = IapReadByte(IAP_ADDRESS1+j);
-
- for(j=0;j<(input-88); j++)
- eepromBUF[j] = store[j+88];
-
- IapEraseSector(IAP_ADDRESS1);
-
- //寫入EEPROM
- for(j=0; j< USING_CHAR_NUM; j++)
- IapProgramByte(IAP_ADDRESS1+j,eepromBUF[j]);
- }
- else if(i>2)
- {
- //寫第一個扇區
- for(j=0; j< USING_CHAR_NUM; j++)
- eepromBUF[j] = IapReadByte(IAP_ADDRESS+j);
- if((eepromBUF[0]<5)&&(eepromBUF[IAP_ADDRESS+3+i*3]==0))
- eepromBUF[0] = eepromBUF[0]+1;//廣告詞數加1
- eepromBUF[IAP_ADDRESS+3+i*3] = input;//修改廣告詞長度
-
- IapEraseSector(IAP_ADDRESS);
- //寫入EEPROM
- for(j=0; j< USING_CHAR_NUM; j++)
- IapProgramByte(IAP_ADDRESS+j,eepromBUF[j]);
-
- EepromWriteByte(i*200+24,store,200);
- }
- }
-
- }
- /***************************************************************
- *******************接收到的數據為命令數據***********************
- 命令數據格式:
- uart_buff[0] uart_buff[1] uart_buff[2] uart_buff[3] uart_buff[4] uart_buff[5~]
- 'c' 'm' 'd' ':' '1-5' "數據"
-
- ----------------------------------------------------------------------------------
- "cmd:1-----查看EEPROM中保存的廣告詞。"
- "cmd:2*----刪除EEPROM中保存的廣告詞。"
- "cmd:3*----選擇需要顯示的廣告詞,“*”為1~5的數字。"
- "cmd:4-----查看當前時間。"
- "cmd:5*----設置當前時間,“*”為時間,格式:2016-1-05-05-05-05-05(2016年周一05月05日05時05分05秒)。"
- ***************************************************************/
- else if((uart_buff[0]=='c')&&(uart_buff[1]=='m')&&(uart_buff[2]=='d')&&(uart_buff[3]==':'))
- {
- //判斷命令號,即uart_buff[4]中的內容
- switch(uart_buff[4])
- {
- case '1': //一號命令,發送廣告數據
- send_LF_CR();
- for(i=0;i<strlen(uart_show_ad);i++)
- {
- SBUF=uart_show_ad[i];
- while(!TI);
- TI=0;
- }
- ad_index.AD_number = IapReadByte(IAP_ADDRESS);
- if((ad_index.AD_number) > 0)
- {
- for(i=0,j=0;i<5;i++)
- {
- if(IapReadByte(IAP_ADDRESS+3+i*3) !=0)
- {
- (ad_index.addr_buff+j)->addr = (IapReadByte(IAP_ADDRESS+1+i*3)<<8) | IapReadByte(IAP_ADDRESS+2+i*3);
- (ad_index.addr_buff+j)->len_addr = IAP_ADDRESS+3+i*3 ;
- (ad_index.addr_buff+j)->len = IapReadByte(IAP_ADDRESS+3+i*3);
- j++;
- }
- }
- send_LF_CR();
- for(i=0;i<ad_index.AD_number;i++)
- {
- SBUF = i+1+'0';
- while(!TI);
- TI=0;
- SBUF = '(';
- while(!TI);
- TI=0;
- SBUF = (((ad_index.addr_buff+i)->len_addr)/3)+'0';
- while(!TI);
- TI=0;
- SBUF = ')';
- while(!TI);
- TI=0;
- SBUF = ':';
- while(!TI);
- TI=0;
- for(j=0;j<((ad_index.addr_buff+i)->len);j++)
- {
- SBUF = IapReadByte(((ad_index.addr_buff+i)->addr)+j);
- while(!TI);
- TI=0;
- }
- send_LF_CR();
- }
- }
- break;
- case '2'://2號命令刪除第uart_buff[5]條廣告詞
- ad_index.AD_number = IapReadByte(IAP_ADDRESS);
- if(ad_index.AD_number > 0)
- {
- for(i=0,j=0;i<5;i++)
- {
- if(IapReadByte(IAP_ADDRESS+3+i*3) !=0)
- {
- (ad_index.addr_buff+j)->addr = (IapReadByte(IAP_ADDRESS+1+i*3)<<8) | IapReadByte(IAP_ADDRESS+2+i*3);
- (ad_index.addr_buff+j)->len_addr = IAP_ADDRESS+3+i*3 ;
- (ad_index.addr_buff+j)->len = IapReadByte(IAP_ADDRESS+3+i*3);
- j++;
- }
- }
-
- for(i=0;i<ad_index.AD_number;i++)
- {
- if(((ad_index.addr_buff+i)->len_addr) == (uart_buff[5]-'0')*3)
- {
- (ad_index.addr_buff+i)->len = 0;
- break;
- }
-
- }
- (ad_index.AD_number)--;
-
- EepromWriteByte((ad_index.addr_buff+i)->len_addr,(uchar *)(&((ad_index.addr_buff+i)->len)),1);//廣告詞長度清零
- EepromWriteByte(IAP_ADDRESS,(uchar *)(&(ad_index.AD_number)),1);//寫入廣告總數
- send_LF_CR();
- for(i=0;i<strlen(uart_dele_ad2);i++)
- {
- SBUF=uart_dele_ad2[i];
- while(!TI);
- TI=0;
- }
- }
- else
- {
- send_LF_CR();
- for(i=0;i<strlen(uart_dele_ad1);i++)
- {
- SBUF=uart_dele_ad1[i];
- while(!TI);
- TI=0;
- }
- }
- break;
- case '3': //3號命令選擇顯示第uart_buff[5]條廣告詞
- for(i=0;i<((ad_index.addr_buff+(uart_buff[5]-'0')-1)->len);i++)
- store[i] = IapReadByte(((ad_index.addr_buff+(uart_buff[5]-'0')-1)->addr)+i);
- input = (ad_index.addr_buff+(uart_buff[5]-'0')-1)->len;
- send_LF_CR();
- for(i=0;i<strlen(uart_set_ad);i++)
- {
- SBUF=uart_set_ad[i];
- while(!TI);
- TI=0;
- }
- end =0;
- begin = 0;
- page = 0;
- AD_delete = 0;
- page_data = 0;
- WriteCommandLCD(0x01,1);
- function = 0;
-
- break;
- case '4': //4號命令查看當前時間
- send_LF_CR();
- for(i=0;i<strlen(uart_show_time);i++)
- {
- SBUF=uart_show_time[i];
- while(!TI);
- TI=0;
- }
- SBUF = 2 +'0';
- while(!TI);
- TI=0;
- SBUF = '0';
- while(!TI);
- TI=0;
- for(i=0;i<7;i++)
- {
- if(i!= 1)
- {
- SBUF = (TIME[6-i]>>4)+'0';
- while(!TI);
- TI=0;
- SBUF = (TIME[6-i]&0x0f)+'0';
- while(!TI);
- TI=0;
- SBUF = TimeType[13-i*2-1];
- while(!TI);
- TI=0;
- SBUF = TimeType[13-i*2];
- while(!TI);
- TI=0;
- }
- else{
- SBUF = TimeType[13-i*2-1];
- while(!TI);
- TI=0;
- SBUF = TimeType[13-i*2];
- while(!TI);
- TI=0;
-
- SBUF = TimeWeekType[(TIME[6-i]-1)*2];
- while(!TI);
- TI=0;
- SBUF = TimeWeekType[(TIME[6-i]-1)*2+1];
- while(!TI);
- TI=0;
- }
- }
- break;
- case '5': //5號命令設置時間,時間數據在uart_buff[5~26],格式:2016-1-05-05-05-05-05
-
- for(i=0;i<7;i++)
- {
- TIME[i] = ((uart_buff[25-i*3]-'0')<<4)+(uart_buff[26-i*3]-'0');
- }
- Ds1302Init();
-
- send_LF_CR();
- for(i=0;i<strlen(uart_set_time);i++)
- {
- SBUF = uart_set_time[i];
- while(!TI);
- TI=0;
- }
-
- break;
- default:
- break;
- }
- }
- else if((uart_buff[0]=='h')&&(uart_buff[1]=='e')&&(uart_buff[2]=='l')&&(uart_buff[3]=='p'))
- {
- send_help();
- }
- //清楚uart_buff[1~4]內容
- for(i=0;i<4;i++)
- uart_buff[i]=0;
- //清楚接收標志位
- receive_count = 0;
- Flage_Receive_Ok = 0;
- ES=1;
- }
- }
復制代碼 |