⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timers.c

📁 dspic开发控制程序,有助开发pic单片机程序
💻 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 + -