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

📄 driver.c

📁 用凌阳单片机(sunplus)实现的红外接收装置
💻 C
字号:


#include "global.h"

static volatile unsigned int *P_IOA_Data = (unsigned int*)(0x7000);
static volatile unsigned int *P_IOA_Buffer = (unsigned int*)(0x7001);
static volatile unsigned int *P_IOA_Dir = (unsigned int*)(0x7002);
static volatile unsigned int *P_IOA_Attrib = (unsigned int*)(0x7003);
static volatile unsigned int *P_IOB_Data = (unsigned int*)(0x7005);
static volatile unsigned int *P_IOB_Dir = (unsigned int*)(0x7007);
static volatile unsigned int *P_IOB_Attrib = (unsigned int*)(0x7008);
//static  unsigned int *P_Watchdog_Clear = (unsigned int*)(0x7012);
static volatile unsigned int *P_TimerA_Data = (unsigned int*)(0x700A);
static volatile unsigned int *P_TimerA_Ctrl = (unsigned int*)(0x700B);
static volatile unsigned int *P_TimerB_Data = (unsigned int*)(0x700C);
static volatile unsigned int *P_TimerB_Ctrl = (unsigned int*)(0x700D);
static volatile unsigned int *P_System_clock = (unsigned int*)(0x7013);
static volatile unsigned int *P_INT_Ctrl = (unsigned int*)(0x7010);
static volatile unsigned int *P_INT_Clear = (unsigned int*)(0x7011);
static volatile unsigned int *P_ADC_Ctrl = (unsigned int*)(0x7015);
static volatile unsigned int *P_ADC_MUX_Ctrl = (unsigned int*)(0x702B);
static volatile unsigned int *P_ADC_MUX_DATA = (unsigned int*)(0x702C);
static volatile unsigned int *P_Flash_Ctrl = (unsigned int*)(0x7555);
static volatile unsigned int *P_DAC_Ctrl = (unsigned int*)(0x702A);
static volatile unsigned int *P_DAC2 = (unsigned int*)(0x7016);
static volatile unsigned int *P_DAC1 = (unsigned int*)(0x7017);




///////////////////////////////////////////////////////////////////////////////

void driver_initial(){
	*P_IOA_Dir=0xfff6;
	*P_IOA_Attrib=0xfff6;
	*P_IOA_Data=0xfff6;
	
	*P_IOB_Dir=0x0320;
	*P_IOB_Attrib=0x0320;
	*P_IOB_Data=0x0324;
	
	*P_DAC_Ctrl=0x0000;	
	*P_INT_Ctrl=0x0540;
	*P_System_clock=0x0080;
}


//////////////////////////////////////////////////////////////////////////
void set_PWM() {
	*P_TimerA_Ctrl=0x0230;
	*P_TimerA_Data=0xffd9;
}

void del_PWM(){
	*P_TimerA_Ctrl=0x0030;
	*P_IOB_Data = ((*P_IOB_Data) &  ~0x000a) | 0x0300;
}


//////////////////////////////////////////////////////////////////////////////
static int a[]={0x3f00,0x0600,0x5b00,0x4f00,0x6600,0x6d00,0x7d00,0x0700,0x7f00,0x6f00,0x0000,0x4000};
static int b[] = {0x0020, 0x0010, 0x0004, 0x0002};
//static int b[]={0x0004,0x0008,0x0010,0x0020};
void show_digit(int shift,int num,int dot){
	dot=dot<<15;
	dot=dot&0x8000;	
		*P_IOA_Data = (*P_IOA_Data & 0x00c9) | (a[num]|b[shift]|dot);		
}


/* in fact 0.5 ms */
void delay_1ms(unsigned int addition){
	*P_INT_Ctrl= *P_INT_Ctrl |0x0400;
	*P_TimerB_Ctrl =  0x0002;
	//*P_TimerB_Data=0xffe0;
	addition = addition * 2 + 16;
	addition = 0 - addition;
	*P_TimerB_Data = addition;
	//*P_TimerB_Data = 0xff99;
} 

	
///////////////////////////////////////////////////////////////////////////////
void IRQ2(void) __attribute__((ISR));			//delay 1ms
void IRQ2(void) {
	time_up=1;
	*P_INT_Ctrl=*P_INT_Ctrl&0xfbff;
	*P_INT_Clear=0x0400;	
}

/////////////////////////////////////////////////////////////////////////////////
void IRQ3(void) __attribute__((ISR));
void IRQ3(void){
	red_interrupt_callback();					
	*P_INT_Clear=0x0100;
}

static volatile int key_state1 = 0; // low level
static volatile int key_cnt1 = 0;
static volatile int key_state2 = 0; // low level
static volatile int key_cnt2 = 0;

void key1() {
	if (key_state1 == 0) {
		if (((*P_IOB_Data)&0x0008) == 0) { // still low
			key_cnt1 = 0;
		} else {
			key_cnt1++;
			if (key_cnt1 >= 100) {
				key_state1 = 1;
				key_cnt1 = 0;
				key_dec_press_callback();	
			}
		}
	} else {  // key state = 1;
		if (((*P_IOB_Data)&0x0008) != 0) { // still high
			key_cnt1 = 0;
		} else {
			key_cnt1++;
			if (key_cnt1 >= 100) {
				key_state1 = 0;
				key_cnt1 = 0;
			}
		}
	}

}

void key2() {
	if (key_state2 == 0) {
		if (((*P_IOB_Data)&0x0002) == 0) { // still low
			key_cnt2 = 0;
		} else {
			key_cnt2++;
			if (key_cnt2 >= 100) {
				key_state2 = 1;
				key_cnt2 = 0;
				key_inc_press_callback();	
			}
		}
	} else {  // key state = 1;
		if (((*P_IOB_Data)&0x0002) != 0) { // still high
			key_cnt2 = 0;
		} else {
			key_cnt2++;
			if (key_cnt2 >= 100) {
				key_state2 = 0;
				key_cnt2 = 0;
			}
		}
	}
}


/*
static int flag1,flag2;
static int num1,num2,num3,num4;

void key1(){
	if(!flag1){
	    	if(*P_IOB_Data&0x0008){			    
		    	num1++;
		    	num2=0;
			if(num1>100){
				key_dec_press_callback();										
				flag1=flag1^0x0001;
			}
		}
 	} else {
		num1=0;
		if(!(*P_IOB_Data&0x0008)){
			num2++;
			if(num2>100)	flag1=flag1^0x0001;	
		}
	}
}

void key2(){
	if(!flag2){
		    if(*P_IOB_Data&0x0002){			    
			    	num3++;
			    	num4=0;
					if(num3>100){						
						key_inc_press_callback();											
						flag2=flag2^0x0001;
					}
				}				
		}
		if(flag2){
			num3=0;
			if(!(*P_IOB_Data&0x0002)){
				num4++;
				if(num4>100)	flag2=flag2^0x0001;	
			}
		}
}

*/
		
void set_dac(int sound) 
{
	*P_DAC1 = sound;
	*P_DAC2 = sound;
}


/////////////////////////////////////////////////////////////////////////////////////
void IRQ4(void) __attribute__ ((ISR));
void IRQ4(void){	
	key1();
	key2();		
	timer_4kHz_callback();
	*P_INT_Clear=0x0040;
}

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -