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

📄 asuro 014, build 003, frontswitches test by system led.c

📁 014 Asuro小车示例源码 Switch Test.rar
💻 C
📖 第 1 页 / 共 2 页
字号:
//================================================================================
void vInitAdcSingleShotSwitchDetection(void){

  //+-------------------------------------------------------------------------------------------+
  //| ADCSRA = ADC Control and Status Register A                                                |
  //+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
  SFRX ( ADCSRA , ADEN_H  | ADSC_L  | ADFR_L  | ADIF_L  | ADIE_L  | ADPS2_H | ADPS1_H | ADPS0_L );
  //+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
  //                 1         .         .         .         .         .         .         .    = AD-Converter enable
  //                 .         0         .         .         .         .         .         .    = no start AD conversion
  //                 .         .         0         .         .         .         .         .    = no free running mode
  //                 .         .         .         0         .         .         .         .    = interrupt (or: conversion finished)
  //                 .         .         .         .         0         .         .         .    = no AD interrupt enable
  //                 .         .         .         .         .         n         n         n    = ADC prescaler
  //                 .         .         .         .         .         n         n         n    = 000 =   2, 001=2, 002=4, 003=8, 004=16, 005=32
  //                 .         .         .         .         .         1         1         0    = 110 =  64
  //                 .         .         .         .         .         n         n         n    = 111 = 128
  //+-------------------------------------------------------------------------------------------+

  //+-------------------------------------------------------------------------------------------+
  //| ADMUX = ADC Multiplexer Selection Register                                                |
  //+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
  SFRX ( ADMUX  , REFS1_L | REFS0_H | ADLAR_L | NONE4_L | MUX3_L  | MUX2_H  | MUX1_L  | MUX0_L  );
  //+-----------+---------+---------+---------+---------+---------+---------+---------+---------+
  //                 n         n         .         .         .         .         .         .    = 00 = reference voltage is external pin AREF
  //                 0         1         .         .         .         .         .         .    = 01 = reference voltage is external pin AVCC (with capacitor on AREF)
  //                 n         n         .         .         .         .         .         .    = 10 = not used
  //                 n         n         .         .         .         .         .         .    = 11 = internal 2.45V reference (with capacitor on AREF)
  //                 .         .         0         .         .         .         .         .    = 0 = left justified, 1 = right justified (10-bit AD value shift to left/right side of 16bit result)
  //                 .         .         .         0         .         .         .         .    = not connected
  //                 .         .         .         .         1         1         1         0    = 1.23V bandgap as ADC input voltage
  //                 .         .         .         .         1         1         1         1    = GND as ADC input voltage
  //                 .         .         .         .         0         n         n         n    = 0000-0111 = select any uproc inputs as ADC input voltage
  //                 .         .         .         .         0         1         0         0    = 0100 = select ADC4/Pin27 = Asuro switches
  //+-------------------------------------------------------------------------------------------+

}
//--------------------------------------------------------------------------------
//	HVW POLL SWITCH
//--------------------------------------------------------------------------------
unsigned char ucHvwPollSwitch (void){

	//var
	unsigned int uiAdcVal;

	//start single AD conversion
	SFRX(ADCSRA,ADSC_H);

	//wait until AD-conversion is finished (ADSC-bit low)
	while(CHK_BYTE_BIT_SET(ADCSRA,ADSC_H));

	//add low-value-byte and high-value-byte from AD-converter into single 16-bit integer
	uiAdcVal = ADCL + (ADCH << 8);

	//return: 0-1023 converted to 0-63
	return ( (unsigned char) ((( 1024.0/(float)uiAdcVal - 1.0)) * 63.0 + 0.5));

}
//================================================================================
//	MAIN
//================================================================================
int main(void){

	//var
	int iLgtBlkCnt;
	int i;
	unsigned char ucSwiPrs;

	//stop 36KHz timer2 (left active by boot sector!) but does not harm anything
	SFRX(TCCR2,CS22_L|CS21_L|CS20_L);

	//init all ports
	vInitAllPorts();
	
	//init ad-converter for oneshot operation mode for Asuro switch detection
	vInitAdcSingleShotSwitchDetection();

	//---connect-high-end-of-switch-resistor-network-to-VCC---
	//define interrupt-pin/switch-network-control-pin INT1 as output
	SFRX(DDRD ,SWI_IAC_O);
	//set interrupt-pin/switch-network-control-pin as high
	SFRX(PORTD,SWI_IAC_H);

	//switch front led off
	SET_FRONT_LED_OFF;
	//switch red system led off
	SET_RED_SYSTM_LED_OFF;
	//switch green system led off
	SET_GRN_SYSTM_LED_OFF;

	//endless loop
	while(1){

		//clear light blink count
		iLgtBlkCnt=0;

		//get Asuro-front-switch switch-press data
		ucSwiPrs=ucHvwPollSwitch();

		//analyse pressed switch
		switch(ucSwiPrs){
			//switch1 pressed, prepair led to blink 1 time
			case SWITCH_K1: iLgtBlkCnt=1; break;
			//switch2 pressed, prepair led to blink 2 times
			case SWITCH_K2: iLgtBlkCnt=2; break;
			//switch3 pressed, prepair led to blink 3 times
			case SWITCH_K3: iLgtBlkCnt=3; break;
			//switch4 pressed, prepair led to blink 4 times
			case SWITCH_K4: iLgtBlkCnt=4; break;
			//switch5 pressed, prepair led to blink 5 times
			case SWITCH_K5: iLgtBlkCnt=5; break;
			//switch6 pressed, prepair led to blink 6 times
			case SWITCH_K6: iLgtBlkCnt=6; break;
		}//end switch
		
		//---blink-red-system-led-according-blink-counts---

		//for all blinking counts do
		for(i=0;i<iLgtBlkCnt;i++){
			//switch red system led on
			SET_RED_SYSTM_LED_ON;
			//delay
			vDelayMilliSeconds(200);
			//switch red system led off
			SET_RED_SYSTM_LED_OFF;
			//delay
			vDelayMilliSeconds(200);
		}
		
		//---blink-green-system-led-once-(if-no-keypress-detected)---

		//if no Asuro front-switch press is detected
		if(iLgtBlkCnt==0){
			//switch green system led on
			SET_GRN_SYSTM_LED_ON;
			//delay
			vDelayMilliSeconds(200);
			//switch green system led on
			SET_GRN_SYSTM_LED_OFF;
			//delay
			vDelayMilliSeconds(200);
		}

		//delay
		vDelayMilliSeconds(600);

	}//while

	//exit function
	return 0;
	
}

⌨️ 快捷键说明

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