門限滯回設(shè)置的C程序代碼
將接近檢測傳感器集成到系統(tǒng)后,一個(gè)經(jīng)常遇到的問題是如何正確選擇接近檢測的門限,以便在用戶通話期間打開或關(guān)閉屏幕。門限設(shè)置須確保出現(xiàn)錯(cuò)誤判斷的幾率非常低,而且能夠支持絕大多數(shù)使用者的情況。
門限滯回例程
#define MAX44000_ADDR 0x94 #define INT_STATUS_REG 0x00 #define OFF_THRESHOLD 4600 #define OFF_DELAY 1 #define ON_THRESHOLD 4000 #define ON_DELAY 3 uint8 screenStatus; // 0 means off, 1 means on /* i2cWriteBytes() Arguments: uint8 address - device address uint8 start_reg - register where the first byte is written uint8 *data - data to write uint8 nbytes - number of bytes to write Consecutively writes several bytes to some i2c device starting at some specified address -- implemented elsewhere */ void i2cWriteBytes(uint8 address,uint8 start_reg,uint8 *data,uint8 nbytes); /* MAX44000InterruptHandler()
以下代碼用于實(shí)現(xiàn)MAX44000 INT引腳的中斷處理,假設(shè)MAX44000的接近檢測傳感器設(shè)置為14位模式,并已使能中斷。此外,假設(shè)屏幕狀態(tài)初始化為1或0,詳細(xì)信息請(qǐng)參閱數(shù)據(jù)資料的寄存器說明部分。
*/ void MAX44000InterruptHandler() { uint8 i2cData[3]; i2cRead1Byte(MAX44000_ADDR,INT_STATUS_REG,&i2cData); if (i2cData&0x01 != 0) return; // check to make sure interrupt really fired // this simultaneously clears the interrupt flag if (screenStatus) { i2cData[0] = ON_DELAY; i2cData[1] = ON_THRESHOLD >> 8 & 0xBF; // set ABOVE = 0 i2cData[2] = ON_THRESHOLD & 0xFF; } else { i2cData[0] = OFF_DELAY; i2cData[1] = OFF_THRESHOLD >> 8 | 0x40; // set ABOVE = 1 i2cData[2] = OFF_THRESHOLD & 0xFF; } // set the new threshold depending on what the screen status was // set the delay and threshold after each interrupt i2cWriteBytes(MAX44000_ADDR,0x0A,i2cData,3); return; } // MAX44000InterruptHandler