📄 timers.c
字号:
#include <p30f6014.h>
#include <timer.h>
#include <dsp.h>
#include "common.h"
#include "timers.h"
#define NVMCON_WRITE_1_EEPROM 0x4004
#define NVMCON_ERASE_1_EEPROM 0x4044
#define EE_DATA_PAGE 0x7F //EEDATA部分起始
volatile struct SEM_STRUCA SemA;
volatile struct SEM_STRUCB SemB;
volatile unsigned char KeyNum;
volatile unsigned char LCDHoldoffCounter;
static volatile unsigned int DelayCounter;
static volatile unsigned int LastSwitch;
void InitTimers( void );
int ReadEEData( unsigned int adr );
void WriteEEData( unsigned int adr , int data);
//初始化timer1和 timer2定时器
void InitTimers( void )
{
TRISAbits.TRISA15 = 1; //键盘输入口位
TRISAbits.TRISA14 = 1;
TRISAbits.TRISA13 = 1;
TRISAbits.TRISA12 = 1;
/* 使能timer1中断并设其优先级为"1"*/
ConfigIntTimer1(T1_INT_PRIOR_1 & T1_INT_ON);
WriteTimer1(0);
OpenTimer1(T1_ON & T1_GATE_OFF & T1_IDLE_STOP &
T1_PS_1_256 & T1_SYNC_EXT_OFF &
T1_SOURCE_INT, CLOCK_FREQ/(256*10) ); //频率为10Hz
SemA.Timer1 = 0;
DelayCounter = 0;
LCDHoldoffCounter = 0;
/*使能timer1中断并设其优先级为"2"*/
ConfigIntTimer2(T2_INT_PRIOR_2 & T2_INT_ON);
WriteTimer2(0);
OpenTimer2(T2_ON & T2_GATE_OFF & T2_IDLE_STOP &
T2_PS_1_256 & T2_32BIT_MODE_OFF &
T2_SOURCE_INT, CLOCK_FREQ/(256*25) ); //频率为25Hz
SemA.KeySwitch = 0;
LastSwitch = PORTA & 0xF000;
KeyNum = 0;
}
//Timer1 中断服务程序,执行频率为10Hz
void __attribute__((__interrupt__)) _T1Interrupt(void)
{
SemA.Timer1 = 1;
IFS0bits.T1IF = 0; /* Clear Timer interrupt flag */
}
//Timer2中断服务程序,执行频率为25Hz
void __attribute__((__interrupt__)) _T2Interrupt(void)
{
if(LastSwitch != (PORTA & 0xF000) ) //检查键的状态是否改变
{
LastSwitch = PORTA & 0xF000;
if( LastSwitch != 0xF000) //如果有键按下
{
if( !PORTAbits.RA15 )
KeyNum = KEY4;
else if( !PORTAbits.RA14 )
KeyNum = KEY3;
else if( !PORTAbits.RA13 )
KeyNum = KEY2;
else
KeyNum = KEY1;
SemA.KeySwitch = TRUE;
}
}
if(DelayCounter>0) //用于作40mS延时
DelayCounter--;
if(LCDHoldoffCounter>0)
LCDHoldoffCounter--;
IFS0bits.T2IF = 0; //清Timer2中断标志
}
//延时子程序
void TimeDelay(unsigned int Tics40ms)
{
DelayCounter = Tics40ms;
while(DelayCounter){};
}
//EEPROM读子程序
int ReadEEData( unsigned int adr )
{
TBLPAG = EE_DATA_PAGE;
WREG0 = adr;
asm volatile ("tblrdl [w0],w1");
return WREG1;
}
//EEPROM写子程序
void WriteEEData( unsigned int adr , int data)
{
IFS0bits.NVMIF = 0;
TBLPAG = EE_DATA_PAGE;
NVMADR = adr;
NVMCON = NVMCON_ERASE_1_EEPROM;
asm volatile ( "push SR" );
asm volatile ( "mov #0x00E0, w0" );
asm volatile ( "ior SR" );
asm volatile( "mov #0x55, w0" );
asm volatile( "mov w0, NVMKEY" );
asm volatile( "mov #0xAA, w0" );
asm volatile( "mov w0, NVMKEY" );
NVMCONbits.WR = 1;
asm volatile ( "pop SR" );
while (NVMCONbits.WR == 1){};
IFS0bits.NVMIF = 0;
TBLPAG = EE_DATA_PAGE;
WREG3 = data;
WREG4 = adr;
asm volatile("tblwtl w3,[w4]");
NVMCON = NVMCON_WRITE_1_EEPROM;
asm volatile ( "push SR" );
asm volatile ( "mov #0x00E0, w0" );
asm volatile ( "ior SR" );
asm volatile( "mov #0x55, w0" );
asm volatile( "mov w0, NVMKEY" );
asm volatile( "mov #0xAA, w0" );
asm volatile( "mov w0, NVMKEY" );
NVMCONbits.WR = 1;
asm volatile ( "pop SR" );
while (NVMCONbits.WR == 1){};
NVMCONbits.WREN = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -