标题:
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://www.51hei.com/bbs/)
Powered by Discuz! X3.1