本帖最后由 happy2058 于 2021-9-13 18:23 编辑
芯片是8H1K08
工作流程序,屏幕通串口1发送数据给控制板、控制板返回要显示数据给屏幕。再通过串口2发送操作数据给功能板2.
在没加入串口2部分代码前,屏幕与控制板操作通信已经调试完成。加入串口2后,造成中断冲突,卡死
之前在贴子里找问了,说可以串口1和串口2共用定时器2.
以下是部份程序
#define FOSC 11059200UL
#define BRT (65536 - FOSC / 115200 / 4) //1T
sfr AUXR = 0x8e;
sfr S2CON = 0x9a;
sfr S2BUF = 0x9b;
sfr IE2 = 0xaf;
sfr T2L = 0xD7;
sfr T2H = 0xD6;
uchar buf[16]; /缓存区
uchar rp = 0;
uchar RF_data_intensity[6]={0xEE,0xEF,0xF2,0xAE,0x00,0x0D}; //串口2 要发送的数据
void UartInit()
{
S2CON = 0x50; //串口2
SCON = 0x50; //串口1
AUXR = 0x15; //启动定时器2
T2L = BRT;
T2H = BRT >> 8;
ES = 1; //串口1中断
EA = 1;
//IE2 |=0x01; //串口2中断
}
void send_string( uchar *str, uchar strlen) //串口1发送
{
uchar k= 0 ;
do
{
SBUF = (*(str + k));
k++;
while (TI==0);
TI= 0 ;
}
while (k < strlen);
}
void send_string_uart2( uchar *str, uchar strlen) //串口2发送
{
uchar k= 0 ;
do
{
S2BUF = (*(str + k));
k++;
while (S2CON==0x50);
S2CON &= ~0x02;
}
while (k < strlen);
}
void interrupt_uart() interrupt 4 //串口1中断
{
if (RI)
{
RI = 0 ;
buf[ rp++ ] = SBUF;
if(SBUF==0X3C)
rp=0;
}
}
void facecare_RF_TXD() ////串口2发送函数
{
send_string_uart2(RF_data_intensity,6);
}
void main()
{
P_SW2 |= 0x80;
//CKSEL = 0x00; 内部IRC
CLKDIV =0x02; //2分频
//CLK_DIV &= 0xF8; Ö÷ê±Öó
P1M0 = 0x00; //串口2模式 准双口
P1M1 = 0x9c; //串口2模式 准双口
P3M0 = 0x00;
P3M1 = 0xe0;
Timer0(); //定时器0
UartInit(); /串口启动
while(1)
{
switch(buf[1]) //屏幕下发数据
{
case 0X79:
if( buf[3]==0xb6 && buf[7]==0x3c)
{
memset(buf, 0, 16); //清空缓存
if( RF>=1)
RF--;
facecare_TXD(RF, current_X[3],current_X2[3]); //串口1发送给屏数据
ES = 0; //关串口1中断
IE2 |=0x01; //开串口2中断
facecare_RF_TXD(); //串口2发送给功能板数据
IE2 &=0xF0; //关串口2中断
ES = 1; //开串口1中断
}
if( buf[3]==0xb7 && buf[7]==0x3c)
{
memset(buf, 0, 16); //Çå¿ÕÑ-»μÇø
if( RF<20)
RF++;
facecare_TXD(RF, current_X[3], current_X2[3]);
ES = 0;
IE2 |=0x01;
facecare_RF_TXD();
IE2 &=0xF0;
ES = 1;
}
}
|