📄 chiplib.c
字号:
/*************************************************************************************
文件类型:底层驱动函数文件
文件作用:
修改权限:底层驱动维护人员
文件相关:
创 建 人:GeminiKQ
创建日期:2006.12.19
当前版本:Ver0.1
版本信息:Ver0.1 GeminiKQ
**************************************************************************************/
#include "libextern.h"
#include "Var.h"
//extern void SetPLL(void);
volatile char xdata VPGA1 _at_ 0x28A1;
volatile char xdata VPGA2 _at_ 0x28A2;
volatile char xdata VPGA3 _at_ 0x28A3;
//=lib中全局控制变量==================
volatile unsigned char xdata InstPara _at_ 0x0200;
#define bWRTC 0x01 // 写RTC控制
#define bRRTC 0x02 // 读RTC控制
#define bUrMo 0x04 // 串口模式控制
#define bPari 0x08 // 串口奇偶位控制
//====================================
/*
函数作用:中断系统控制
入口参数:val_enint:从低到高每位对应相应中断号,1表示打开,0表示关闭
备注:
*/
void CfgInterrupt(unsigned long val_enint)
{
unsigned long temp;
temp = (unsigned char)val_enint;
temp &= ~0x80;
IE = temp;
temp = val_enint>>7;
if((unsigned char)temp)
{
EIE |= 0x01;
}
else
{
EIE &= ~0x01;
}
ExInt2IE = temp;
temp = val_enint>>15;
if((unsigned char)temp)
{
EIE |= 0x02;
}
else
{
EIE &= ~0x02;
}
ExInt3IE = temp;
temp = val_enint>>22;
if((unsigned char)temp)
{
EIE |= 0x04;
}
else
{
EIE &= ~0x04;
}
ExInt4IE = temp;
temp = val_enint>>27;
if((unsigned char)temp)
{
EIE |= 0x10;
}
else
{
EIE &= ~0x10;
}
}
/*
*/
unsigned long ReadInterrupt(void)
{
unsigned long temp;
temp = IE;
temp += ((unsigned long)ExInt2IE) << 7;
temp += ((unsigned long)ExInt3IE) << 15;
temp += ((unsigned long)ExInt4IE) << 22;
temp += ((unsigned long)(EIE & 0x10)) << 27;
return temp;
}
/*
函数功能:开中断
入口:val_numb:中断号
返回1表示设置成功,返回0表示设置失败
*/
unsigned char SetInterrupt(unsigned char val_numb)
{
switch(val_numb)
{
case 0: IE |= 0x01;break;
case 1: IE |= 0x02;break;
case 2: IE |= 0x04;break;
case 3: IE |= 0x08;break;
case 4: IE |= 0x20;break;
// case 5: IE |= 0x40;break;
// case 6: IE |= 0x40;break;
case 7: EIE |= 0x01;ExInt2IE |= 0x01;break;
case 8: EIE |= 0x01;ExInt2IE |= 0x02;break;
case 9: EIE |= 0x01;ExInt2IE |= 0x04;break;
case 10:EIE |= 0x01;ExInt2IE |= 0x08;break;
case 11:EIE |= 0x01;ExInt2IE |= 0x10;break;
case 12:EIE |= 0x01;ExInt2IE |= 0x20;break;
case 13:EIE |= 0x01;ExInt2IE |= 0x40;break;
case 14:EIE |= 0x01;ExInt2IE |= 0x80;break;
case 15:EIE |= 0x02;ExInt3IE |= 0x01;break;
case 16:EIE |= 0x02;ExInt3IE |= 0x02;break;
case 17:EIE |= 0x02;ExInt3IE |= 0x04;break;
case 18:EIE |= 0x02;ExInt3IE |= 0x08;break;
case 19:EIE |= 0x02;ExInt3IE |= 0x10;break;
case 20:EIE |= 0x02;ExInt3IE |= 0x20;break;
case 21:EIE |= 0x02;ExInt3IE |= 0x40;break;
case 22:EIE |= 0x04;ExInt4IE |= 0x01;break;
case 23:EIE |= 0x04;ExInt4IE |= 0x02;break;
case 24:EIE |= 0x04;ExInt4IE |= 0x04;break;
case 25:EIE |= 0x04;ExInt4IE |= 0x08;break;
case 26:EIE |= 0x04;ExInt4IE |= 0x10;break;
case 27:EIE |= 0x10;break;
default:
return 0;break;
}
return 1;
}
/*
函数功能:关中断
入口:val_numb:中断号
返回1表示设置成功,返回0表示设置失败
*/
unsigned char ClrInterrupt(unsigned char val_numb)
{
switch(val_numb)
{
case 0: IE &= ~0x01;break;
case 1: IE &= ~0x02;break;
case 2: IE &= ~0x04;break;
case 3: IE &= ~0x08;break;
case 4: IE &= ~0x20;break;
// case 5: IE &= ~0x40;break;
// case 6: IE &= ~0x40;break;
case 7: ExInt2IE &= ~0x01;break;
case 8: ExInt2IE &= ~0x02;break;
case 9: ExInt2IE &= ~0x04;break;
case 10:ExInt2IE &= ~0x08;break;
case 11:ExInt2IE &= ~0x10;break;
case 12:ExInt2IE &= ~0x20;break;
case 13:ExInt2IE &= ~0x40;break;
case 14:ExInt2IE &= ~0x80;break;
case 15:ExInt3IE &= ~0x01;break;
case 16:ExInt3IE &= ~0x02;break;
case 17:ExInt3IE &= ~0x04;break;
case 18:ExInt3IE &= ~0x08;break;
case 19:ExInt3IE &= ~0x10;break;
case 20:ExInt3IE &= ~0x20;break;
case 21:ExInt3IE &= ~0x40;break;
case 22:ExInt4IE &= ~0x01;break;
case 23:ExInt4IE &= ~0x02;break;
case 24:ExInt4IE &= ~0x04;break;
case 25:ExInt4IE &= ~0x08;break;
case 26:ExInt4IE &= ~0x10;break;
case 27:EIE &= ~0x10;break;
default:
return 0;break;
}
return 1;
}
/*
函数功能:查询中断标记
入口:val_numb:中断号
返回-1表示查询失败,返回1和0分别表示中断标记状态
*/
char ReadIntFlg(unsigned char val_numb)
{
unsigned char temp;
switch(val_numb)
{
case 0: temp = (TCON & 0x02);break;
case 1: temp = (TCON & 0x20);break;
case 2: temp = (TCON & 0x08);break;
case 3: temp = (TCON & 0x80);break;
case 4: temp = (T2CON & 0x80);break;
// case 5: IE &= ~0x40;break;
// case 6: IE &= ~0x40;break;
case 7: temp = (ExInt2IFG & 0x01);break;
case 8: temp = (ExInt2IFG & 0x02);break;
case 9: temp = (ExInt2IFG & 0x04);break;
case 10:temp = (ExInt2IFG & 0x08);break;
case 11:temp = (ExInt2IFG & 0x10);break;
case 12:temp = (ExInt2IFG & 0x20);break;
case 13:temp = (ExInt2IFG & 0x40);break;
case 14:temp = (ExInt2IFG & 0x80);break;
case 15:temp = (ExInt3IFG & 0x01);break;
case 16:temp = (ExInt3IFG & 0x02);break;
case 17:temp = (ExInt3IFG & 0x04);break;
case 18:temp = (ExInt3IFG & 0x08);break;
case 19:temp = (ExInt3IFG & 0x10);break;
case 20:temp = (ExInt3IFG & 0x20);break;
case 21:temp = (ExInt3IFG & 0x40);break;
case 22:temp = (ExInt4IFG & 0x01);break;
case 23:temp = (ExInt4IFG & 0x02);break;
case 24:temp = (ExInt4IFG & 0x04);break;
case 25:temp = (ExInt4IFG & 0x08);break;
case 26:temp = (ExInt4IFG & 0x10);break;
case 27:temp = (EICON & 0x08);break;
default:
return -1;break;
}
return temp;
}
/*
函数功能:查询方式中清中断标记
入口:val_numb:中断号
返回1表示设置成功,返回0表示设置失败
*/
unsigned char ClrIntFlg(unsigned char val_numb)
{
switch(val_numb)
{
case 0: TCON &= ~0x02;break;
case 1: TCON &= ~0x20;break;
case 2: TCON &= ~0x08;break;
case 3: TCON &= ~0x80;break;
case 4: T2CON &= ~0x80;break;
// case 5: IE &= ~0x40;break;
// case 6: IE &= ~0x40;break;
case 7: ExInt2IFG &= ~0x01;break;
case 8: ExInt2IFG &= ~0x02;break;
case 9: ExInt2IFG &= ~0x04;break;
case 10:ExInt2IFG &= ~0x08;break;
case 11:ExInt2IFG &= ~0x10;break;
case 12:ExInt2IFG &= ~0x20;break;
case 13:ExInt2IFG &= ~0x40;break;
case 14:ExInt2IFG &= ~0x80;break;
case 15:ExInt3IFG &= ~0x01;break;
case 16:ExInt3IFG &= ~0x02;break;
case 17:ExInt3IFG &= ~0x04;break;
case 18:ExInt3IFG &= ~0x08;break;
case 19:ExInt3IFG &= ~0x10;break;
case 20:ExInt3IFG &= ~0x20;break;
case 21:ExInt3IFG &= ~0x40;break;
case 22:ExInt4IFG &= ~0x01;break;
case 23:ExInt4IFG &= ~0x02;break;
case 24:ExInt4IFG &= ~0x04;break;
case 25:ExInt4IFG &= ~0x08;break;
case 26:ExInt4IFG &= ~0x10;break;
case 27:EICON &= ~0x08;break;
default:
return 0;break;
}
return 1;
}
//=======================================================
//函数名:Interrupt_Int0
//函数作用:端口中断0,中断向量 (03H)
//=======================================================
void Interrupt_Int0 (void) interrupt 0 using 2
{
TCON &= ~BIT1;
SysIntFlgState |= 0x00000001;
// user coding begin
Int0();
}
//=======================================================
//函数名:Interrupt_Timer0
//函数作用:内核timer0中断,中断向量 (0BH)
//=======================================================
void Interrupt_Timer0 (void) interrupt 1 using 2
{
TCON &= ~BIT5;
// user coding begin
SysIntFlgState |= 0x00000002;
Int1();
}
//=======================================================
//函数名:Interrupt_Int1
//函数作用:端口中断1,中断向量 (13H)
//=======================================================
void Interrupt_Int1 (void) interrupt 2 using 2
{
TCON &= ~BIT3;
SysIntFlgState |= 0x00000004;
// user coding begin
Int2();
}
//=======================================================
//函数名:Interrupt_Timer1
//函数作用:内核timer1中断,中断向量 (1BH)
//=======================================================
void Interrupt_Timer1 (void) interrupt 3 using 2
{
TCON &= ~BIT7;
SysIntFlgState |= 0x00000008;
// user coding begin
Int3();
}
//=======================================================
//函数名:Interrupt_Timer2
//函数作用:内核timer2中断,中断向量 (2BH)
//=======================================================
void Interrupt_Timer2 (void) interrupt 5 using 2
{
T2CON &= ~BIT7;
SysIntFlgState |= 0x00000010;
// user coding begin
Int4();
}
//=======================================================
//函数名:Interrupt_Uart1
//函数作用:内核uart1中断,中断向量 (3BH)
//=======================================================
void Interrupt_Uart1 (void) interrupt 7 using 2
{
if(SCON1 & BIT0)
{// 接受中断标记
SCON1 &= ~BIT0;
SysIntFlgState |= 0x00000020;
// user coding begin
Int5();
}
else if(SCON1 & BIT1)
{// 发送中断标记
SCON1 &= ~BIT1;
SysIntFlgState |= 0x00000040;
// user coding begin
Int6();
}
}
//=======================================================
//函数名:Interrupt_ExInt2
//函数作用:外部中断2,中断向量 (43H)
//=======================================================
void Interrupt_ExInt2 (void) interrupt 8 using 2
{
unsigned char temp_ifg;
temp_ifg = ExInt2IE & ExInt2IFG; // 防止对未使能中断的位操作
if(temp_ifg & BIT0)
{// uart2 translate interrupt flag
ExInt2IFG &= ~BIT0;
SCON2 &= ~ExUTI;
SCON2 |= ExUTB8; // bit9
SysIntFlgState |= 0x00000080;
// user coding begin
// SBUF2 = 0x55;
Int7();
}
if(temp_ifg & BIT1)
{// uart2 receive interrupt flag
ExInt2IFG &= ~BIT1;
SCON2 &= ~ExURI;
SysIntFlgState |= 0x00000100;
// user coding begin
Int8();
}
if(temp_ifg & BIT2)
{// uart4 transfer interrupt flag
ExInt2IFG &= ~BIT2;
SCON4 &= ~ExUTI;
SCON4 |= ExUTB8; // bit9
SysIntFlgState |= 0x00000200;
// user coding begin
Int9();
}
if(temp_ifg & BIT3)
{// uart4 receive interrupt flag
ExInt2IFG &= ~BIT3;
SCON4 &= ~ExURI;
SysIntFlgState |= 0x00000400;
// user coding begin
Int10();
}
if(temp_ifg & BIT4)
{// uart2timer0 interrupt
ExInt2IFG &= ~BIT4;
// user coding begin
SysIntFlgState |= 0x00000800;
Int11();
// P1OE = 0;
// P1OD ^= BIT3;
}
if(temp_ifg & BIT5)
{// uart4timer0 interrupt
ExInt2IFG &= ~BIT5;
SysIntFlgState |= 0x00001000;
// user coding begin
Int12();
// P1OE = 0;
// P1OD ^= BIT4;
}
if(temp_ifg & BIT6)
{// flash erase interrupt
ExInt2IFG &= ~BIT6;
SysIntFlgState |= 0x00002000;
// user coding begin
Int13();
}
if(temp_ifg & BIT7)
{// CF impluse interrupt
ExInt2IFG &= ~BIT7;
SysIntFlgState |= 0x00004000;
// user coding begin
Int14();
}
EXIF &= ~BIT4;
}
//=======================================================
//函数名:Interrupt_ExInt3
//函数作用:外部中断3,中断向量 (4BH)
//=======================================================
void Interrupt_ExInt3 (void) interrupt 9 using 2
{
unsigned char temp_ifg;
unsigned char xdata *point;
point = 0;
temp_ifg = ExInt3IE & ExInt3IFG;
if(temp_ifg & BIT0)
{// uart3 transfer interrupt flag
ExInt3IFG &= ~BIT0;
SCON3 &= ~ExUTI;
SCON3 |= ExUTB8; // bit9
SysIntFlgState |= 0x00008000;
// user coding begin
Int15();
// SBUF3 = 0x55;
// P1OE = 0;
// P1OD ^= BIT3;
}
if(temp_ifg & BIT1)
{// uart3 receive interrupt flag
ExInt3IFG &= ~BIT1;
SCON3 &= ~ExURI;
SysIntFlgState |= 0x00010000;
// user coding begin
Int16();
// if(SBUF3 == 0x55)
// {
// P1OE = 0;
//P1OD ^= BIT3;
// }
}
if(temp_ifg & BIT2)
{// uart5 transfer interrupt flag
ExInt3IFG &= ~BIT2;
SCON5 &= ~ExUTI;
SCON5 |= ExUTB8; // bit9
SysIntFlgState |= 0x00020000;
// user coding begin
Int17();
}
if(temp_ifg & BIT3)
{// uart5 receive interrupt flag
ExInt3IFG &= ~BIT3;
SCON5 &= ~ExURI;
SysIntFlgState |= 0x00040000;
// user coding begin
Int18();
}
if(temp_ifg & BIT4)
{// uart3timer0 interrupt
ExInt3IFG &= ~BIT4;
SysIntFlgState |= 0x00080000;
// user coding begin
Int19();
// P1OE = 0;
// P1OD ^= BIT1;
}
if(temp_ifg & BIT5)
{// uart5timer0 interrupt
ExInt3IFG &= ~BIT5;
SysIntFlgState |= 0x00100000;
// user coding begin
Int20();
// P1OE = 0;
// P1OD ^= BIT2;
}
if(temp_ifg & BIT6)
{// rtc interrupt
ExInt3IFG &= ~BIT6;
if(InstPara & bWRTC)
{
InstPara &= ~bWRTC;
/* RTC允许写 */
RTC_PEN = 0x96; //password 1
RTCPWD = 0xd7; //password 2
/* 写RTC时间 */
// RTCYC = RTCTIME.rYear;
// RTCMoC = RTCTIME.rMonth;
// RTCDC = RTCTIME.rDate;
// RTCHC = RTCTIME.rHour;
// RTCMiC = RTCTIME.rMinute;
// RTCSC = RTCTIME.rSecond;
// RTCWC = RTCTIME.rWeek;
RTCYC = *(point++);
RTCMoC = *(point++);
RTCDC = *(point++);
RTCHC = *(point++);
RTCMiC = *(point++);
RTCSC = *(point++);
RTCWC = *(point++);
/* RTC禁止写 */
RTC_PEN = 0x96; //
RTCPWD = 0xd6;
}
else
{
InstPara &= ~bRRTC;
}
SysIntFlgState |= 0x00200000;
// user coding begin
Int21();
// Bottom_State |= BIT0;
// P2OD ^= BIT5;
}
EXIF &= ~BIT5;
}
//=======================================================
//函数名:Interrupt_ExInt4
//函数作用:外部中断4,中断向量 (53H)
//=======================================================
void Interrupt_ExInt4 (void) interrupt 10 using 2
{
unsigned char temp_ifg;
temp_ifg = ExInt4IE & ExInt4IFG;
if(temp_ifg & BIT0)
{
ExInt4IFG &= ~BIT0;
SysIntFlgState |= 0x00400000;
// user coding begin
Int22();
// P1OE = 0;
// P1OD &= ~BIT3;
}
if(temp_ifg & BIT1)
{
ExInt4IFG &= ~BIT1;
SysIntFlgState |= 0x00800000;
// user coding begin
Int23();
// P1OE = 0;
// P1OD &= ~BIT4;
}
if(temp_ifg & BIT2)
{
ExInt4IFG &= ~BIT2;
SysIntFlgState |= 0x01000000;
// user coding begin
Int24();
// P1OE = 0;
// P1OD &= ~BIT1;
}
if(temp_ifg & BIT3)
{
ExInt4IFG &= ~BIT3;
SysIntFlgState |= 0x02000000;
// user coding begin
Int25();
// P1OE = 0;
// P1OD &= ~BIT2;
}
if(temp_ifg & BIT4)
{
ExInt4IFG &= ~BIT4;
SysIntFlgState |= 0x04000000;
// user coding begin
Int26();
// P1OE = 0;
// P1OD &= ~BIT3;
}
EXIF &= ~BIT6;
}
//=======================================================
//函数名:Interrupt_PF
//函数作用:系统掉电预警中断,中断向量 (63H)
//=======================================================
void Interrupt_PF (void) interrupt 12 using 2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -