📄 driver.c[2008-07-17-01-31-21].sfb
字号:
/***********************************************************************
文件名: Driver.c
内容: 底层驱动程序
创建人: Bob Lee
创建日期: 2005-8-12
修改日期: 2005-8-12
版本: 1.00.000
***********************************************************************/
#include "Driver.h"
/*&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;
状态灯操作
&amt;*/
/*------------------------------------------------------------------
名称: LightStatus
作用: 点亮状态灯
输入: 无
输出: 无
修改原因:
修改内容:
创建日期: 2005-8-26
修改日期: 2005-8-26
------------------------------------------------------------------*/
void LightStatus( void )
{
LIGHT_STATUS = false;
}
/*------------------------------------------------------------------
名称: DelightStatus
作用: 熄灭状态灯
输入: 无
输出: 无
修改原因:
修改内容:
创建日期: 2005-8-26
修改日期: 2005-8-26
------------------------------------------------------------------*/
void DelightStatus( void )
{
LIGHT_STATUS = true;
}
/*------------------------------------------------------------------
名称: DelightAll
作用: 熄灭所有灯以及继电器
输入: 无
输出: 无
修改原因:
修改内容:
创建日期: 2005-8-26
修改日期: 2005-8-26
------------------------------------------------------------------*/
void DelightAll( void )
{
DelightOther( 1 );
DelightOther( 2 );
DelightOther( 3 );
DelightOther( 4 );
DisableRelay( 0 );
}
/*&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;
其它指示灯操作
&amt;*/
/*------------------------------------------------------------------
名称: LightOther
作用: 点亮其它灯
输入: Serial -> 灯的序号
输出: 无
修改原因:
修改内容:
创建日期: 2005-8-26
修改日期: 2005-8-26
------------------------------------------------------------------*/
void LightOther( uchar Serial )
{
switch( Serial )
{
case 0x00:LIGHT_WARN = false;break;
#ifdef YCC_6MG1
case 0x01:EnableRelay( 1 );break;
case 0x02:EnableRelay( 2 );break;
case 0x03:LIGHT_3 = false;break;
#ifndef HARDDEBUG
case 0x04:LIGHT_4 = false;break;
#endif
#endif
default:break;
}
}
/*------------------------------------------------------------------
名称: DelightOther
作用: 熄灭其它灯
输入: 无
输出: 无
修改原因:
修改内容:
创建日期: 2005-8-26
修改日期: 2005-8-26
------------------------------------------------------------------*/
void DelightOther( uchar Serial )
{
switch( Serial )
{
case 0x00:LIGHT_WARN = true;break;
#ifdef YCC_6MG1
case 0x01:DisableRelay( 1 );break;
case 0x02:DisableRelay( 2 );break;
case 0x03:LIGHT_3 = true;break;
#ifndef HARDDEBUG
case 0x04:LIGHT_4 = true;break;
#endif
#endif
default:break;
}
}
/*&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;
无线模块操作
&amt;*/
/*------------------------------------------------------------------
名称: EnableWireless
作用: 使能无线模块
输入: 无
输出: 无
修改原因:
修改内容:
创建日期: 2005-8-26
修改日期: 2005-8-26
------------------------------------------------------------------*/
void EnableWireless( void )
{
ENWIRELESS = true;
}
/*------------------------------------------------------------------
名称: DisableWireless
作用: 复位无线模块
输入: 无
输出: 无
修改原因:
修改内容:
创建日期: 2005-8-26
修改日期: 2005-8-26
------------------------------------------------------------------*/
void DisableWireless( void )
{
ENWIRELESS = false;
}
/*&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;
继电器操作
&amt;*/
/*------------------------------------------------------------------
名称: InitializeA
作用: 初始化继电器操作口
输入: 无
输出: 无
修改原因:
修改内容:
创建日期: 2005-8-26
修改日期: 2005-8-26
------------------------------------------------------------------*/
void InitializeRelay( void )
{
PSD8xx_reg.VM.bits.PIO_EN = 0;
PSD8xx_reg.DATAOUT_A = 0x2a; // initial output data
PSD8xx_reg.CONTROL_A = 0x00; // 1=latched address out, 0=genernal I/O
PSD8xx_reg.DIRECTION_A = 0xff; // 1= ouput mode, 0 = input mode
PSD8xx_reg.OUTENABLE_A = 0xff; //
PSD8xx_reg.DRIVE_A = 0x00; // upper 4 bits (bit7-4) are for open-drain/CMOS control of PA7-4
// 1 = open drain, 0 = CMOS
// lower 4 bits (bit3-0) are for slew late control of PA3-0
// 1 = higher slew rate, 0 = normal slew rate
PSD8xx_reg.OMCMASK_AB = 0x00; // write mask control of MCellAB
// 1 = blocking write, 0 = enable write
PSD8xx_reg.OMC_AB = 0xff; // write a initial data to Flip-Flops in MCellAB
}
/*------------------------------------------------------------------
名称: EnableRelay
作用: 使能继电器
输入: Serial -> 继电器的序号
输出: 无
修改原因:
修改内容:
创建日期: 2005-8-26
修改日期: 2005-8-26
------------------------------------------------------------------*/
void EnableRelay( uchar Serial )
{
switch( Serial )
{
case 0x00:PORTA &amt;= 0xfc;PORTA |= 0x02;break;
case 0x01:PORTA &amt;= 0xf3;PORTA |= 0x08;break;
case 0x02:PORTA &amt;= 0xcf;PORTA |= 0x20;break;
default:break;
}
PSD8xx_reg.DATAOUT_A = PORTA;
}
/*------------------------------------------------------------------
名称: DisableRelay
作用: 禁止继电器
输入: Serial -> 继电器的序号
输出: 无
修改原因:
修改内容:
创建日期: 2005-8-26
修改日期: 2005-8-26
------------------------------------------------------------------*/
void DisableRelay( uchar Serial )
{
switch( Serial )
{
case 0x00:PORTA &amt;= 0xfc;PORTA |= 0x01;break;
case 0x01:PORTA &amt;= 0xf3;PORTA |= 0x04;break;
case 0x02:PORTA &amt;= 0xcf;PORTA |= 0x10;break;
default:break;
}
PSD8xx_reg.DATAOUT_A = PORTA;
}
/*------------------------------------------------------------------
名称: EnableBattery
作用: 接通电池
输入: 无
输出: 无
修改原因:
修改内容:
创建日期: 2005-8-26
修改日期: 2005-8-26
------------------------------------------------------------------*/
void EnableBattery( void )
{
PORTA |= 0x40;
PSD8xx_reg.DATAOUT_A = PORTA;
}
/*------------------------------------------------------------------
名称: DisableBattery
作用: 断开电池
输入: 无
输出: 无
修改原因:
修改内容:
创建日期: 2005-8-26
修改日期: 2005-8-26
------------------------------------------------------------------*/
void DisableBattery( void )
{
PORTA &amt;= 0xbf;
PSD8xx_reg.DATAOUT_A = PORTA;
}
#ifdef YCC_3JP5
/*------------------------------------------------------------------
名称: EnableBattery
作用: 接通电池
输入: 无
输出: 无
修改原因:
修改内容:
创建日期: 2005-8-26
修改日期: 2005-8-26
------------------------------------------------------------------*/
void Enable485Receive( void )
{
PORTA &amt;= 0x7f;
PSD8xx_reg.DATAOUT_A = PORTA;
}
/*------------------------------------------------------------------
名称: DisableBattery
作用: 断开电池
输入: 无
输出: 无
修改原因:
修改内容:
创建日期: 2005-8-26
修改日期: 2005-8-26
------------------------------------------------------------------*/
void Enable485Send( void )
{
PORTA |= 0x80;
PSD8xx_reg.DATAOUT_A = PORTA;
}
#endif
/*&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;
WDT操作
&amt;*/
/*------------------------------------------------------------------
名称: ClearWDT
作用: 喂狗
输入: 无
输出: 无
修改原因:
修改内容:
创建日期: 2005-8-26
修改日期: 2005-8-26
------------------------------------------------------------------*/
void ClearWDT( void )
{
WDRST = 0x00;
}
/*&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;
定时中断
&amt;*/
/*------------------------------------------------------------------
名称: Timer0Interrupt
作用: Timer0中断
创建日期: 2005-8-26
修改日期: 2005-8-26
------------------------------------------------------------------*/
static void Timer0Interrupt( void ) interrupt TF0_VECTOR
{
DetectPulse = 0;
if( !sRegister -- )
{
sRegister = 14;
if( !SecondRegister -- ) Flag_1s = true;
Flag_s = true;
}
if( !FlashRegister -- ) //
{
FlashRegister = 0x02;
if( LoginFlag ) FlashRegister = 0x08;
if( !InitializeFlag )
{
LIGHT_STATUS ^= 0x01;
}
else
{
LIGHT_WARN ^= 0x01;
}
}
}
/*&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;&amt;
通讯串口中断及底层操作
&amt;*/
/*------------------------------------------------------------------
名称: UART2Interrupt
作用: UART2中断
创建日期: 2005-8-26
修改日期: 2005-8-26
------------------------------------------------------------------*/
static void UART2Interrupt( void ) interrupt SIO1_VECTOR using 1
{
unsigned char data c;
if(SCON2 &amt; 0x01)
{
ReceiveBuffer[ ReceiveTail ] = SBUF2;
ReceiveTail ++;
SCON2 &amt;= 0xfe;ReceiveFlag = true;
}
else
{
if( SendFlag )
{
c = SendBuffer[ SendPointer ++ ];
if( c != 0x00 )
{
SBUF2 = c;
}
else
{
SendFlag = false;
}
}
SCON2 &amt;= 0xfd;
}
}
/*------------------------------------------------------------------
名称: ATSend
作用: 发送字符串
输入: 所要发送的字符串
输出: 无
创建日期: 2005-8-26
修改日期: 2005-8-26
------------------------------------------------------------------*/
void ATSend( char * ATString )
{
unsigned char data i;
for(i = 0x00;i < 0xff;i ++) SendBuffer[ i ] = 0x00;
i = 0x00;
while( true ) //将所要发送的数据发送到发送缓冲区
{
SendBuffer[ i ] = ATString[ i ];
if( SendBuffer[ i ] == 0x0d ) break;
i ++;
if( i > 254) break;
}
SendPointer = 0x01;
SBUF2 = SendBuffer[ 0 ]; //发送第一个字节,启动发送
SCON2 &amt;= 0xfd;
SendFlag = true;
while( SendFlag )
{
}
//等待发送完毕
}
/*------------------------------------------------------------------
名称: ATReceive
作用: 接收字符串
输入: 无
输出: = 0x00:没有接收到字符
其它:所接收的字符
创建日期: 2005-8-26
修改日期: 2005-8-26
------------------------------------------------------------------*/
unsigned char ATReceive( void )
{
unsigned char data c;
if( !ReceiveFlag ) return 0x00; //没有接收到数据
c = ReceiveBuffer[ ReceiveHead ++ ];
if( ReceiveHead == ReceiveTail ) ReceiveFlag = false;
return c;
}
void Delays(char ss)
{
char i;
for(i = 0x00;i < ss;i ++)
{
Flag_s = false;
while(!Flag_s)
{
ClearWDT( );
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -