欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
AT32F107配觸摸IC(vk3816ip)的程序問題
[打印本頁]
作者:
jinni_wu
時間:
2021-8-23 17:42
標題:
AT32F107配觸摸IC(vk3816ip)的程序問題
請各位大神幫忙看到軟件哪里問題,怎么讀到的按鍵值(觸摸TP1、 TP2、TP3)都是一樣的。每10MS秒調用這個函數
key_get()
。附件為AT32F107配VK3816ip的原理圖。
無標題.png
(176.95 KB, 下載次數: 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++);
}
}
//--------------------------------------------------------------------------------------------------
//函數名稱: void sendStart()
//函數功能: IIC 的起始位
//函數輸入: 無
//函數輸出: 無
//中間變量: 無
//--------------------------------------------------------------------------------------------------
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);
}
//--------------------------------------------------------------------------------------------------
//函數名稱: void sendStop()
//函數功能: IIC 的結束位
//函數輸入: 無
//函數輸出: 無
//中間變量: 無
//--------------------------------------------------------------------------------------------------
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();
}
//--------------------------------------------------------------------------------------------------
//函數名稱: bit readACK()
//函數功能: 讀取 IIC 的 acknowledge 標志位
//函數輸入: 無
//函數輸出: IIC 的 ACK 信號 返回 1 表示無 acknowledge,0 表示有 acknowledge
//中間變量: 無
//--------------------------------------------------------------------------------------------------
BYTE readACK() //讀取應答信號
{
I2C_DAT_OUTPUT();
//SCL=0;
I2C_CLK_CLR();
// SDA=1; /*此處為釋放 SDA 總線,由從從機發出低電平應答*/
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
}
}
//--------------------------------------------------------------------------------------------------
//函數名稱: void sendACK()
//函數功能: 主控端送出應答信號
//函數輸入: 無
//函數輸出: 無
//中間變量: 無
//--------------------------------------------------------------------------------------------------
void sendACK() //輸出應答信號
{
//SCL=0;
I2C_DAT_OUTPUT();
I2C_CLK_CLR();
// SDA=0;
I2C_DAT_CLR();
Delay_us(1);
//SCL=1;
I2C_CLK_SET();
}
//--------------------------------------------------------------------------------------------------
//函數名稱: void sendNOACK()
//函數功能: 主控端送出無應答信號
//函數輸入: 無
//函數輸出: 無
//中間變量: 無
//--------------------------------------------------------------------------------------------------
void sendNOACK() //輸出無應答信號
{
//SCL=0;
I2C_DAT_OUTPUT();
I2C_CLK_CLR();
// SDA=0;
I2C_DAT_SET();
Delay_us(1);
//SCL=1;
I2C_CLK_SET();
}
//--------------------------------------------------------------------------------------------------
//函數名稱: void sendByte(uchar dat)
//函數功能: 主控端寫一個字節到從機
//函數輸入: dat = 發送的字節
//函數輸出: 無
//中間變量: i
//--------------------------------------------------------------------------------------------------
void sendByte(BYTE dat) //寫一個字節
{
BYTE i;
I2C_DAT_OUTPUT();
Delay_us(2);
for(i=0;i<8;i++)
{
//SCL=0; /*鉗住 I2C 總線,準備發送數據 */
I2C_CLK_CLR();
if(dat&0x80)
{
//SDA=1;
I2C_DAT_SET();
}
else
{
//SDA=0;
I2C_DAT_CLR();
}
Delay_us(2);
/*如果需要在 SDA,SCL,INT 上串接電阻,根據電阻大小不同,電阻越大建議將該
時間適當加長,100KHZ 以內即可;*/
//SCL=1;
I2C_CLK_SET();
/*此處由于 51 單片機的特性不需要做輸入輸出設置,
但如果是其他單片機需要先將其 IO 口改為輸入上拉的設置,讀到高之后,SCL 轉為輸出為高。
在讀寫完 ACK 后的第一個 clock 下降緣從機會鉗住 SCL 腳做資料處理,
所以將 SCL 腳置為輸入上拉,并等待 SCL 被釋放。*/
Delay_us(2);
dat<<=1;
}
}
//--------------------------------------------------------------------------------------------------
//函數名稱: uchar readByte()
//函數功能: 主控端對從機讀取一個字節
//函數輸入: 無
//函數輸出: 讀取完成的字節
//中間變量: i, dat
//--------------------------------------------------------------------------------------------------
BYTE readByte() //讀一個字節
{
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 上串接電阻,根據電阻大小不同,電阻越大建議將該
時間適當加長,100KHZ 以內即可;*/
dat<<=1;
//SCL=1;
I2C_CLK_SET();
/*此處由于 51 單片機的特性不需要做輸入輸出設置,
但如果是其他單片機需要先將其 IO 口改為輸入上拉的設置,讀到高之后,SCL 轉為輸出為高。
在讀寫完 ACK 后的第一個 clock 下降緣從機會鉗住 SCL 腳做資料處理,
所以將 SCL 腳置為輸入上拉,并等待 SCL 被釋放。*/
I2C_DAT_INPUT();
delay_rtc(20);
if(I2C_DAT_READ()==1)
dat|=0x01;
}
return dat;
}
//--------------------------------------------------------------------------------------------------
//函數名稱: bit writeIIC(uchar addrW, uchar *writeData, uchar length)
//函數功能: 主控端對從機數據寫入
//函數輸入: addrW = 從機地址及寫入旗幟
// *writeData = 預備寫入數據的首個地址
// length = 寫入數據的長度(字節數)
//函數輸出: 返回 IIC 通訊的 acknowledge 狀態,若為 1,則停止并返回。若為 0,則完成通訊后返回
//中間變量: i, ACK
//--------------------------------------------------------------------------------------------------
BYTE writeIIC(BYTE addrW, BYTE *writeData, BYTE length)
{
BYTE i;
BYTE ACK;
sendStart();
sendByte(addrW); //傳送地址與寫入標記
ACK = readACK();
if (ACK)
{
sendStop(); //地址不正確或裝置未連接,送出停止信號
return ACK;
}
for(i = 0; i<length; i++)
{
sendByte(writeData[i]);
ACK = readACK();
if (ACK)
{
sendStop(); //未接收到 ACK,送出停止信號
return ACK;
}
}
sendStop(); //資料寫入完成,送出停止信號
return ACK;
}
//--------------------------------------------------------------------------------------------------
//函數名稱: bit readIIC(uchar addrR, uchar *readData, uchar length)
//函數功能: 主控端對從機數據讀取
//函數輸入: addrR = 從機地址及讀取旗幟
// *readData = 預備讀取后存放數據的首個地址
// length = 讀取數據的長度(字節數)
//函數輸出: 返回 IIC 通訊的 acknowledge 狀態,若為 1,則停止并返回。若為 0,則完成通訊后返回
//中間變量: i, ACK
//--------------------------------------------------------------------------------------------------
BYTE readIIC(BYTE addrR, BYTE *readData, BYTE length)
{
BYTE i;
BYTE ACK;
sendStart();
sendByte(addrR); //傳送地址與讀取標記
ACK = readACK();
if (ACK)
{
sendStop(); //地址不正確或裝置未連接,送出停止信號
return ACK;
}
for(i = 0; i<length; i++)
{
readData[i] = readByte();
if(i<length-1)
sendACK();
else
sendNOACK(); //讀取最后一筆資料,送出 No ACK
}
sendStop(); //資料讀取完成,送出停止信號
return ACK;
}
//--------------------------------------------------------------------------------------------------
//函數名稱: void setWrite_Buffer_3(uchar byte1, uchar byte2, uchar byte3)
//函數功能: 寫入 3 個字節到寫入緩存寄存器
//函數輸入: byte1
// byte2
// byte3
//函數輸出: 無
//中間變量: 無
//--------------------------------------------------------------------------------------------------
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); //讀取按鍵狀態
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
復制代碼
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1