本帖最后由 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;
}
}
|