📄 demo_int.c
字号:
//********************************************************************
//Website: http://wch.cn
//Email: tech@wch.cn
//Author: W.ch 2007.6
//*******************************************************************
/* CH432Q和CH432T芯片 应用层 V1.0 */
/* 查询方式的全双工通讯,MODEM信号、自动硬件流控制,串口操作示例程序 */
#include <reg52.h>
#include <stdio.h>
#include <string.h>
#include <absacc.h>
#pragma NOAREGS
#include "BASE.C"
/* CH432与单片机的硬件接口层,以下连接方式任选一种 */
//#include "PARA.C" /* 硬件标准8位并口方式子程序, CH432Q */
// #include "SPI_HW.C" /* 硬件标准4线SPI串口方式,CH432Q&CH432T */
#include "SPI_SW.C" /* 软件I/O模拟4线SPI串口方式, CH432Q&CH432T */
#include "SPI.C" /* 接口子程序 */
#define CH432_BPS 19200 /* 定义CH432串口0通讯波特率 */
#define CH432_BPS1 57600 /* 定义CH432串口1通讯波特率 */
#define Fpclk 1843200 /* 定义内部时钟频率 */
#define CH432_INT_WIRE INT1
// #define CH432_INT0_WIRE INT1
// #define CH432_INT1_WIRE INT1
UINT8 SEND_STRING[ ] = { "444444555566666777788889999000009999995555555hello" };
UINT8 SEND_STRING1[ ] = { "33333333wwwwww" };
UINT8 idata buf[ 100 ]; /* 缓冲区保存数据 */
UINT8 xdata rcvbuf[ 64 ]; /* 缓冲区保存数据 */
void InitCH432( void ) /* 初始化CH432 */
{
UINT16 div;
UINT8 DLL, DLM;
/**************************************************************************
设置CH432串口0的寄存器
**************************************************************************/
div = ( Fpclk >> 4 ) / CH432_BPS;
DLM = div >> 8;
DLL = div & 0xff;
WriteCH432Data( CH432_LCR_PORT, BIT_LCR_DLAB ); /* 设置DLAB为1 */
WriteCH432Data( CH432_DLL_PORT, DLL ); /* 设置波特率 */
WriteCH432Data( CH432_DLM_PORT, DLM );
WriteCH432Data( CH432_FCR_PORT, BIT_FCR_RECVTG1 | BIT_FCR_RECVTG0 | BIT_FCR_FIFOEN ); /* 设置FIFO模式,触发点为14 */
WriteCH432Data( CH432_LCR_PORT, BIT_LCR_WORDSZ1
| BIT_LCR_WORDSZ0 ); /* 字长8位,1位停止位、无校验 */
WriteCH432Data( CH432_IER_PORT, BIT_IER_IEMODEM | BIT_IER_IELINES | BIT_IER_IETHRE | BIT_IER_IERECV ); /* 使能中断 */
WriteCH432Data( CH432_MCR_PORT, BIT_MCR_OUT2 | BIT_MCR_RTS | BIT_MCR_DTR ); /* 允许中断输出,DTR,RTS为1 */
/**************************************************************************
设置CH432串口1的寄存器
**************************************************************************/
div = ( Fpclk >> 4 ) / CH432_BPS1;
DLM = div >> 8;
DLL = div & 0xff;
WriteCH432Data( CH432_LCR1_PORT, BIT_LCR_DLAB ); /* 设置DLAB为1 */
WriteCH432Data( CH432_DLL1_PORT, DLL ); /* 设置波特率 */
WriteCH432Data( CH432_DLM1_PORT, DLM );
WriteCH432Data( CH432_FCR1_PORT, BIT_FCR_RECVTG1 | BIT_FCR_RECVTG0 | BIT_FCR_FIFOEN ); /* 设置FIFO模式,触发点为14 */
WriteCH432Data( CH432_LCR1_PORT, BIT_LCR_PAREN
| BIT_LCR_WORDSZ1
| BIT_LCR_WORDSZ0 ); /* 字长8位,1位停止位、奇校验 */
WriteCH432Data( CH432_IER1_PORT, BIT_IER_IEMODEM | BIT_IER_IELINES | BIT_IER_IETHRE | BIT_IER_IERECV ); /* 使能中断 */
WriteCH432Data( CH432_MCR1_PORT, BIT_MCR_OUT2 | BIT_MCR_RTS | BIT_MCR_DTR ); /* 允许中断输出,DTR,RTS为1 */
}
void UART0_SendByte( UINT8 dat ) /* CH432串口0发送一字节子程序 */
{
while( ( ReadCH432Data( CH432_LSR_PORT ) & BIT_LSR_THRE ) == 0 ); /* 等待数据发送完毕 */
WriteCH432Data( CH432_THR_PORT, dat );
}
UINT8 UART0_RcvByte() /* CH432串口0接收一字节子程序 */
{
UINT8 Rcvdat;
if( !( ReadCH432Data( CH432_LSR_PORT ) & ( BIT_LSR_BREAKINT | BIT_LSR_FRAMEERR | BIT_LSR_PARERR | BIT_LSR_OVERR ) ) ) /* b1-b4无错误 */
{
while( ( ReadCH432Data( CH432_LSR_PORT ) & BIT_LSR_DATARDY ) == 0 ); /* 等待数据准备好 */
Rcvdat = ReadCH432Data( CH432_RBR_PORT ); /* 从接收缓冲寄存器读出数据 */
return( Rcvdat );
}
else ReadCH432Data( CH432_RBR_PORT ); /* 有错误清除 */
}
void UART0_SendStr( UINT8 *str ) /* CH432串口0发送一字符串子程序 */
{
while( 1 )
{
if( *str == '\0' ) break;
UART0_SendByte( *str++ );
}
}
void UART1_SendByte( UINT8 dat ) /* CH432串口1发送一字节子程序 */
{
while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_THRE ) == 0 ); /* 等待数据发送完毕 */
WriteCH432Data( CH432_THR1_PORT, dat );
}
UINT8 UART1_RcvByte() /* CH432串口1接收一字节子程序 */
{
UINT8 Rcvdat;
if( !( ReadCH432Data( CH432_LSR1_PORT ) & (BIT_LSR_BREAKINT | BIT_LSR_FRAMEERR | BIT_LSR_PARERR | BIT_LSR_OVERR ) ) ) /* b1-b4无错误 */
{
while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_DATARDY ) == 0 ); /* 等待数据准备好 */
Rcvdat = ReadCH432Data( CH432_RBR1_PORT ); /* 从接收缓冲寄存器读出数据 */
return( Rcvdat );
}
else ReadCH432Data( CH432_RBR1_PORT ); /* b1-b4有错误清除 */
}
void UART1_SendStr( UINT8 *str ) /* CH432串口1发送一字符串子程序 */
{
while(1)
{
if( *str == '\0' ) break;
UART1_SendByte( *str++ );
}
}
void CH432Seril0Send( UINT8 *Data, UINT8 Num ) /* 禁用FIFO,CH432串口0发送多字节子程序 */
{
do
{
while( ( ReadCH432Data( CH432_LSR_PORT ) & BIT_LSR_THRE ) == 0 ); /* 等待数据发送完毕 */
WriteCH432Data( CH432_THR_PORT, *Data++ );
}
while( --Num );
}
void CH432Seril1Send( UINT8 *Data, UINT8 Num ) /* 禁用FIFO,CH432串口1发送多字节子程序 */
{
do
{
while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_THRE ) == 0 ); /* 等待数据发送完毕 */
WriteCH432Data( CH432_THR1_PORT, *Data++ );
}
while( --Num );
}
UINT8 CH432Seril0Rcv( UINT8 *buf ) /* 禁用FIFO,CH432串口0接收多字节子程序 */
{
UINT8 RcvNum = 0;
if( !( ReadCH432Data( CH432_LSR_PORT ) & ( BIT_LSR_BREAKINT | BIT_LSR_FRAMEERR | BIT_LSR_PARERR | BIT_LSR_OVERR ) ) ) /* b1-b4无错误 */
{
while( ( ReadCH432Data( CH432_LSR_PORT ) & BIT_LSR_DATARDY ) == 0 ); /* 等待数据准备好 */
do
{
*buf++ = ReadCH432Data( CH432_RBR_PORT ); /* 从接收缓冲寄存器读出数据 */
RcvNum++;
}
while( ( ReadCH432Data( CH432_LSR_PORT ) & BIT_LSR_DATARDY ) == 0x01 );
}
else ReadCH432Data( CH432_RBR_PORT );
return( RcvNum );
}
UINT8 CH432Seril1Rcv( UINT8 *buf ) /* 禁用FIFO,CH432串口1接收多字节子程序*/
{
UINT8 RcvNum = 0;
if( !( ReadCH432Data( CH432_LSR1_PORT ) & ( BIT_LSR_BREAKINT | BIT_LSR_FRAMEERR | BIT_LSR_PARERR | BIT_LSR_OVERR ) ) ) /* b1-b4无错误 */
{
while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_DATARDY ) == 0 ); /* 等待数据准备好 */
do
{
*buf++ = ReadCH432Data( CH432_RBR1_PORT ); /* 从接收缓冲寄存器读出数据 */
RcvNum++;
}
while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_DATARDY ) == 0x01 );
}
else ReadCH432Data( CH432_RBR1_PORT );
return( RcvNum );
}
void CH432UART0Send( UINT8 *Data, UINT8 Num ) /* 启用FIFO,一次最多16字节,CH432串口0发送多字节子程序 */
{
while( 1 )
{
while( ( ReadCH432Data( CH432_LSR_PORT ) & BIT_LSR_TEMT ) == 0 ); /* 等待数据发送完毕,THR,TSR全空 */
if( Num <= 16 )
{
WriteCH432Block( CH432_THR_PORT, Num, Data );
break;
}
else
{
WriteCH432Block( CH432_THR_PORT, 16, Data );
Num -= 16;
Data += 16;
}
}
}
void CH432UART1Send( UINT8 *Data, UINT8 Num ) /* 启用FIFO,一次最多16字节,CH432串口1发送多字节子程序 */
{
while( 1 )
{
while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_TEMT ) == 0 ); /* 等待数据发送完毕,THR,TSR全空 */
if( Num <= 16 )
{
WriteCH432Block( CH432_THR1_PORT, Num, Data );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -