📄 chiplib.c
字号:
{// powerdown interrupt
EICON &= ~BIT3;
SysIntFlgState |= 0x08000000;
// user coding begin
Int27();
// P1OE = 0;
// P1OD &= ~BIT3;
}
//=======================================================
//函数名:Init_RTC
//函数作用:RTC模块初始化
//入口参数:val_tsfot---RTC时钟源选择:0--32K,1--PLL
// val_sp------休眠唤醒间隔时间选择
//出口参数:无
//备注:RTC工作频率选择由PLLSEL决定:0--50hz,1--60hz
//=======================================================
void CfgRTC(unsigned char val_tsfot,unsigned char val_sp)
{
unsigned char i=0;
/* 复位RTC操作 */
// RTC_PEN = 0x96; //password 1
// RTCPWD = 0x57; //password 2
/* RTC允许写 */
RTC_PEN = 0x96; //password 1
RTCPWD = 0xd7; //password 2
/* RTC时钟初始化 */
if(val_tsfot)
{
i = 0x08;
}
if(CrtlCLK & 0x10)
{
i |= 0x04;
}
RTCSFTO = i;
/* 休眠唤醒间隔时间初始化 */
INT_RTC = val_sp;
/* RTC禁止写 */
RTC_PEN = 0x96; //
RTCPWD = 0xd6;
}
void SetRTCTime(struct RTCTime pRTCTimeSet)
{
unsigned char xdata *point;
point = 0;
// RTCTIME.rYear = pRTCTimeSet.rYear;
// RTCTIME.rMonth = pRTCTimeSet.rMonth;
// RTCTIME.rDate = pRTCTimeSet.rDate;
// RTCTIME.rHour = pRTCTimeSet.rHour;
// RTCTIME.rMinute = pRTCTimeSet.rMinute;
// RTCTIME.rSecond = pRTCTimeSet.rSecond;
// RTCTIME.rWeek = pRTCTimeSet.rWeek;
*(point++) = pRTCTimeSet.rYear;
*(point++) = pRTCTimeSet.rMonth;
*(point++) = pRTCTimeSet.rDate;
*(point++) = pRTCTimeSet.rHour;
*(point++) = pRTCTimeSet.rMinute;
*(point++) = pRTCTimeSet.rSecond;
*(point++) = pRTCTimeSet.rWeek;
InstPara |= bWRTC; // 写准备就绪
}
unsigned char ReadRTCTime(void)
{
unsigned char xdata *point;
point = 0;
if(InstPara & bWRTC)
{
return 0;
}
InstPara |= bRRTC; // 读开始
// RTCTIME.rYear = RTCYC;
// RTCTIME.rMonth = RTCMoC;
// RTCTIME.rDate = RTCDC;
// RTCTIME.rHour = RTCHC;
// RTCTIME.rMinute = RTCMiC;
// RTCTIME.rSecond = RTCSC;
// RTCTIME.rWeek = RTCWC;
*(point++) = RTCYC;
*(point++) = RTCMoC;
*(point++) = RTCDC;
*(point++) = RTCHC;
*(point++) = RTCMiC;
*(point++) = RTCSC;
*(point++) = RTCWC;
if(InstPara & bRRTC)
{
return 1; // 读成功
}
return 0; // 读失败,需要重读
}
void AdjustRTC(unsigned char val_dp,unsigned char val_gph,unsigned char val_gpl)
{
/* RTC允许写 */
RTC_PEN = 0x96; //password 1
RTCPWD = 0xd7; //password 2
/* 写RTC修正寄存器 */
RTCLC = val_dp; // 低频修正
RTCHCH = val_gph; // 高频修正高位
RTCHCL = val_gpl; // 高频修正低位
/* RTC禁止写 */
RTC_PEN = 0x96; //
RTCPWD = 0xd6;
}
/*
函数功能:配置timer参数
入口参数:结构体
备注:定时器号为2-5
*/
void CfgET(struct ETMode ETMODE)
{
unsigned char xdata *point;//
ETMODE.tMode &= 0x0f; // 只关心低4位
point = 0x2820 + (8*(ETMODE.tName-2));// TCONx
point++; // TMODx
*point |= ETMODE.tMode;
point++; // TH0
*point = ETMODE.tDH;
point++; //
point++; // TL0
*point = ETMODE.tDL;
point++; //
point++; // SCONx
point -= 6; // TCONx
if(ETMODE.tClk)
{
*point |= 0x10;
}
// TR0 = 1
*point |= 0x01; //
}
/*
函数功能:串口配置
入口: val_numb---串口号-----------2/3/4/5
val_bps----串口波特率-------1200bps/2400bps/4800bps/9600bps
val_bit----串口方式---------10(bit)/11(bit)
val_parity-奇偶校验位设定---0(even)/非0(odd)
出口: 1----设置成功
0----串口号出错
-1---串口方式出错
-2---波特率出错
注:目前支持串口方式为10位/11位;波特率支持1200bps,2400bps,4800bps,9600bps
*/
char CfgEU(unsigned char val_numb,unsigned int val_bps,unsigned char val_bit,unsigned char val_parity)
{
unsigned char temp1,temp2;
unsigned char xdata *point;//
temp2 = 0;
//==================串口号定位================================
if(val_numb > 5 || val_numb <2)
{
return 0; // 串口号找不到
}
point = 0x2820 + (8*(val_numb-2)); // TCONx
*point &= ~0xa2; // clear T1M & SMOD & TR1
//==================波特率发生器模式设定======================
point++; // TMODx
*point |= 0x20; // 8-bit counter with auto-reload
//==================串口波特率设定============================
switch(val_bps)
{
case 300: temp1 = 0xc7;temp2 = 2;break; // T1M = 0,SMOD = 1;
case 600: temp1 = 0xf2;temp2 = 3;break; // T1M = 0,SMOD = 0;
case 1200: temp1 = 0xab;break; // T1M = 1,SMOD = 0;
case 2400: temp1 = 0xab;temp2 = 1;break; // T1M = 1,SMOD = 1;
case 4800: temp1 = 0xeb;break; // T1M = 1,SMOD = 0;
case 9600: temp1 = 0xeb;temp2 = 1;break; // T1M = 1,SMOD = 1;
// case 11520:
default: return -2;break; // 波特率不支持
}
point += 2; // TH1
*point = temp1;
point += 2; // TL1
*point = temp1;
//==================串口方式设定==============================
point++; // SCONx
if(val_bit == 11)
{
*point = 0xd0; //
InstPara |= bUrMo; // 串口模式有校验位
}
else if(val_bit == 10)
{
*point = 0x50; //
InstPara &= ~bUrMo; // 串口模式无校验位
}
else
{
return -1; // 串口方式不支持
}
//===================奇偶校验位设定============================
if(val_parity)
{
InstPara |= bPari;
}
else
{
InstPara &= ~bPari;
}
//===================波特率加倍设定============================
point -= 6; // TCONx
if(temp2 == 0)
{
*point |= 0x20; // T1M = 1 波特率不加倍
}
else if(temp2 == 1)
{
*point |= 0x20 | 0x80; // T1M = 1 波特率加倍
}
else if(temp2 == 2)
{
*point |= 0x80; // T1M = 0 波特率加倍
}
// if(temp2)
// {
// *point |= 0x80;
// }
//===================开启波特率发生器==========================
*point |= 0x02; // TR1 = 1;
return 1;
}
/*
函数功能:向对应串口发送一个字节数据
入口:val_data:希望发送的数据
val_numb:希望发送的串口号
出口:1----发送成功
0----串口号出错
*/
char SendUData(unsigned char val_data,unsigned char val_numb)
{
unsigned char xdata *point;
unsigned char temp;
if(val_numb > 5 || val_numb <2)
{
return 0; // 串口号找不到
}
temp = 8*(val_numb-2);
point = 0x2826 + temp; // SCONx
// if(InstPara & bUrMo)
// {
// temp = InstPara & bPari;
// temp >>= 3; // InstPara.bit3
// ACC = val_data;
/* if(P)
{
if(temp)
{
*point &= ~0x08; // SCONx.bit3
}
else
{
*point |= 0x08;
}
}
else
{
if(temp)
{
*point |= 0x08;
}
else
{
*point &= ~0x08;
}
}*/
// }
point++;
*point = val_data;
return 1;
}
/*
函数功能:从串口接受一个字节数据
入口:串口号
出口:低8位为受到数据
高8位中0x01表示校验错误,0x02表示串口号出错
*/
int RecvUData(unsigned char val_numb)
{
unsigned char xdata *point;
unsigned char temp,temp_data;
if(val_numb > 5 || val_numb <2)
{
return 0x0200; // 串口号找不到
}
temp = 8*(val_numb-2);
point = 0x2827 + temp; // SBUFx
temp_data = *point;
// temp = InstPara & bPari;
// temp >>= 1;
// if(InstPara & bUrMo)
// {
// point--; // SCONx
// ACC = temp_data;
// if(P)
// {
// if(((InstPara & bPari)>>1) != (*point & 0x04))
// {
// return temp_data;
// }
// else
// {
// return (int)temp_data + 0x0100;
// }
// }
// else
// {
// if(((InstPara & bPari)>>1) == (*point & 0x04))
// {
// return temp_data;
// }
// else
// {
// return (int)temp_data + 0x0100;
// }
// }
// }
return temp_data;
}
/*
函数功能:设定红外调制参数
入口参数:val_dute1:高电平持续时间
val_dute2:低电平持续时间
说明:两个参数相加之和应为86,才能保证38K信号;如果两个参数都为0,则表示关闭红外调制
*/
void SetIR(unsigned char val_dute1,unsigned char val_dute2)
{
if(val_dute1 == 0 && val_dute2 == 0)
{
Txd2FS = 0x01;
}
else
{
Txd2FS = 0x00;//
CARRH = val_dute1;
CARRL = val_dute2;
}
}
void CfgLCD(unsigned char val_cfg)
{
Ctrl_LCD = val_cfg;
}
/*
函数功能:配置LCD显存
入口参数: pAddrLCD:指针,指向用户定义的数组首地址
val_start:从LCDM0开始的偏移量开始写入数据
val_numb:需要写显存的个数
备注:用户定义的数组需要存放在xdata地址空间
*/
void SetLCDData(unsigned char xdata *pAddrLCD,unsigned char val_start,unsigned char val_numb)
{
unsigned char xdata *point1;
unsigned char xdata *point2;
unsigned char i;
point1 = 0x2800 + val_start;
point2 = pAddrLCD;
for(i = 0; i < val_numb; i++)
{
*(point1++) = *(point2++);
}
}
/*
函数功能:端口配置操作
入口参数:val_pn----端口号(0-42)
val_pf----端口特殊功能选择(只有4-14端口具备)
备注:
*/
void CfgPort(unsigned char val_pn,unsigned char val_pf)
{
if(val_pn == 4) // 特殊功能选择
{
switch(val_pf)
{
case 0:
case 1:P10FS = val_pf;break;
default:P10FS = 0x00;break;
}
}
else if(val_pn == 5) // 特殊功能选择
{
switch(val_pf)
{
case 0:
case 3:
case 4:P11FS = val_pf;break;
default:P11FS = 0x00;break;
}
}
else if(val_pn == 6) // 特殊功能选择
{
switch(val_pf)
{
case 0:
case 3:
case 4:P12FS = val_pf;break;
default:P12FS = 0x00;break;
}
}
else if(val_pn == 7) // 特殊功能选择
{
switch(val_pf)
{
case 0:
case 2:
case 3:P13FS = val_pf;break;
default:P13FS = 0x00;break;
}
}
else if(val_pn == 8) // 特殊功能选择
{
switch(val_pf)
{
case 0:
case 2:
case 3:P14FS = val_pf;break;
default:P14FS = 0x00;break;
}
}
else if(val_pn == 9) // 特殊功能选择
{
switch(val_pf)
{
case 0:
case 2:
case 3:P20FS = val_pf;break;
default:P20FS = 0x00;break;
}
}
else if(val_pn == 10) // 特殊功能选择
{
switch(val_pf)
{
case 0:
case 2:
case 3:P21FS = val_pf;break;
default:P21FS = 0x00;break;
}
}
else if(val_pn == 11) // 特殊功能选择
{
switch(val_pf)
{
case 0:
case 2:P22FS = val_pf;break;
default:P22FS = 0x00;break;
}
}
else if(val_pn == 12) // 特殊功能选择
{
switch(val_pf)
{
case 0:
case 2:P23FS = val_pf;break;
default:P23FS = 0x00;break;
}
}
else if(val_pn == 13) // 特殊功能选择
{
switch(val_pf)
{
case 0:
case 2:P24FS = val_pf;break;
default:P24FS = 0x00;break;
}
}
else if(val_pn == 14) // 特殊功能选择
{
switch(val_pf)
{
case 0:
case 2:P25FS = val_pf;break;
default:P25FS = 0x00;break;
}
}
}
//#ifdef LARGE
///*
// 函数功能:写端口数据
// 入口:val_pn:端口号
// val_value:1表示输出1,0表示输出0
//*/
//void SetPort(unsigned char val_pn,unsigned char val_value)
//{
// unsigned char i;
// unsigned char xdata *point;
// i = 0x01;
// if(val_pn >= 0 && val_pn < 4) // port0
// {
// i <<= val_pn;
// point = 0x285a;
// }
// else if(val_pn >= 4 && val_pn < 9) // port1
// {
// i <<= (val_pn-4);
// point = 0x285e;
// }
// else if(val_pn >= 9 && val_pn < 14) // port2
// {
// i <<= (val_pn-9);
// point = 0x2862;
// }
// else if(val_pn >= 14 && val_pn < 18) // port3
// {
// i <<= (val_pn-14);
// point = 0x2866;
// }
// else if(val_pn >= 18 && val_pn < 26) // port4
// {
// i <<= (val_pn-18);
// point = 0x286a;
// }
// else if(val_pn >= 26 && val_pn < 34) // port5
// {
// i <<= (val_pn-26);
// point = 0x286e;
// }
// else if(val_pn >= 34 && val_pn < 42) // port6
// {
// i <<= (val_pn-34);
// point = 0x2872;
// }
// if(val_value)
// {
// *point |= i;
// }
// else
// {
// *point &= ~i;
// }
//}
///*
//
//*/
//void XorPort(unsigned char val_pn)
//{
// unsigned char i;
// unsigned char xdata *point;
// i = 0x01;
// if(val_pn >= 0 && val_pn < 4) // port0
// {
// i <<= val_pn;
// point = 0x285a;
// }
// else if(val_pn >= 4 && val_pn < 9) // port1
// {
// i <<= (val_pn-4);
// point = 0x285e;
// }
// else if(val_pn >= 9 && val_pn < 14) // port2
// {
// i <<= (val_pn-9);
// point = 0x2862;
// }
// else if(val_pn >= 14 && val_pn < 18) // port3
// {
// i <<= (val_pn-14);
// point = 0x2866;
// }
// else if(val_pn >= 18 && val_pn < 26) // port4
// {
// i <<= (val_pn-18);
// point = 0x286a;
// }
// else if(val_pn >= 26 && val_pn < 34) // port5
// {
// i <<= (val_pn-26);
// point = 0x286e;
// }
// else if(val_pn >= 34 && val_pn < 42) // port6
// {
// i <<= (val_pn-34);
// point = 0x2872;
// }
// *point ^= i;
//}
//
///*
// 函数功能:读端口数据
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -