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

📄 t10a2_main.c

📁 AVR单片机基础程序实例! 十个程序源代码。
💻 C
📖 第 1 页 / 共 5 页
字号:
/*************************2006/08/14/修改******************************/
//ICC-AVR application builder : 2006-8-7 16:54:17
// Target : M64
// Crystal: 8.0000Mhz or 16.0000MHZ
//2006/12/8修改,软件改版,只分三种播放环境,改遥控键,改菜单,信号检测等*/

#include <iom64.h>
#include <inavr.h>
#include <ioavr.h>

#include "T10A2_flash.H"
#include "T10A2_main_define.H"

//extern Lighten_VFD();

void port_init(void);
void watchdog_init(void);
void timer0_init(void);
void timer1_init(void);
void timer2_init(void);
//void int4_isr(void); //INT4 remote
//void timer0_ovf_isr(void);//T0
void adc_init(void);
//void adc_isr(void);  //AD转换,中断22
void twi_init(void); //I2C
void i2cReceiveByte(unsigned char ackFlag);
//void twi_isr(void);  //I2C 中断34
void twi_receive_data_disposal(void);
void init_devices(void); // 初始化寄存器
void delay_1us(void);
void delay_us(uint i);
void delay_ms(uint j);

//void writebyte_6306(uchar temp_6306);//写字节
//void write_address_6306(uchar __flash *pa);//送五个字节,一段
void write_yigezi_display(uchar temp,uchar temp1);//写一个字
void write_data_display(uchar i,uchar temp,uchar __flash *ps);//送不定长字给显示暂存器 i表开始字地址,temp 表末地址(0-13)
void write_data_display_1(uchar i,uchar temp,uchar *ps);//
void display_slow_side_open(void);
void display_slow_right_open(void);//慢显,往右开屏

//void dispose_qidian(void);  //频段处理
//void AD_select_channel(void);
//void ad_gain_coutrol_disposal(void);
void SendData_R2S15902(uchar temp_r2s,uchar number_r2s);
void sendbit_r2s15902(uchar temp_bit);
void sendbyte1_r2s15902(void);//input_select+tone
void sendbyte2_r2s15902(void);//fl,fr_vol
void sendbyte3_r2s15902(void);//cen,sw_vol
void sendbyte4_r2s15902(void);//sl,sr_vol
void STR(void);//PT2313 ic
void STOP(void);
void write_2313_byte(uchar s);
void write_2313_page(void);
void write_mic_delay(void);
void vol_max(void);

void tv_vol_disposal(void);//处理TV模式 音量
void ht_vol_disposal(void);
void cd_vol_disposal(void);
void vol_up_slowly_disposal(void);
void reset_disposal(void);

void remote_disp_init(void);//remote 前面段处理
void remote_disp_init_1(void);//
void display_init(void);
void remote_usbcard_on_disposal(void);
void remote_usbcard_on_disposal_1(void);
void remote_disposal_usbcard_inputselect(void);
void remote_disposal_pingheng(void);
void remote_disposal_pinghengjian(void);//remote处理子程序
void remote_disposal_pinghengjia(void);
void remote_disposal_EQ_jian(void);
void remote_disposal_EQ_jia(void);
void remote_disposal_EQ_disp(void);
void remote_display_mic(void);
void remote_disposal_mic_jia(void);
void remote_disposal_mic_jian(void);
void remote_disposal_mic_disp(void);

void tv_pingdian_disposal(void);
//void tv_send_datato_disp_buffer(void);
void input_select_autojia(void);
//void input_select_disposal(void);
void mode_select_disposal(void);
void output_disposal(void);
void input_select_init(void);//输入初始化

void video_disposal(void);/*未完*/
void static_state_disposal(void);//无信号进入待机状态
void turn_on_init(void);//开机初化始
void turn_off_init(void);
//void SendDataToDisp_Buffer(uchar __flash *tp0,uchar __flash *tp1,uchar __flash *tp2,uchar __flash *tp3);
void Temportect_disposal(void);
void Dcportect_disposal(void);
void Shortportect_disposal(void);
void single_check_turnoff(void);//无信号自动关机
void karaok_insert_pullout_disposal(void);
void auto_search_channel_theatre();
void osd_tiaoshi_display(void);//新加,用于菜单显示

void tv_anjian_disposal1(void);//按键处理子程序
void ht_anjian_disposal2(void);
void cd_anjian_disposal3(void);
void mic_anjian_disposal5(void);
void setup_anjian_disposal6(void);
void setup_anjian_disposal6_0(void);
void menu_disposal(void); //菜单按键处理主程序

void start_cm6930(void);
void stop_cm6930(void);
void write_cm6930(uchar data_cm6930);
uchar read_cm6930(void);
uchar key_cm6930(void);

void touch_cm6930_disposal(void);//面板感应处理
void touch_disposal(void);//面板按键处理
void write4094(uchar data4094);
void LED_Flash(void);

void Display_Proc(uchar Display_Mode);
void VFD_Display(void);
unsigned char Initial_Display(void);
void CLEAR_VFD(void);
void ini_CLEAR_VFD(void);

void Initial_VFD(void);
void Rotary_Proc(void);
void Temperature_Detect(void);
void fshizhen(void);
void sshizhen(void);


void port_init(void)

{
//	PORTA = 0x3b;//3b	1:output 0=input 00111011
//	DDRA  = 0xDF;
	PORTA	= 	0x80;	//0xe1;  //11100001  10000000
	DDRA	=	0xbf;	//0xef;  //11101111	10111111
//	PORTB = 0x08; 00001000
//	DDRB  = 0xfd;//#01111101B;//
	PORTB	=	0xc0;		//待定
	DDRB	=	0x3f;		
//	PORTC = 0xF1;	11110001
//	DDRC  = 0x6E;
	PORTC = 0x93;	//0xb1;  //10000001	10010011
	DDRC  = 0xdF;	//0x7e;  //01111110	11011111
//	PORTD = 0x2F;	00101111
//	DDRD  = 0x00;
	PORTD = 0x73; //01010011
	//PORTD = 0xdf; //11011111
	DDRD  = 0xac; //10101100
//	PORTE = 0xff;	11111111
//	DDRE  = 0xac;//input
	PORTE = 0x93;			//高3位显示待定
	DDRE  = 0xec;//input 11101100 10010011
//	PORTF = 0x00;//AD口	00000000
//	DDRF  = 0x0e;
	PORTF = 0x08;//AD口
	DDRF  = 0x00;
//	PORTG = 0x08;	00001000
//	DDRG  = 0x04;	
	PORTG = 0x05;	//00000101
	DDRG  = 0x05;  //00000101
	SPCR = 0x1C;
	//SPSR = 0x01;
}
//Watchdog initialize
// prescale: 1024K
void watchdog_init(void)/* 看门狗用上了,要试一下*/
{
	WDR(); //this prevents a timout on enabling
	WDTCR=0x1f;
	WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs
}
//TIMER0 initialize - prescale:32
// WGM: Normal
// desired value: 2KHz
// actual value:  2.000KHz (0.0%)
void timer0_init(void)
{
	//TCCR0 = 0x00; //stop
	//ASSR  = 0x00; //set async mode
	//TCNT0 = TIMER0_DATA;//set count
	//OCR0  = 0x7D; //比较寄存器,无用//0xFA 16M
	//TCCR0 = 0x07; //start timer		//0X03

	ASSR = 0x00;					//set async mode
	TCNT0 = 0;						//set count
	OCR0 = 100;
	TCCR0 = (1<<WGM01)|(1<<COM00)|(1<<CS01)|(1<<CS00);		//start timer
}
//TIMER1 initialize - prescale:8
// WGM: 5) PWM 8bit fast, TOP=0x00FF
// desired value: 10KHz
// actual value:  7.813KHz (28.0%)
void timer1_init(void)//注意不用中断产生 占空比可变的方波
{
	/*TCCR1B = 0x00; //stop
	TCNT1H = 0x00; //setup 0xFF 初始值送0000,计数到满0x00ff后自动清0,
	TCNT1L = 0x00;//0x01
	//OCR1AH = 0x00;//只有A匹配//产生方波,OC1A输出,同时匹配值随时可变.
	//OCR1AL = 0x00;
	OCR1AH = 0x00;//unused
	OCR1AL = 0xFF;
	//OCR1BH = 0x00;//unused
	//OCR1BL = 0xFF;
	OCR1BH = 0x00;//只有B匹配
	OCR1BL = 0x00;
	OCR1CH = 0x00;//unused
	OCR1CL = 0xFF;
	ICR1H  = 0x00;
	ICR1L  = 0xFF;
	//TCCR1A = 0x81;//C1 反向  //正向时,0x21则是B匹配,OC1B输出, 0x09则是C匹配,OC1C输出
	TCCR1A = 0x21;
	TCCR1B = 0x0a; //start Timer 8分频 TCCR1B|=0x08;//表示快速中*/
}
//TIMER2 initialize - prescale:256分频 //溢出清除标志
// WGM: Normal
// desired value: 1KHz
// actual value:  1.008KHz (0.8%)
void timer2_init(void)/*TIFR&=~BIT(TOV2);T2溢出标志位清除,计数31为1ms,T2不中断,只计数*/
{
	TCCR2 = 0x00; //stop
	TCNT2 = 0x00; //setup e1
	OCR2  = 0x1F; //输出比较寄存器,这里没有用
	TCCR2 = 0x04; //start
}

//TIMER3 initialize
void timer3_init(void)/*TIFR&=~BIT(TOV2);T2溢出标志位清除,计数31为1ms,T2不中断,只计数*/
{	
	TCCR3A = 0x00;
	TCCR3B = 0x00; //stop
	TCNT3H = 0xFF; //1MS定时
	TCNT3L = 0x06;
	TCCR3B = 0x03; //start Timer 64分频 4us
}

#pragma vector= INT4_vect//:6
__interrupt void int4_isr(void)//int4
{
	uchar j;
	TCCR2 = 0x00;
	if(first_int_f==0)
	{
		remote_data=0;
		remote_data1=0;
		remote_bit=0;
		first_int_f=1;
	}
	else
	{
		j=TCNT2;
		if(j<TIMER2_SMALL||j>TIMER2_LARGE)
		{
			first_int_f=0;
			remote_bit=0;
		}
		else
		{
			remote_bit++;
			remote_data<<=1;
			if(j>TIMER2_MIDDLE)
			remote_data|=BIT(0);
			switch(remote_bit)
			{
				case 8:
				remote_data1=remote_data;
				break;
				case 16:
				remote_data2=remote_data;
				if(remote_data1==0x18)
				{
					if(remote_continue_f==1)
					{
						if(remote_data2!=remote_data2bak)
						{
							remote_continue_f=1;
							remote_counter1=0;
							remote_data2bak=remote_data2;
						}
						else
						{
							switch(remote_data2)
							{
								case 0x0e://左
								case 0x0f://?

									if(((address_buffer&0xf0)==0x60)||((address_buffer&0xf0)==0x70)||((address_buffer&0xf0)==0x90))
									{
										remote_counter1++;
										if(remote_counter1<5)remote_data2=0xff;//500ms
										else {remote_counter1=4;}
									}
								else	remote_data2=0xff;
								break;
								case 0x15:	//vol+
								break;
								case 0x14:	//vol-
								break;
								case 0x00:	//standby
								break;
								default:		//其余按键不连续用 //遥控取数取remote_data2
								remote_data2=0xff;
								break;
							}
						}
					}
					else
					{
						remote_continue_f=1;
						remote_counter1=0;
						remote_data2bak=remote_data2;
					}
					first_int_f=0;
				}
				else
				remote_data2=0xff;
				remote_bit=0;
				remote_data=0;
				remote_data1=0;
				first_int_f=0;
				break;
				default:
				break;
			}
		}
	}
	remote_counter=0x00;
	TCNT2 = 0x00; //
	TCCR2 = 0x04;
}

/*
#pragma vector= TIMER0_OVF_vect//:17
__interrupt void timer0_ovf_isr(void)
{
	SEI();
	TCNT0 = TIMER0_DATA; //reload counter value	    //500us定时
	remote_counter++;
	grid_counter++;
	counter_1ms++;
	//if(counter_1ms%10 == 0)
	//{
		time_flag|=BIT(FLAG_5MS);	//10us标志位
	//}
	
	if(counter_1ms>=2)
	{
		counter_1ms=0;
		counter_10ms++;
		time_flag|=BIT(FLAG_10MS);	//10us标志位
	}
	if(grid_counter==13)grid_counter=0;//如不稳定改成>=

}*/

#pragma vector= TIMER3_OVF_vect//:17
__interrupt void timer3_ovf_isr(void)
{
	SEI();
	TCNT3H = 0xFF; 					//1MS定时
	TCNT3L = 0xe1;					//0x06   0x83
	
	//VFD_isr();					//转移到LED_FLASH里去
	
	Rotary_Proc();				//加按键灯
	
	LED_Flash();

	if (LED_Flash_Timer != 0)
	{
		LED_Flash_Timer--;
	}
	
	if(counter_1ms%8 == 0)
	{
		remote_counter++;
	}
	//grid_counter++;
	counter_1ms++;
	if(counter_1ms%40 == 0)
	{
		time_flag|=BIT(FLAG_5MS);	//5MS标志位
	}
	
	if(counter_1ms>=80)
	{
		counter_1ms=0;
		counter_10ms++;
		time_flag|=BIT(FLAG_10MS);	//10ms标志位

		b_stop_beep_timer++;		
		if (po_buzzer() && b_stop_beep_timer>=10)
		{
			po_buzzer_set(0);
		}		
	}
	//if(grid_counter==13)grid_counter=0;/*如不稳定改成>=*/
	
}

void adc_init(void)
{
	ADCSRA = 0x00; //disable adc
	ADMUX = 0x00; //select adc input 0
	ACSR  = 0x80;
	ADCSRB = 0x00;
	ADCSRA = 0x82;
	//Current_Spect=SpectrumTable[0];
}
#pragma vector= ADC_vect//:22
__interrupt void adc_isr(void)
{
	static unsigned char last;
	unsigned char tmp,tmp2,step;
	SEI();
    //PORTE ^= 1<<4;
    step=Using_Temporary[0];
    ADCSRA=0xae;
    ADMUX=64+32+AD_TIME;
	if(step==0)
	{
		last=AD_Bias;
	}
	if(step<192)
	{
		tmp=ADCH;
		if(step<64)
		{
			if(tmp>last)
			{
				Using_Temporary[1]|=4;
			}
			tmp2=tmp-AD_Bias;
			if(tmp2 & 128)
			{
				tmp2=0-tmp2;
			}
			if(tmp2<Using_Temporary[3])
			{
				if(Using_Temporary[1] & 4)
				{
					if(tmp>last)
					{
						Using_Temporary[3]=tmp2;
						Using_Temporary[2]=step;
					}
				}
				else
				{
					Using_Temporary[3]=tmp2;
					Using_Temporary[2]=step;
				}
			}
		}
		if(step==97)
		{
			Using_Temporary[1] |= 1;
		}
		Using_Temporary[step+3]=tmp;
		last=tmp;
		ADCSRA=0xbe;
	}
	else
	{
		ADC_BREAK;
		ADCSRA=0x83;
		if(step==(192+48+10))step=192;
	}
	step++;
	Using_Temporary[0]=step;
	return;
}
/*#define TWPS0 0
#define TWPS1 1
#define TWEN  2
#define TWIE  0
#define TWEA  6
#define TWINT 7
#define TWSTA 5
#define TWSTO 4 */
void twi_init(void)

⌨️ 快捷键说明

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