请各位大神帮忙看到软件哪里问题,怎么读到的按键值(触摸TP1、 TP2、TP3)都是一样的。每10MS秒调用这个函数 key_get()。附件为AT32F107配VK3816ip的原理图。
原理图
- #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
复制代码
|