📄 demo_int.c
字号:
break;
}
else
{
WriteCH432Block( CH432_THR1_PORT, 16, Data );
Num -= 16;
Data += 16;
}
}
}
void Auto_HandFlow0_Ctrl( ) /* 串口0自动硬件流控制 */
{
WriteCH432Data( CH432_MCR_PORT, BIT_MCR_AFE | BIT_MCR_OUT2 | BIT_MCR_RTS ); /* 设置MCR寄存器的AFE和RTS为1 */
}
void Auto_HandFlow1_Ctrl( ) /* 串口1自动硬件流控制*/
{
WriteCH432Data( CH432_MCR1_PORT, BIT_MCR_AFE | BIT_MCR_OUT2 | BIT_MCR_RTS ); /* 设置MCR1寄存器的AFE和RTS为1 */
}
UINT8 Modem_Ctrl() /* Modem发送接收数据子程序 */
{
UINT8 ModemStatus;
UINT8 s;
UINT8 InterruptStatus;
while( 1 )
{
InterruptStatus = ReadCH432Data( CH432_IIR_PORT ) & ( ~ CH432_IIR_FIFOS_ENABLED );;
if( ( InterruptStatus & 0x01 ) ) continue;
else
{
ModemStatus = ReadCH432Data( CH432_MSR_PORT );
WriteCH432Data( CH432_THR_PORT, ModemStatus );
if ( ModemStatus == 0x30 ) /* Modem信号发送数据变化 */
{
UART0_SendStr( SEND_STRING );
}
else if ( ModemStatus == 0x11 ) /* Modem 信号接收数据变化 */
{
WriteCH432Data( CH432_THR_PORT, 0xAA );
}
else if ( ModemStatus == 0x22 ) /* Modem 信号接收数据变化 */
{
s = ReadCH432Data( CH432_RBR_PORT );
WriteCH432Data( CH432_THR_PORT, s );
}
}
}
return( ModemStatus );
}
void EnableTransEmptyIf( void ) /* 恢复串口发送完成中断,以便强行进入发送完成的中断服务程序 */
{
UINT8 OldIE;
OldIE = ReadCH432Data( CH432_IER_PORT ); /* 原IE */
WriteCH432Data( CH432_IER_PORT, OldIE & (UINT8)~ BIT_IER_IETHRE ); /* 临时关闭发送完成中断 */
WriteCH432Data( CH432_IER_PORT, OldIE ); /* 重新开启发送完成中断 */
}
void mInitSTDIO( ) /* 初始化单片机串口 用于查看寄存器值 */
{
SCON = 0x50;
PCON = 0x80;
TMOD = 0x20;
TH1 = 0xf3; /* 24MHz晶振, 9600bps */
TR1 = 1;
TI = 1;
}
void CH432Interrupt( ) interrupt 2 /* 中断方式处理 */
{
UINT8 InterruptStatus;
UINT8 RcvNum = 0, s;
UINT8 ModemStatus;
InterruptStatus = ReadCH432Data( CH432_IIR_PORT ) & ( ~ CH432_IIR_FIFOS_ENABLED );
if( ( InterruptStatus & 0x01 ) ) /* 没有中断转到串口1 */
{
InterruptStatus = ReadCH432Data( CH432_IIR1_PORT ) & ( ~ CH432_IIR_FIFOS_ENABLED ); /* 读串口1的中断状态 */
if( ( InterruptStatus & 0x01 ) ) return; /* 没有中断退出 */
else
{
switch( InterruptStatus )
{
case INT_NOINT: /* 没有中断 */
break;
case INT_THR_EMPTY: /* 发送保持寄存器空中断 */
UART1_SendStr( SEND_STRING1 );
break;
case INT_RCV_SUCCESS: /* 串口接收可用数据中断 */
RcvNum = CH432Seril1Rcv( buf );
CH432Seril1Send( buf, RcvNum );
break;
case INT_RCV_LINES: /* 接收线路状态中断 */
ReadCH432Data( CH432_LSR1_PORT);
break;
case INT_RCV_OVERTIME: /* 接收数据超时中断 */
RcvNum = CH432Seril1Rcv( buf );
CH432Seril1Send( buf, RcvNum );
break;
default: /* 不可能发生的中断 */
break;
}
}
}
else
{
switch( InterruptStatus )
{
case INT_MODEM_CHANGE:
ModemStatus = ReadCH432Data( CH432_MSR_PORT );
WriteCH432Data( CH432_THR_PORT, ModemStatus );
UART0_SendStr( SEND_STRING1 );
if ( ModemStatus == 0x30 ) /* Modem信号发送数据变化 */
{
UART0_SendStr( SEND_STRING1 );
}
else if ( ModemStatus == 0x11 ) /* Modem 信号接收数据变化 */
{
WriteCH432Data( CH432_THR_PORT, 0xAA );
}
else if ( ModemStatus == 0x22 ) /* Modem 信号接收数据变化 */
{
s = ReadCH432Data( CH432_RBR_PORT );
WriteCH432Data( CH432_THR_PORT, s );
}
break;
case INT_NOINT: /* 没有中断 */
break;
case INT_THR_EMPTY: /* 发送保持寄存器空中断 */
UART0_SendStr( SEND_STRING );
break;
case INT_RCV_SUCCESS: /* 串口接收可用数据中断 */
RcvNum = CH432Seril0Rcv( buf );
UART0_SendByte( RcvNum );
CH432Seril0Send( buf, RcvNum );
break;
case INT_RCV_LINES: /* 接收线路状态中断 */
ReadCH432Data( CH432_LSR_PORT);
break;
case INT_RCV_OVERTIME: /* 接收数据超时中断 */
RcvNum = CH432Seril0Rcv( buf );
UART0_SendByte( RcvNum );
CH432Seril0Send( buf, RcvNum );
break;
default: /* 不可能发生的中断 */
break;
}
}
}
main()
{
UINT8 i, Status;
UINT8 s = 0;
CH432_PORT_INIT();
#if 0
mInitSTDIO( ); /* 测试CH432与单片机硬件正确连接 */
Status = ReadCH432Data( CH432_IER_PORT );
printf( "%02X\n", Status );
Status = ReadCH432Data( CH432_IIR1_PORT );
printf( "%02X\n", Status );
Status = ReadCH432Data( CH432_IIR_PORT );
printf( "%02X\n", Status );
Status = ReadCH432Data( CH432_FCR_PORT );
printf( "%02X\n", Status );
Status = ReadCH432Data( CH432_MCR_PORT );
printf( "%02X\n", Status );
Status = ReadCH432Data( CH432_LSR_PORT );
printf( "%02X\n", Status );
Status = ReadCH432Data( CH432_MSR_PORT );
printf( "%02X\n", Status );
#endif
InitCH432( );
#if 0
UART0_SendByte( 0xAA );
UART1_SendByte( 0xBB );
for( i = 0; i < 50; i++ )
{
buf[ i ] = 0xAA + i;
}
CH432UART0Send( buf, 50 );
CH432UART1Send( buf, 50 );
#endif
#if 0
Auto_HandFlow0_Ctrl( );
Auto_HandFlow1_Ctrl( );
#endif
#if 0
Modem_Ctrl() ;
#endif
#if 0
s = CH432Seril0Rcv( buf );
WriteCH432Data( CH432_THR_PORT, s );
CH432Seril0Send( buf, s );
#endif
IE1=0;
EX1=1;
EA=1;
while( 1 );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -