📄 lowlevel.c
字号:
/******************************************************************************
* 源程序文件名: lowlevel.c *
* 功能: Motorola单片机底层操作模块 *
* 说明: 本文件包含的子模块有:时标,端口,中断,串口0,串口1,模拟串口,ADC0,ADC1, *
* EEPROM *
******************************************************************************/
/* 加载头文件 */
# include "lowlevel.h"
# include "ctrlout.h"
/* 定义时间触发全局变量 */
unsigned char cgwrkTic0, cgwrkTic1, cgwrkTic2, cgwrkTic3;
unsigned char cgwrkSec, cgwrkMin, cgwrkHour;
unsigned char cgflgTic0, cgflgTic1, cgflgTic2, cgflgTic3;
unsigned char cgflgSec, cgflgMin, cgflgHour;
unsigned char cgflgHSec;
/* 定义串口通信全局变量:UART0 */
unsigned char cUART0TxBuf[CMUART0TxBufLenMax];
unsigned char cUART0RxBuf[CMUART0RxBufLenMax];
unsigned char cUART0TxHead, cUART0TxEnd;
unsigned char cUART0RxHead, cUART0RxEnd;
/* 定义串口通信全局变量:UART1 */
unsigned char cUART1TxBuf[CMUART1TxBufLenMax];
unsigned char cUART1RxBuf[CMUART1RxBufLenMax];
unsigned char cUART1TxHead, cUART1TxEnd;
unsigned char cUART1RxHead, cUART1RxEnd;
/* 定义串口通信全局变量:UART2(模拟串口) */
unsigned char cUART2TxBuf[CMUART2TxBufLenMax];
unsigned char cUART2RxBuf[CMUART2RxBufLenMax];
unsigned char cUART2TxHead, cUART2TxEnd;
unsigned char cUART2RxHead, cUART2RxEnd;
/* 定义A/D转换全局变量 */
unsigned short sATDDat[16];
unsigned short *sATD0Dat;
unsigned short *sATD1Dat;
unsigned char cATDDatAvail;
/* 位权定义 */
const unsigned char cBitInd[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
/* 模拟串口相关定义 */
# define UART2BitCycM 8
# define p_uart2IRx PORTB_BIT0
# define p_uart2OTx PORTB_BIT1
typedef union {
unsigned char Flag;
struct {
unsigned char Work :1; // bit 0
unsigned char Done :1; // bit 1
unsigned char :1; // bit 2
unsigned char :1; // bit 3: 定义空位
unsigned char Err4 :1; // bit 4
unsigned char Err5 :1; // bit 5
unsigned char Err6 :1; // bit 6
unsigned char :1; // bit 7
} Bits;
} SoftUARTFlag;
SoftUARTFlag sUART2IFlag;
# define c_uart2IFlag sUART2IFlag.Flag
# define b_uart2IWork sUART2IFlag.Bits.Work
# define b_uart2IFull sUART2IFlag.Bits.Done
# define b_uart2IErrOV sUART2IFlag.Bits.Err4
# define b_uart2IErrFr sUART2IFlag.Bits.Err5
# define b_uart2IError sUART2IFlag.Bits.Err6
SoftUARTFlag sUART2OFlag;
# define c_uart2OFlag sUART2OFlag.Flag
# define b_uart2OWork sUART2OFlag.Bits.Work
# define b_uart2OEmpt sUART2OFlag.Bits.Done
# define b_uart2OError sUART2OFlag.Bits.Err6
typedef union {
unsigned char BufReg;
struct {
unsigned char LBit :1; // bit 0
unsigned char :1; // bit 1
unsigned char :1; // bit 2
unsigned char :1; // bit 3
unsigned char :1; // bit 4
unsigned char :1; // bit 5
unsigned char :1; // bit 6
unsigned char HBit :1; // bit 7
} Bits;
} SoftUARTShiftReg;
unsigned char c_uart2IDatCyc, c_uart2IDatBuf;
unsigned char c_uart2IBitCyc, c_uart2IBitBuf;
SoftUARTShiftReg sUART2IShtReg;
# define c_uart2IShtBuf sUART2IShtReg.BufReg
# define b_uart2IHBit sUART2IShtReg.Bits.HBit
unsigned char c_uart2ODatCyc;
unsigned char c_uart2OBitCyc;
SoftUARTShiftReg sUART2OShtReg;
# define c_uart2OShtBuf sUART2OShtReg.BufReg
# define b_uart2OLBit sUART2OShtReg.Bits.LBit
/* 子函数声明 */
void uart2recvchrontick(void);
void uart2sendchrontick(void);
void uart2OnTick (void);
/******************************************************************************
* 函数原型: void InitTim(void); *
* 功能: 时间触发全局变量的初始化 *
* 说明: 无 *
******************************************************************************/
void InitTim (void)
{
cgwrkTic0 = 0;
cgwrkTic1 = 0;
cgwrkTic2 = 0;
cgwrkTic3 = 0;
cgwrkSec = 0;
cgwrkMin = 0;
cgwrkHour = 0;
cgflgTic0 = 0;
cgflgTic1 = 0;
cgflgTic2 = 0;
cgflgTic3 = 0;
cgflgSec = 0;
cgflgMin = 0;
cgflgHour = 0;
cgflgHSec = 0;
}
/******************************************************************************
* 函数原型: void InitPortInOut(void); *
* 功能: 单片机端口设置 *
* 说明: I,输入;O,输出;-,未使用;.,无该管脚 *
******************************************************************************/
void InitPortInOut (void)
{
DisableInterrupts;
/* Port B */
DDRB = 0xFE; // OOOOOOOI
PUCR_PUPBE = 1; // 内部上拉有效
// PORTB_BIT1是模拟串口的Tx脚,初始状态必须为1!
PORTB = 0x02; // 端口初始化
/* Port M */
DDRM = 0xF0; // OOOO----
PTM = 0xFF; // D4-D7初始状态全灭
/* Port H */
DDRH = 0xF0; // OOOO----
PTH = 0xFF; // D8-D11初始状态全灭
EnableInterrupts;
}
/******************************************************************************
* 函数原型: void InitRealTime(void); *
* 功能: 实时中断初始化 *
* 说明: Motorola单片机的实时中断相当于51单片机的自动重装功能 *
******************************************************************************/
void InitRealTime (void)
{
CRGINT = 0x00; // CRG中断使能寄存器
CRGINT_RTIE = 1; // 实时中断使能
RTICTL = 0x10|0x00; // 实时中断发生的频率为16000000/1024Hz
CRGFLG_RTIF = 0; // 无效指令
}
/* 实时中断服务子程序 */
interrupt 7 void RealTime_ISF (void)
{
// 19200Hz,约52us
cgflgTic0 = 1;
cgwrkTic0 ++;
uart2OnTick();
uart2recvchrontick();
uart2sendchrontick();
if(cgwrkTic0 < CMModTic0)
goto RTI_ret;
cgwrkTic0 = 0;
// 1200Hz
cgflgTic1 = 1;
cgwrkTic1 ++;
if(cgwrkTic1 < CMModTic1)
goto RTI_ret;
cgwrkTic1 = 0;
// 10ms
cgflgTic2 = 1;
cgwrkTic2 ++;
if(cgwrkTic2 < CMModTic2)
goto RTI_ret;
cgwrkTic2 = 0;
// 100ms
if(cgwrkTic3 == 0 || cgwrkTic3 == CMModTic3/2)
{
cgflgHSec = 1;
if(cgflgD4Flash)
LED_D4 = ~LED_D4;
if(cgflgD5Flash)
LED_D5 = ~LED_D5;
if(cgflgD6Flash)
LED_D6 = ~LED_D6;
if(cgflgD7Flash)
LED_D7 = ~LED_D7;
if(cgflgD10Flash)
LED_D10 = ~LED_D10;
if(cgflgD11Flash)
LED_D11 = ~LED_D11;
portOUT_D4();
portOUT_D5();
portOUT_D6();
portOUT_D7();
portOUT_D10();
portOUT_D11();
}
cgflgTic3 = 1;
cgwrkTic3 ++;
if(cgwrkTic3 < CMModTic3)
goto RTI_ret;
cgwrkTic3 = 0;
// 1s
cgflgSec = 1;
cgwrkSec ++;
if(cgwrkSec < CMModSec)
goto RTI_ret;
cgwrkSec = 0;
// 1min
cgflgMin = 1;
cgwrkMin ++;
if(cgwrkMin < CMModMin)
goto RTI_ret;
cgwrkMin = 0;
// 1hour
cgflgHour = 1;
cgwrkHour ++;
if(cgwrkHour < CMModHour)
goto RTI_ret;
cgwrkHour = 0;
RTI_ret:
CRGFLG_RTIF = 1; // 清除中断标志!
}
/******************************************************************************
* 函数原型: void InitUART0(void); *
* 功能: SCI0初始化 *
* 说明: SCI module clock = bus clock = osc clock / 2 *
******************************************************************************/
void InitUART0 (void)
{
SCI0BD = (unsigned short)(CMSysClock/2L/16L/BPSUART0L);
// 设置SCI0的通信波特率
SCI0CR1 = 0x00; // SCI0控制寄存器1
SCI0CR2 = 0x00; // SCI0控制寄存器2
SCI0CR2_SCTIE = 0; // 禁止发送数据寄存器空标志(TDRE)发出中
// 断请求
SCI0CR2_RIE = 1; // 允许接收数据寄存器满标志(RDRF)或溢出
// 标志(OR)发出中断请求
SCI0CR2_RE = 1; // SCI0接收使能
SCI0CR2_TE = 1; // SCI0发送使能
cUART0TxHead = 0;
cUART0TxEnd = 0;
cUART0RxHead = 0;
cUART0RxEnd = 0;
}
/* SCI0中断服务子程序 */
interrupt 20 void UART0_ISF (void)
{
char stat;
stat = SCI0SR1; // SCI0状态寄存器1
/* 接收数据寄存器满处理模块 */
// if(RDRF == 1)
if(stat & SCI0SR1_RDRF_MASK) // 如果接收数据寄存器满
{
cUART0RxBuf[cUART0RxEnd] = SCI0DRL; // SCI0低位数据寄存器
cUART0RxEnd ++;
if(cUART0RxEnd >= CMUART0RxBufLenMax)
cUART0RxEnd = 0;
if(cUART0RxEnd == cUART0RxHead)
cUART0RxHead ++;
if(cUART0RxHead >= CMUART0RxBufLenMax)
cUART0RxHead = 0;
}
/* 发送数据寄存器空处理模块 */
// if(TDRE == 1)
if(stat & SCI0SR1_TDRE_MASK) // 如果发送数据寄存器空
{
if(cUART0TxHead == cUART0TxEnd) // 如果发送缓冲区中的数据发送完毕
{
SCI0CR2_SCTIE = 0; // 禁止发送数据寄存器空中断
goto tx0_ret;
}
SCI0DRL = cUART0TxBuf[cUART0TxHead];
cUART0TxHead ++;
if(cUART0TxHead >= CMUART0TxBufLenMax)
cUART0TxHead = 0;
tx0_ret:
;
}
}
/******************************************************************************
* 函数原型: void InitUART1(void); *
* 功能: SCI1初始化 *
* 说明: SCI module clock = bus clock = osc clock / 2 *
******************************************************************************/
void InitUART1 (void)
{
SCI1BD = (unsigned short)(CMSysClock/2L/16L/BPSUART1L);
// 设置SCI1的通信波特率
SCI1CR1 = 0x00; // SCI1控制寄存器1
SCI1CR2 = 0x00; // SCI1控制寄存器2
SCI1CR2_SCTIE = 0; // 禁止发送数据寄存器空标志(TDRE)发出中
// 断请求
SCI1CR2_RIE = 1; // 允许接收数据寄存器满标志(RDRF)或溢出
// 标志(OR)发出中断请求
SCI1CR2_RE = 1; // SCI1接收使能
SCI1CR2_TE = 1; // SCI1发送使能
cUART1TxHead = 0;
cUART1TxEnd = 0;
cUART1RxHead = 0;
cUART1RxEnd = 0;
}
/* SCI1中断服务子程序 */
interrupt 21 void UART1_ISF (void)
{
char stat;
stat = SCI1SR1; // SCI1状态寄存器1
/* 接收数据寄存器满处理模块 */
// if(RDRF == 1)
if(stat & SCI1SR1_RDRF_MASK) // 如果接收数据寄存器满
{
cUART1RxBuf[cUART1RxEnd] = SCI1DRL; // SCI1低位数据寄存器
cUART1RxEnd ++;
if(cUART1RxEnd >= CMUART1RxBufLenMax)
cUART1RxEnd = 0;
if(cUART1RxEnd == cUART1RxHead)
cUART1RxHead ++;
if(cUART1RxHead >= CMUART1RxBufLenMax)
cUART1RxHead = 0;
}
/* 发送数据寄存器空处理模块 */
// if(TDRE == 1)
if(stat & SCI1SR1_TDRE_MASK) // 如果发送数据寄存器空
{
if(cUART1TxHead == cUART1TxEnd) // 如果发送缓冲区中的数据发送完毕
{
SCI1CR2_SCTIE = 0; // 禁止发送数据寄存器空中断
goto tx1_ret;
}
SCI1DRL = cUART1TxBuf[cUART1TxHead];
cUART1TxHead ++;
if(cUART1TxHead >= CMUART1TxBufLenMax)
cUART1TxHead = 0;
tx1_ret:
;
}
}
/******************************************************************************
* 函数原型: void InitATD(void); *
* 功能: ATD模块初始化 *
* 说明: 无 *
******************************************************************************/
void InitATD (void)
{
sATD0Dat = sATDDat+0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -