📄 asuro 014, build 003, frontswitches test by system led.c
字号:
//================================================================================
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 + -