|
請(qǐng)各位大神幫忙看到軟件哪里問題,怎么讀到的按鍵值(觸摸TP1、 TP2、TP3)都是一樣的。每10MS秒調(diào)用這個(gè)函數(shù) key_get()。附件為AT32F107配VK3816ip的原理圖。
無標(biāo)題.png (176.95 KB, 下載次數(shù): 50)
下載附件
原理圖
2021-8-23 17:41 上傳
- #include "config.h"
- #include "mainCycle.h"
- #include "vk3816ip.h"
- #include "at32_board.h"
- #ifdef SUPPORT_VK3816
- BYTE Write_Buffer[3]; //主控端的寫入資料緩存
- BYTE Read_Buffer[3]; //主控端的讀取資料緩存
- void delay_rtc(BYTE dl)
- {
- BYTE t;
- WORD i;
- for (t=0; t<dl; t++);
- {
- for (i=0; i<12; i++);
- }
- }
- //--------------------------------------------------------------------------------------------------
- //函數(shù)名稱: void sendStart()
- //函數(shù)功能: IIC 的起始位
- //函數(shù)輸入: 無
- //函數(shù)輸出: 無
- //中間變量: 無
- //--------------------------------------------------------------------------------------------------
- void sendStart()
- { //EA=0;
- //SDA=1;
- //SCL=1;
- I2C_DAT_OUTPUT();
- I2C_DAT_SET();
- I2C_CLK_SET();
- Delay_us(1);
- //SDA=0;
- I2C_DAT_CLR();
- Delay_us(5);
- //SCL=0;
- I2C_CLK_CLR();
- Delay_us(1);
- }
- //--------------------------------------------------------------------------------------------------
- //函數(shù)名稱: void sendStop()
- //函數(shù)功能: IIC 的結(jié)束位
- //函數(shù)輸入: 無
- //函數(shù)輸出: 無
- //中間變量: 無
- //--------------------------------------------------------------------------------------------------
- void sendStop()
- {
- // SDA=0;
- //SCL=0;
- I2C_DAT_OUTPUT();
- I2C_CLK_CLR();
- I2C_DAT_CLR();
- Delay_us(1);
- //SCL=1;
- I2C_CLK_SET();
- Delay_us(1);
- //SDA=1;
- I2C_DAT_SET();
- }
- //--------------------------------------------------------------------------------------------------
- //函數(shù)名稱: bit readACK()
- //函數(shù)功能: 讀取 IIC 的 acknowledge 標(biāo)志位
- //函數(shù)輸入: 無
- //函數(shù)輸出: IIC 的 ACK 信號(hào) 返回 1 表示無 acknowledge,0 表示有 acknowledge
- //中間變量: 無
- //--------------------------------------------------------------------------------------------------
- BYTE readACK() //讀取應(yīng)答信號(hào)
- {
- I2C_DAT_OUTPUT();
- //SCL=0;
- I2C_CLK_CLR();
- // SDA=1; /*此處為釋放 SDA 總線,由從從機(jī)發(fā)出低電平應(yīng)答*/
- I2C_DAT_SET();
- Delay_us(1);
- I2C_DAT_INPUT();
- //SCL=1;
- Delay_us(5);
- I2C_CLK_SET();
- Delay_us(1);
- if(I2C_DAT_READ()==1)
- {
- return 1; //no ACK
- }
- else
- {
- return 0; //ACK
- }
- }
- //--------------------------------------------------------------------------------------------------
- //函數(shù)名稱: void sendACK()
- //函數(shù)功能: 主控端送出應(yīng)答信號(hào)
- //函數(shù)輸入: 無
- //函數(shù)輸出: 無
- //中間變量: 無
- //--------------------------------------------------------------------------------------------------
- void sendACK() //輸出應(yīng)答信號(hào)
- {
- //SCL=0;
- I2C_DAT_OUTPUT();
- I2C_CLK_CLR();
- // SDA=0;
- I2C_DAT_CLR();
- Delay_us(1);
- //SCL=1;
- I2C_CLK_SET();
- }
- //--------------------------------------------------------------------------------------------------
- //函數(shù)名稱: void sendNOACK()
- //函數(shù)功能: 主控端送出無應(yīng)答信號(hào)
- //函數(shù)輸入: 無
- //函數(shù)輸出: 無
- //中間變量: 無
- //--------------------------------------------------------------------------------------------------
- void sendNOACK() //輸出無應(yīng)答信號(hào)
- {
- //SCL=0;
- I2C_DAT_OUTPUT();
- I2C_CLK_CLR();
- // SDA=0;
- I2C_DAT_SET();
- Delay_us(1);
- //SCL=1;
- I2C_CLK_SET();
- }
- //--------------------------------------------------------------------------------------------------
- //函數(shù)名稱: void sendByte(uchar dat)
- //函數(shù)功能: 主控端寫一個(gè)字節(jié)到從機(jī)
- //函數(shù)輸入: dat = 發(fā)送的字節(jié)
- //函數(shù)輸出: 無
- //中間變量: i
- //--------------------------------------------------------------------------------------------------
- void sendByte(BYTE dat) //寫一個(gè)字節(jié)
- {
- BYTE i;
- I2C_DAT_OUTPUT();
- Delay_us(2);
- for(i=0;i<8;i++)
- {
- //SCL=0; /*鉗住 I2C 總線,準(zhǔn)備發(fā)送數(shù)據(jù) */
- I2C_CLK_CLR();
- if(dat&0x80)
- {
- //SDA=1;
- I2C_DAT_SET();
- }
- else
- {
- //SDA=0;
- I2C_DAT_CLR();
- }
- Delay_us(2);
- /*如果需要在 SDA,SCL,INT 上串接電阻,根據(jù)電阻大小不同,電阻越大建議將該
- 時(shí)間適當(dāng)加長(zhǎng),100KHZ 以內(nèi)即可;*/
- //SCL=1;
- I2C_CLK_SET();
- /*此處由于 51 單片機(jī)的特性不需要做輸入輸出設(shè)置,
- 但如果是其他單片機(jī)需要先將其 IO 口改為輸入上拉的設(shè)置,讀到高之后,SCL 轉(zhuǎn)為輸出為高。
- 在讀寫完 ACK 后的第一個(gè) clock 下降緣從機(jī)會(huì)鉗住 SCL 腳做資料處理,
- 所以將 SCL 腳置為輸入上拉,并等待 SCL 被釋放。*/
- Delay_us(2);
- dat<<=1;
- }
- }
- //--------------------------------------------------------------------------------------------------
- //函數(shù)名稱: uchar readByte()
- //函數(shù)功能: 主控端對(duì)從機(jī)讀取一個(gè)字節(jié)
- //函數(shù)輸入: 無
- //函數(shù)輸出: 讀取完成的字節(jié)
- //中間變量: i, dat
- //--------------------------------------------------------------------------------------------------
- BYTE readByte() //讀一個(gè)字節(jié)
- {
- BYTE i, dat=0;
- I2C_DAT_INPUT();
- Delay_us(2);
- for(i=0;i<8;i++)
- {
- //SCL=0;
- I2C_CLK_CLR();
- //SDA=1;
- I2C_DAT_SET();
- Delay_us(2);
- //_nop_();
- /*如果需要在 SDA,SCL,INT 上串接電阻,根據(jù)電阻大小不同,電阻越大建議將該
- 時(shí)間適當(dāng)加長(zhǎng),100KHZ 以內(nèi)即可;*/
- dat<<=1;
- //SCL=1;
- I2C_CLK_SET();
- /*此處由于 51 單片機(jī)的特性不需要做輸入輸出設(shè)置,
- 但如果是其他單片機(jī)需要先將其 IO 口改為輸入上拉的設(shè)置,讀到高之后,SCL 轉(zhuǎn)為輸出為高。
- 在讀寫完 ACK 后的第一個(gè) clock 下降緣從機(jī)會(huì)鉗住 SCL 腳做資料處理,
- 所以將 SCL 腳置為輸入上拉,并等待 SCL 被釋放。*/
- I2C_DAT_INPUT();
- delay_rtc(20);
- if(I2C_DAT_READ()==1)
- dat|=0x01;
- }
- return dat;
- }
- //--------------------------------------------------------------------------------------------------
- //函數(shù)名稱: bit writeIIC(uchar addrW, uchar *writeData, uchar length)
- //函數(shù)功能: 主控端對(duì)從機(jī)數(shù)據(jù)寫入
- //函數(shù)輸入: addrW = 從機(jī)地址及寫入旗幟
- // *writeData = 預(yù)備寫入數(shù)據(jù)的首個(gè)地址
- // length = 寫入數(shù)據(jù)的長(zhǎng)度(字節(jié)數(shù))
- //函數(shù)輸出: 返回 IIC 通訊的 acknowledge 狀態(tài),若為 1,則停止并返回。若為 0,則完成通訊后返回
- //中間變量: i, ACK
- //--------------------------------------------------------------------------------------------------
- BYTE writeIIC(BYTE addrW, BYTE *writeData, BYTE length)
- {
- BYTE i;
- BYTE ACK;
- sendStart();
- sendByte(addrW); //傳送地址與寫入標(biāo)記
- ACK = readACK();
- if (ACK)
- {
- sendStop(); //地址不正確或裝置未連接,送出停止信號(hào)
- return ACK;
- }
- for(i = 0; i<length; i++)
- {
- sendByte(writeData[i]);
- ACK = readACK();
- if (ACK)
- {
- sendStop(); //未接收到 ACK,送出停止信號(hào)
- return ACK;
- }
- }
- sendStop(); //資料寫入完成,送出停止信號(hào)
- return ACK;
- }
- //--------------------------------------------------------------------------------------------------
- //函數(shù)名稱: bit readIIC(uchar addrR, uchar *readData, uchar length)
- //函數(shù)功能: 主控端對(duì)從機(jī)數(shù)據(jù)讀取
- //函數(shù)輸入: addrR = 從機(jī)地址及讀取旗幟
- // *readData = 預(yù)備讀取后存放數(shù)據(jù)的首個(gè)地址
- // length = 讀取數(shù)據(jù)的長(zhǎng)度(字節(jié)數(shù))
- //函數(shù)輸出: 返回 IIC 通訊的 acknowledge 狀態(tài),若為 1,則停止并返回。若為 0,則完成通訊后返回
- //中間變量: i, ACK
- //--------------------------------------------------------------------------------------------------
- BYTE readIIC(BYTE addrR, BYTE *readData, BYTE length)
- {
- BYTE i;
- BYTE ACK;
- sendStart();
- sendByte(addrR); //傳送地址與讀取標(biāo)記
- ACK = readACK();
- if (ACK)
- {
- sendStop(); //地址不正確或裝置未連接,送出停止信號(hào)
- return ACK;
- }
- for(i = 0; i<length; i++)
- {
- readData[i] = readByte();
- if(i<length-1)
- sendACK();
- else
- sendNOACK(); //讀取最后一筆資料,送出 No ACK
- }
- sendStop(); //資料讀取完成,送出停止信號(hào)
- return ACK;
- }
- //--------------------------------------------------------------------------------------------------
- //函數(shù)名稱: void setWrite_Buffer_3(uchar byte1, uchar byte2, uchar byte3)
- //函數(shù)功能: 寫入 3 個(gè)字節(jié)到寫入緩存寄存器
- //函數(shù)輸入: byte1
- // byte2
- // byte3
- //函數(shù)輸出: 無
- //中間變量: 無
- //--------------------------------------------------------------------------------------------------
- void setWrite_Buffer_3(BYTE byte1, BYTE byte2, BYTE byte3)
- {
- Write_Buffer[0] = byte1;
- Write_Buffer[1] = byte2;
- Write_Buffer[2] = byte3;
- }
- DWORD Read_key(void)
- {
- BYTE ACK=0;
- DWORD key_value=0;
- ACK = readIIC(address_R, Read_Buffer, 3); //讀取按鍵狀態(tài)
- key_value = Read_Buffer[0];
- key_value <<= 8;
- key_value |= Read_Buffer[1];
- key_value <<= 8;
- key_value |= Read_Buffer[2];
- #ifdef USER_USART_PRINTF
- //printf("\n==Read_key== key_value=%x\n",key_value);
- #endif
- return key_value;
-
- }
- BYTE key_array_scan(void)
- {
- DWORD key;
- static DWORD key_pre;
- BYTE key_value;
- key_value=NO_KEY_DETECT;
- key=Read_key()&0x0fffff;
- #ifdef USER_USART_PRINTF
- if(key_pre!=key)
- {
- key_pre=key;
- printf("\n==Read_key== key=%x\n",key);
- }
- #endif
- if(key!=0x0fffff)
- {
- switch(key)
- {
- case 0xee:
- key_value=KEY_UP;
- break;
- case 0xed:
- key_value=KEY_DOWN;
- break;
- case 0xef:
- key_value=KEY_MENU;
- break;
- case 0xe0fff:
- key_value=KEY_BELL;
- break;
- default:
- key_value=NO_KEY_DETECT;
- break;
- }
- }
- return (key_value);
- }
- <font color="Red">BYTE key_get(DWORD *key_value)</font>
- {
- static BYTE key_counter = 0;
- static BYTE key_buffer = 0xff;
- static BOOL key_is_release = FALSE;
- BYTE key_type;
- BYTE key_temp;
- key_type = NONE_KEY;
-
- key_temp = key_array_scan();
- if ((key_temp != 0xff) && (key_temp == key_buffer))
- {
- if (key_is_release == TRUE)
- {
- key_counter++;
- if (key_counter >= LONG_KEY_TIMES) // get a long key
- {
- key_type = LONG_KEY;
- key_counter = 0;
- key_is_release = FALSE;
- }
- }
-
- }
- else
- {
- if (key_is_release == TRUE)
- {
- if (key_counter >= SHORT_KEY_TIMES )
- {
- key_type = SHORT_KEY; // get a short key
- key_temp = key_buffer;
- key_buffer = NO_KEY_DETECT;
- }
- else
- {
- key_buffer = key_temp; //none key detect
- }
- }
- else
- {
- key_type = NONE_KEY;
- key_is_release = TRUE;
- }
- key_counter = 0;
-
- }
-
-
- *key_value = key_temp;
- return key_type;
-
- }
- void vk3816_init(void)
- {
- BYTE ACK;
- //SINT = 1;
- I2C_CLK_ENABLE();
- I2C_CLK_OUTPUT();
- I2C_CLK_SET();
-
- I2C_DAT_ENABLE() ;
- I2C_DAT_OUTPUT();
- I2C_DAT_SET();
-
- setWrite_Buffer_3(0xB1, 0x83, 0x00);
- ACK = writeIIC(address_W, Write_Buffer, 3); //MCU Setting
- setWrite_Buffer_3(0xC0, 0x10, 0x00);
- ACK = writeIIC(address_W, Write_Buffer, 3); //TP0 Threshold
- setWrite_Buffer_3(0xC1, 0x10, 0x00);
- ACK = writeIIC(address_W, Write_Buffer, 3); //TP1 Threshold
- setWrite_Buffer_3(0xC2, 0x10, 0x00);
- ACK = writeIIC(address_W, Write_Buffer, 3); //TP2 Threshold
- setWrite_Buffer_3(0xC3, 0x10, 0x00);
- ACK = writeIIC(address_W, Write_Buffer, 3); //TP3 Threshold
- setWrite_Buffer_3(0xC4, 0x10, 0x00);
- ACK = writeIIC(address_W, Write_Buffer, 3); //TP4 Threshold
- setWrite_Buffer_3(0xC5, 0x10, 0x00);
- ACK = writeIIC(address_W, Write_Buffer, 3); //TP5 Threshold
- setWrite_Buffer_3(0xC6, 0x10, 0x00);
- ACK = writeIIC(address_W, Write_Buffer, 3); //TP6 Threshold
- setWrite_Buffer_3(0xC7, 0x10, 0x00);
- ACK = writeIIC(address_W, Write_Buffer, 3); //TP7 Threshold
- setWrite_Buffer_3(0xC8, 0x10, 0x00);
- ACK = writeIIC(address_W, Write_Buffer, 3); //TP8 Threshold
- setWrite_Buffer_3(0xC9, 0x10, 0x00);
- ACK = writeIIC(address_W, Write_Buffer, 3); //TP9 Threshold
- setWrite_Buffer_3(0xCA, 0x10, 0x00);
- ACK = writeIIC(address_W, Write_Buffer, 3); //TP10 Threshold
- setWrite_Buffer_3(0xCB, 0x10, 0x00);
- ACK = writeIIC(address_W, Write_Buffer, 3); //TP11 Threshold
- setWrite_Buffer_3(0xCC, 0x10, 0x00);
- ACK = writeIIC(address_W, Write_Buffer, 3); //TP12 Threshold
- setWrite_Buffer_3(0xCD, 0x10, 0x00);
- ACK = writeIIC(address_W, Write_Buffer, 3); //TP13 Threshold
- setWrite_Buffer_3(0xCE, 0x10, 0x00);
- ACK = writeIIC(address_W, Write_Buffer, 3); //TP14 Threshold
- setWrite_Buffer_3(0xCF, 0x10, 0x00);
- ACK = writeIIC(address_W, Write_Buffer, 3); //TP15 Threshold
- //setWrite_Buffer_3(0xD0, 0x02, 0x00);
- //ACK = writeIIC(address_W, &Write_Buffer, 3); //Sleep Threshold
- Delay_us(50);
- }
- #endif
復(fù)制代碼
|
|