标题:
请问各位我用STC12C5A60S2芯片无法进行串口通信
[打印本页]
作者:
uilis
时间:
2017-5-14 23:58
标题:
请问各位我用STC12C5A60S2芯片无法进行串口通信
请问一下大家,我想通过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;
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1