📄 hwdevice111.c
字号:
stepvalue = (unsigned char)divider;
*(volatile unsigned char *)((unsigned char *)NIPR + 1) = stepvalue;
return 1;
}
else if(divider >= 32.0f)
{ //step: 1/8; tap selection(bit 10,9,8): 100
*(volatile unsigned short *)NIPR |= 0x0400;
*(volatile unsigned short *)NIPR &= ~0x0300;
divider -= 32.0f;
divider *= 8.0f;
divider += 0.5f;
stepvalue = (unsigned char)divider;
*(volatile unsigned char *)((unsigned char *)NIPR + 1) = stepvalue;
return 1;
}
else if(divider >= 16.0f)
{ //step: 1/16; tap selection(bit 10,9,8): 011
*(volatile unsigned short *)NIPR |= 0x0300;
*(volatile unsigned short *)NIPR &= ~0x0400;
divider -= 16.0f;
divider *= 16.0f;
divider += 0.5f;
stepvalue = (unsigned char)divider;
*(volatile unsigned char *)((unsigned char *)NIPR + 1) = stepvalue;
return 1;
}
else if(divider >= 8.0f)
{ //step: 1/32; tap selection(bit 10,9,8): 010
*(volatile unsigned short *)NIPR |= 0x0200;
*(volatile unsigned short *)NIPR &= ~0x0500;
divider -= 8.0f;
divider *= 32.0f;
divider += 0.5f;
stepvalue = (unsigned char)divider;
*(volatile unsigned char *)((unsigned char *)NIPR + 1) = stepvalue;
return 1;
}
else if(divider >= 4.0f)
{ //step: 1/64; tap selection(bit 10,9,8): 001
*(volatile unsigned short *)NIPR |= 0x0100;
*(volatile unsigned short *)NIPR &= ~0x0600;
divider -= 4.0f;
divider *= 64.0f;
divider += 0.5f;
stepvalue = (unsigned char)divider;
*(volatile unsigned char *)((unsigned char *)NIPR + 1) = stepvalue;
return 1;
}
else if(divider >= 2.0f)
{ //step: 1/128; tap selection(bit 10,9,8): 000
*(volatile unsigned short *)NIPR &= ~0x0700;
divider -= 2.0f;
divider *= 128.0f;
divider += 0.5f;
stepvalue = (unsigned char)divider;
*(volatile unsigned char *)((unsigned char *)NIPR + 1) = stepvalue;
return 1;
}
else
return 0;
}
else
{ // use integral prescaler
unsigned char prescalerValue;
*(volatile unsigned short *)NIPR &= ~0x8000;
if(divider <= 4.0f * 65.0f)
{ // divider(bit 10,9,8): 010
*(volatile unsigned short *)UBAUD |= 0x0200;
*(volatile unsigned short *)UBAUD &= ~0x0500;
divider /= 4.0f;
divider += 0.5f;
prescalerValue = (unsigned char) divider;
prescalerValue = 65 - prescalerValue ;
*(volatile unsigned char *)((unsigned char *)UBAUD + 1) = prescalerValue;
return 1;
}
else if(divider <= 8.0f * 65.0f)
{ // divider value(bit 10,9,8): 011
*(volatile unsigned short *)UBAUD |= 0x0300;
*(volatile unsigned short *)UBAUD &= ~0x0400;
divider /= 8.0f;
divider += 0.5f;
prescalerValue = (unsigned char) divider;
prescalerValue = 65 - prescalerValue ;
*(volatile unsigned char *)((unsigned char *)UBAUD + 1) = prescalerValue;
return 1;
}
else if(divider <= 16.0f * 65.0f)
{ // divider value(bit 10,9,8): 100
*(volatile unsigned short *)UBAUD |= 0x0400;
*(volatile unsigned short *)UBAUD &= ~0x0300;
divider /= 16.0f;
divider += 0.5f;
prescalerValue = (unsigned char) divider;
prescalerValue = 65 - prescalerValue ;
*(volatile unsigned char *)((unsigned char *)UBAUD + 1) = prescalerValue;
return 1;
}
else if(divider <= 32.0f * 65.0f)
{ // divider value(bit 10,9,8): 101
*(volatile unsigned short *)UBAUD |= 0x0500;
*(volatile unsigned short *)UBAUD &= ~0x0200;
divider /= 32.0f;
divider += 0.5f;
prescalerValue = (unsigned char) divider;
prescalerValue = 65 - prescalerValue ;
*(volatile unsigned char *)((unsigned char *)UBAUD + 1) = prescalerValue;
return 1;
}
else if(divider <= 64.0f * 65.0f)
{ // divider value(bit 10,9,8): 110
*(volatile unsigned short *)UBAUD |= 0x0600;
*(volatile unsigned short *)UBAUD &= ~0x0100;
divider /= 64.0f;
divider += 0.5f;
prescalerValue = (unsigned char) divider;
prescalerValue = 65 - prescalerValue ;
*(volatile unsigned char *)((unsigned char *)UBAUD + 1) = prescalerValue;
return 1;
}
else if(divider <= 128.0f * 65.0f)
{ // divider value(bit 10,9,8): 111
*(volatile unsigned short *)UBAUD |= 0x0700;
divider /= 128.0f;
divider += 0.5f;
prescalerValue = (unsigned char) divider;
prescalerValue = 65 - prescalerValue ;
*(volatile unsigned char *)((unsigned char *)UBAUD + 1) = prescalerValue;
return 1;
}
else
return 0;
}
}
/*****************************************************************************************
名 称:unsigned long GetTotalSecond(void)
功 能:将系统的时间换算成总秒数
参 数:无
返回值:系统当前的总秒数:=3600*24*day+3600*hour+60*minute+second
******************************************************************************************/
unsigned long GetTotalSecond(void)
{
#if __TURBOC__
static unsigned long time = 0;
time++;
return time;
#else
unsigned long time,tmp;
tmp = *RTCTIME;
time = ( ((tmp & 0x1f000000)>>24)*3600 );
time += ( ((tmp & 0x003f0000)>>16)*60 );
time += (tmp & 0x0000003f);
return time;
#endif
}
/*****************************************************************************************
名 称:void SetTxdHigh(void)
功 能:将TXD脚置为输出高电平
参 数:无
******************************************************************************************/
void SetTxdHigh(void)
{
#if __TURBOC__
return;
#else
*(volatile unsigned char *)PEDATA|= 0x20; //PE5(TXD) output high;
*(volatile unsigned char *)PEDIR |= 0x20; //PE5(TXD) as output;
*(volatile unsigned char *)PESEL |= 0x20; //PE5(TXD) as I/O
#endif
}
/*****************************************************************************************
名 称:void SetTxdLow(void)
功 能:将TXD脚置为输出低电平
参 数:无
******************************************************************************************/
void SetTxdLow(void)
{
#if __TURBOC__
return;
#else
*(volatile unsigned char *)PEDATA&=~0x20; //PE5(TXD) output low;
*(volatile unsigned char *)PEDIR |= 0x20; //PE5(TXD) as output;
*(volatile unsigned char *)PESEL |= 0x20; //PE5(TXD) as I/O
#endif
}
/*****************************************************************************************
名 称:void SetCtsHigh(void)
功 能:将CTS脚置为输出高电平
参 数:无
******************************************************************************************/
void SetCtsHigh(void)
{
#if __TURBOC__
return;
#else
*(volatile unsigned char *)PEDATA|= 0x80; //PE7(CTS) output high;
*(volatile unsigned char *)PEDIR |= 0x80; //PE7(CTS) as output;
*(volatile unsigned char *)PESEL |= 0x80; //PE7(CTS) as I/O
#endif
}
/*****************************************************************************************
名 称:void SetCtsLow(void)
功 能:将CTS脚置为输出低电平
参 数:无
******************************************************************************************/
void SetCtsLow(void)
{
#if __TURBOC__
return;
#else
*(volatile unsigned char *)PEDATA&=~0x80; //PE7(CTS) output low;
*(volatile unsigned char *)PEDIR |= 0x80; //PE7(CTS) as output;
*(volatile unsigned char *)PESEL |= 0x80; //PE7(CTS) as I/O
#endif
}
/*****************************************************************************************
名 称:void SetRtsHigh(void)
功 能:将RTS脚置为输出高电平
参 数:无
******************************************************************************************/
void SetRtsHigh(void)
{
#if __TURBOC__
return;
#else
*(volatile unsigned char *)PEDATA|= 0x40; //PE6(RTS) output high;
*(volatile unsigned char *)PEDIR |= 0x40; //PE6(RTS) as output;
*(volatile unsigned char *)PESEL |= 0x40; //PE6(RTS) as I/O
#endif
}
/*****************************************************************************************
名 称:void SetRtsLow(void)
功 能:将RTS脚置为输出低电平
参 数:无
******************************************************************************************/
void SetRtsLow(void)
{
#if __TURBOC__
return;
#else
*(volatile unsigned char *)PEDATA&=~0x40; //PE6(RTS) output low;
*(volatile unsigned char *)PEDIR |= 0x40; //PE6(RTS) as output;
*(volatile unsigned char *)PESEL |= 0x40; //PE6(RTS) as I/O
#endif
}
/*****************************************************************************************
名 称:void SetCsd1High(void)
功 能:将CSD1脚置为输出高电平
参 数:无
******************************************************************************************/
void SetCsd1High(void)
{
#if __TURBOC__
return;
#else
*(volatile unsigned char *)PBDATA|= 0x20; //PB5(CSD1) output high;
*(volatile unsigned char *)PBDIR |= 0x20; //PB5(CSD1) as output;
*(volatile unsigned char *)PBSEL |= 0x20; //PB5(CSD1) as I/O
#endif
}
/*****************************************************************************************
名 称:void SetCsd1Low(void)
功 能:将CSD1脚置为输出低电平
参 数:无
******************************************************************************************/
void SetCsd1Low(void)
{
#if __TURBOC__
return;
#else
*(volatile unsigned char *)PBDATA&=~0x20; //PB5(CSD1) output low;
*(volatile unsigned char *)PBDIR |= 0x20; //PB5(CSD1) as output;
*(volatile unsigned char *)PBSEL |= 0x20; //PB5(CSD1) as I/O
#endif
}
/*****************************************************************************************
名 称:void SetBootsHigh(void)
功 能:将BOOTS脚置为输出高电平
参 数:无
******************************************************************************************/
void SetBootsHigh(void)
{
#if __TURBOC__
return;
#else
*(volatile unsigned char *)PGDATA|= 0x20; //PG5(BOOTS) output high;
*(volatile unsigned char *)PGDIR |= 0x20; //PG5(BOOTS) as output;
*(volatile unsigned char *)PGSEL |= 0x20; //PG5(BOOTS) as I/O
#endif
}
/*****************************************************************************************
名 称:void SetBootsLow(void)
功 能:将BOOTS脚置为输出低电平
参 数:无
******************************************************************************************/
void SetBootsLow(void)
{
#if __TURBOC__
return;
#else
*(volatile unsigned char *)PGDATA&=~0x20; //PG5(BOOTS) output low;
*(volatile unsigned char *)PGDIR |= 0x20; //PG5(BOOTS) as output;
*(volatile unsigned char *)PGSEL |= 0x20; //PG5(BOOTS) as I/O
#endif
}
/*****************************************************************************************
名 称:void SetPg2High(void)
功 能:将PG2脚置为输出高电平
参 数:无
******************************************************************************************/
void SetPg2High(void)
{
#if __TURBOC__
return;
#else
*(volatile unsigned char *)PGDATA|= 0x04; //PG2 output high;
*(volatile unsigned char *)PGDIR |= 0x04; //PG2 as output;
*(volatile unsigned char *)PGSEL |= 0x04; //PG2 as I/O
#endif
}
/*****************************************************************************************
名 称:void SetPg2Low(void)
功 能:将PG2脚置为输出低电平
参 数:无
******************************************************************************************/
void SetPg2Low(void)
{
#if __TURBOC__
return;
#else
*(volatile unsigned char *)PGDATA&=~0x04; //PG2 output low;
*(volatile unsigned char *)PGDIR |= 0x04; //PG2 as output;
*(volatile unsigned char *)PGSEL |= 0x04; //PG2 as I/O
#endif
}
/*****************************************************************************************
名 称:void SetCommToInputPin(void)
功 能:将COMM脚设为通用IO的输入脚
参 数:无
******************************************************************************************/
void SetCommToInputPin(void)
{
#if __TURBOC__
return;
#else
*(volatile unsigned char *)PDSEL |= 0x04; //PD2(COMM) as I/O
*(volatile unsigned char *)PDPUEN|= 0x04; //PD2(COMM) Pullup enable
*(volatile unsigned char *)PDDIR &= ~0x04; //PD2(COMM) as input;
#endif
}
/*****************************************************************************************
名 称:void SetRxdHigh(void)
功 能:将RXD脚设为通用IO的输出脚,且输出高电平
参 数:无
******************************************************************************************/
void SetRxdHigh(void)
{
#if __TURBOC__
return;
#else
*(volatile unsigned char *)PEDATA|= 0x10; //PE4(RXD) output high
*(volatile unsigned char *)PEPUEN|= 0x10; //PE4(RXD) Pullup enable
*(volatile unsigned char *)PEDIR |= 0x10; //PE4(RXD) as output;
*(volatile unsigned char *)PESEL |= 0x10; //PE4(RXD) as I/O
#endif
}
/*****************************************************************************************
名 称:void SetRxdLow(void)
功 能:将RXD脚设为通用IO的输出脚,且输出低电平
参 数:无
******************************************************************************************/
void SetRxdLow(void)
{
#if __TURBOC__
return;
#else
*(volatile unsigned char *)PEDATA&= ~0x10; //PE4(RXD)output low
*(volatile unsigned char *)PEPUEN|= 0x10; //PE4(RXD) Pullup enable
*(volatile unsigned char *)PEDIR |= 0x10; //PE4(RXD) as output;
*(volatile unsigned char *)PESEL |= 0x10; //PE4(RXD) as I/O
#endif
}
/*****************************************************************************************
名 称:void SetRxdToInputPin(void)
功 能:将RXD脚设为通用IO的输入脚
参 数:无
******************************************************************************************/
void SetRxdToInputPin(void)
{
#if __TURBOC__
return;
#else
*(volatile unsigned char *)PESEL |= 0x10; //PE4(RXD) as I/O
*(volatile unsigned char *)PEPUEN|= 0x10; //PE4(RXD) Pullup enable
*(volatile unsigned char *)PEDIR &= ~0x10; //PE4(RXD) as input;
#endif
}
/*****************************************************************************************
名 称:void SetRxdToRxdPin(void)
功 能:将RXD设为UART的数据接收脚
参 数:无
******************************************************************************************/
void SetRxdToRxdPin(void)
{
#if __TURBOC__
return;
#else
*(volatile unsigned char *)PESEL &= ~0x10; //PE4(RXD) as RXD
#endif
}
/*****************************************************************************************
名 称:unsigned short GetRxdLevel(void)
功 能:使能L_LINE通道
参 数:无
返回值:Rxd的电平为高时返否1,为低则返回0
******************************************************************************************/
unsigned short GetRxdLevel(void)
{
#if __TURBOC__
return 1;
#else
register unsigned short level;
SetRxdToInputPin();
level = (*(volatile unsigned char *)PEDATA & 0x10);
level >>= 4;
return level;
#endif
}
/*****************************************************************************************
名称:void InitializeUart()
功能:初始化串口,包括TX、RX脚及UART的相应控制寄存器。
参数:无
******************************************************************************************/
void InitializeUart()
{
#if __TURBOC__
return;
#else
volatile unsigned short tmp;
unsigned char byte;
*(volatile unsigned char *)PESEL &= ~0x30;//PE4(RX),PE5(TX) as TX & RX
*(volatile unsigned short *)USTCNT = 0xE100;
//enable UART, RX , TX; 8 data bits, 1 stop bit, no parit bit, interrupt disable
//*(volatile unsigned short *)NIPR &= ~0x8000; //use integral divider
tmp = *(volatile unsigned short *)URX ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -