找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1282|回复: 0
收起左侧

AT32F107配触摸IC(vk3816ip)的程序问题

[复制链接]
ID:878906 发表于 2021-8-23 17:42 | 显示全部楼层 |阅读模式
请各位大神帮忙看到软件哪里问题,怎么读到的按键值(触摸TP1、 TP2、TP3)都是一样的。每10MS秒调用这个函数 key_get()。附件为AT32F107配VK3816ip的原理图。

原理图

原理图

  1. #include "config.h"
  2. #include "mainCycle.h"
  3. #include "vk3816ip.h"
  4. #include "at32_board.h"

  5. #ifdef SUPPORT_VK3816

  6. BYTE Write_Buffer[3]; //主控端的写入资料缓存
  7. BYTE Read_Buffer[3]; //主控端的读取资料缓存


  8. void delay_rtc(BYTE dl)
  9. {
  10.         BYTE t;
  11.         WORD i;
  12.         for (t=0; t<dl; t++);
  13.         {
  14.                 for (i=0; i<12; i++);
  15.         }

  16. }

  17. //--------------------------------------------------------------------------------------------------
  18. //函数名称: void sendStart()
  19. //函数功能: IIC 的起始位
  20. //函数输入: 无
  21. //函数输出: 无
  22. //中间变量: 无
  23. //--------------------------------------------------------------------------------------------------

  24. void sendStart()
  25. {  //EA=0;
  26.    //SDA=1;
  27.    //SCL=1;
  28.    I2C_DAT_OUTPUT();
  29.    I2C_DAT_SET();
  30.    I2C_CLK_SET();
  31.    Delay_us(1);
  32.    //SDA=0;
  33.    I2C_DAT_CLR();
  34.    Delay_us(5);
  35.    //SCL=0;
  36.    I2C_CLK_CLR();
  37.    Delay_us(1);
  38. }

  39. //--------------------------------------------------------------------------------------------------
  40. //函数名称: void sendStop()
  41. //函数功能: IIC 的结束位
  42. //函数输入: 无
  43. //函数输出: 无
  44. //中间变量: 无
  45. //--------------------------------------------------------------------------------------------------
  46. void sendStop()
  47. {
  48.   // SDA=0;
  49.    //SCL=0;
  50.            I2C_DAT_OUTPUT();
  51.         I2C_CLK_CLR();
  52.         I2C_DAT_CLR();
  53.         Delay_us(1);
  54.         //SCL=1;
  55.         I2C_CLK_SET();
  56.         Delay_us(1);
  57.         //SDA=1;
  58.         I2C_DAT_SET();
  59. }

  60. //--------------------------------------------------------------------------------------------------
  61. //函数名称: bit readACK()
  62. //函数功能: 读取 IIC 的 acknowledge 标志位
  63. //函数输入: 无
  64. //函数输出: IIC 的 ACK 信号 返回 1 表示无 acknowledge,0 表示有 acknowledge
  65. //中间变量: 无
  66. //--------------------------------------------------------------------------------------------------
  67. BYTE readACK() //读取应答信号
  68. {
  69.         I2C_DAT_OUTPUT();
  70.         //SCL=0;
  71.         I2C_CLK_CLR();
  72.         // SDA=1; /*此处为释放 SDA 总线,由从从机发出低电平应答*/
  73.         I2C_DAT_SET();
  74.         Delay_us(1);
  75.         I2C_DAT_INPUT();
  76.         //SCL=1;
  77.         Delay_us(5);
  78.         I2C_CLK_SET();
  79.         Delay_us(1);
  80.         if(I2C_DAT_READ()==1)
  81.         {
  82.                 return 1; //no ACK
  83.         }
  84.         else
  85.         {
  86.                 return 0; //ACK
  87.         }
  88. }

  89. //--------------------------------------------------------------------------------------------------
  90. //函数名称: void sendACK()
  91. //函数功能: 主控端送出应答信号
  92. //函数输入: 无
  93. //函数输出: 无
  94. //中间变量: 无
  95. //--------------------------------------------------------------------------------------------------
  96. void sendACK() //输出应答信号
  97. {
  98.         //SCL=0;
  99.         I2C_DAT_OUTPUT();
  100.         I2C_CLK_CLR();
  101.         // SDA=0;
  102.         I2C_DAT_CLR();
  103.         Delay_us(1);
  104.         //SCL=1;
  105.         I2C_CLK_SET();
  106. }
  107. //--------------------------------------------------------------------------------------------------
  108. //函数名称: void sendNOACK()
  109. //函数功能: 主控端送出无应答信号
  110. //函数输入: 无
  111. //函数输出: 无
  112. //中间变量: 无
  113. //--------------------------------------------------------------------------------------------------
  114. void sendNOACK() //输出无应答信号
  115. {
  116.         //SCL=0;
  117.         I2C_DAT_OUTPUT();
  118.         I2C_CLK_CLR();
  119.         // SDA=0;
  120.         I2C_DAT_SET();
  121.         Delay_us(1);
  122.         //SCL=1;
  123.         I2C_CLK_SET();
  124. }

  125. //--------------------------------------------------------------------------------------------------
  126. //函数名称: void sendByte(uchar dat)
  127. //函数功能: 主控端写一个字节到从机
  128. //函数输入: dat = 发送的字节
  129. //函数输出: 无
  130. //中间变量: i
  131. //--------------------------------------------------------------------------------------------------
  132. void sendByte(BYTE dat) //写一个字节
  133. {
  134.         BYTE i;
  135.         I2C_DAT_OUTPUT();
  136.         Delay_us(2);
  137.         for(i=0;i<8;i++)
  138.         {
  139.                 //SCL=0; /*钳住 I2C 总线,准备发送数据 */
  140.                 I2C_CLK_CLR();
  141.                 if(dat&0x80)
  142.                 {
  143.                         //SDA=1;
  144.                         I2C_DAT_SET();
  145.                 }
  146.                 else
  147.                 {
  148.                         //SDA=0;
  149.                         I2C_DAT_CLR();
  150.                 }

  151.                 Delay_us(2);
  152.                 /*如果需要在 SDA,SCL,INT 上串接电阻,根据电阻大小不同,电阻越大建议将该
  153.                 时间适当加长,100KHZ 以内即可;*/
  154.                 //SCL=1;
  155.                 I2C_CLK_SET();
  156.                 /*此处由于 51 单片机的特性不需要做输入输出设置,
  157.                 但如果是其他单片机需要先将其 IO 口改为输入上拉的设置,读到高之后,SCL 转为输出为高。
  158.                 在读写完 ACK 后的第一个 clock 下降缘从机会钳住 SCL 脚做资料处理,
  159.                 所以将 SCL 脚置为输入上拉,并等待 SCL 被释放。*/
  160.                 Delay_us(2);
  161.                 dat<<=1;
  162.         }
  163. }
  164. //--------------------------------------------------------------------------------------------------
  165. //函数名称: uchar readByte()
  166. //函数功能: 主控端对从机读取一个字节
  167. //函数输入: 无
  168. //函数输出: 读取完成的字节
  169. //中间变量: i, dat
  170. //--------------------------------------------------------------------------------------------------
  171. BYTE readByte() //读一个字节
  172. {
  173.         BYTE i, dat=0;
  174.         I2C_DAT_INPUT();
  175.         Delay_us(2);
  176.         for(i=0;i<8;i++)
  177.         {
  178.                 //SCL=0;
  179.                 I2C_CLK_CLR();
  180.                 //SDA=1;
  181.                 I2C_DAT_SET();
  182.                 Delay_us(2);
  183.                 //_nop_();
  184.                 /*如果需要在 SDA,SCL,INT 上串接电阻,根据电阻大小不同,电阻越大建议将该
  185.                 时间适当加长,100KHZ 以内即可;*/
  186.                 dat<<=1;
  187.                 //SCL=1;
  188.                 I2C_CLK_SET();
  189.                 /*此处由于 51 单片机的特性不需要做输入输出设置,
  190.                 但如果是其他单片机需要先将其 IO 口改为输入上拉的设置,读到高之后,SCL 转为输出为高。
  191.                 在读写完 ACK 后的第一个 clock 下降缘从机会钳住 SCL 脚做资料处理,
  192.                 所以将 SCL 脚置为输入上拉,并等待 SCL 被释放。*/
  193.                 I2C_DAT_INPUT();
  194.                 delay_rtc(20);
  195.                 if(I2C_DAT_READ()==1)
  196.                         dat|=0x01;
  197.         }
  198.         return dat;
  199. }

  200. //--------------------------------------------------------------------------------------------------
  201. //函数名称: bit writeIIC(uchar addrW, uchar *writeData, uchar length)
  202. //函数功能: 主控端对从机数据写入
  203. //函数输入: addrW = 从机地址及写入旗帜
  204. // *writeData = 预备写入数据的首个地址
  205. // length = 写入数据的长度(字节数)
  206. //函数输出: 返回 IIC 通讯的 acknowledge 状态,若为 1,则停止并返回。若为 0,则完成通讯后返回
  207. //中间变量: i, ACK
  208. //--------------------------------------------------------------------------------------------------
  209. BYTE writeIIC(BYTE addrW, BYTE *writeData, BYTE length)
  210. {
  211.         BYTE i;
  212.         BYTE ACK;
  213.         sendStart();
  214.         sendByte(addrW); //传送地址与写入标记
  215.         ACK = readACK();
  216.         if (ACK)
  217.         {
  218.                 sendStop(); //地址不正确或装置未连接,送出停止信号
  219.                 return ACK;
  220.         }
  221.         for(i = 0; i<length; i++)
  222.         {
  223.                 sendByte(writeData[i]);
  224.                 ACK = readACK();
  225.                 if (ACK)
  226.                 {
  227.                         sendStop(); //未接收到 ACK,送出停止信号
  228.                         return ACK;
  229.                 }
  230.         }
  231.         sendStop(); //资料写入完成,送出停止信号
  232.         return ACK;
  233. }
  234. //--------------------------------------------------------------------------------------------------
  235. //函数名称: bit readIIC(uchar addrR, uchar *readData, uchar length)
  236. //函数功能: 主控端对从机数据读取
  237. //函数输入: addrR = 从机地址及读取旗帜
  238. // *readData = 预备读取后存放数据的首个地址
  239. // length = 读取数据的长度(字节数)
  240. //函数输出: 返回 IIC 通讯的 acknowledge 状态,若为 1,则停止并返回。若为 0,则完成通讯后返回
  241. //中间变量: i, ACK
  242. //--------------------------------------------------------------------------------------------------
  243. BYTE readIIC(BYTE addrR, BYTE *readData, BYTE length)
  244. {
  245.         BYTE i;
  246.         BYTE ACK;
  247.         sendStart();
  248.         sendByte(addrR); //传送地址与读取标记
  249.         ACK = readACK();
  250.         if (ACK)
  251.         {
  252.                 sendStop(); //地址不正确或装置未连接,送出停止信号
  253.                 return ACK;
  254.         }
  255.         for(i = 0; i<length; i++)
  256.         {
  257.                 readData[i] = readByte();
  258.                 if(i<length-1)
  259.                         sendACK();
  260.                 else
  261.                         sendNOACK(); //读取最后一笔资料,送出 No ACK
  262.         }
  263.         sendStop(); //资料读取完成,送出停止信号
  264.         return ACK;
  265. }
  266. //--------------------------------------------------------------------------------------------------
  267. //函数名称: void setWrite_Buffer_3(uchar byte1, uchar byte2, uchar byte3)
  268. //函数功能: 写入 3 个字节到写入缓存寄存器
  269. //函数输入: byte1
  270. // byte2
  271. // byte3
  272. //函数输出: 无
  273. //中间变量: 无
  274. //--------------------------------------------------------------------------------------------------
  275. void setWrite_Buffer_3(BYTE byte1, BYTE byte2, BYTE byte3)
  276. {
  277.          Write_Buffer[0] = byte1;
  278.          Write_Buffer[1] = byte2;
  279.          Write_Buffer[2] = byte3;
  280. }



  281. DWORD Read_key(void)
  282. {
  283.          BYTE ACK=0;
  284.         DWORD key_value=0;
  285.         ACK = readIIC(address_R, Read_Buffer, 3); //读取按键状态
  286.         key_value = Read_Buffer[0];
  287.         key_value <<= 8;
  288.         key_value |= Read_Buffer[1];
  289.         key_value <<= 8;
  290.         key_value |= Read_Buffer[2];
  291. #ifdef USER_USART_PRINTF        
  292.         //printf("\n==Read_key== key_value=%x\n",key_value);
  293. #endif        
  294.         return key_value;
  295.         
  296. }

  297. BYTE key_array_scan(void)
  298. {
  299.         DWORD key;
  300.         static DWORD key_pre;
  301.         BYTE  key_value;
  302.         key_value=NO_KEY_DETECT;
  303.         key=Read_key()&0x0fffff;  
  304. #ifdef USER_USART_PRINTF
  305.         if(key_pre!=key)
  306.         {
  307.                 key_pre=key;
  308.                 printf("\n==Read_key== key=%x\n",key);
  309.         }
  310. #endif        

  311.         if(key!=0x0fffff)
  312.         {
  313.                 switch(key)
  314.                 {
  315.                         case   0xee:
  316.                                 key_value=KEY_UP;
  317.                                 break;
  318.                         case  0xed:
  319.                                 key_value=KEY_DOWN;
  320.                                 break;
  321.                         case  0xef:
  322.                                 key_value=KEY_MENU;
  323.                                 break;
  324.                         case  0xe0fff:
  325.                                 key_value=KEY_BELL;
  326.                                 break;
  327.                         default:
  328.                                 key_value=NO_KEY_DETECT;
  329.                                 break;        
  330.                 }
  331.         }
  332.                 return (key_value);
  333. }

  334. <font color="Red">BYTE  key_get(DWORD *key_value)</font>
  335. {
  336.         static BYTE key_counter = 0;
  337.         static BYTE key_buffer = 0xff;
  338.         static BOOL key_is_release = FALSE;
  339.         BYTE key_type;
  340.         BYTE key_temp;

  341.         key_type = NONE_KEY;
  342.         
  343.         key_temp = key_array_scan();
  344.         if ((key_temp != 0xff) && (key_temp == key_buffer))
  345.         {
  346.                 if (key_is_release == TRUE)
  347.                 {
  348.                         key_counter++;

  349.                         if (key_counter >= LONG_KEY_TIMES)  // get a long key
  350.                         {
  351.                                 key_type = LONG_KEY;
  352.                                 key_counter = 0;        
  353.                                 key_is_release = FALSE;
  354.                         }
  355.                 }
  356.                  
  357.         }
  358.         else
  359.         {
  360.                 if (key_is_release == TRUE)
  361.                 {
  362.                         if (key_counter >= SHORT_KEY_TIMES )
  363.                         {
  364.                                 key_type = SHORT_KEY;       // get a short key
  365.                                 key_temp = key_buffer;
  366.                                 key_buffer = NO_KEY_DETECT;

  367.                         }
  368.                         else
  369.                         {
  370.                                 key_buffer = key_temp;      //none key detect
  371.                         }
  372.                 }
  373.                 else
  374.                 {
  375.                         key_type = NONE_KEY;
  376.                         key_is_release = TRUE;
  377.                 }
  378.                 key_counter = 0;
  379.                

  380.         }
  381.         
  382.         
  383.         *key_value = key_temp;


  384.         return key_type;

  385.         
  386. }
  387. void vk3816_init(void)
  388. {
  389.          BYTE ACK;
  390.          //SINT = 1;
  391.         I2C_CLK_ENABLE();
  392.         I2C_CLK_OUTPUT();
  393.         I2C_CLK_SET();
  394.         
  395.         I2C_DAT_ENABLE() ;
  396.         I2C_DAT_OUTPUT();
  397.         I2C_DAT_SET();
  398.         
  399.          setWrite_Buffer_3(0xB1, 0x83, 0x00);
  400.         ACK = writeIIC(address_W, Write_Buffer, 3); //MCU Setting
  401.          setWrite_Buffer_3(0xC0, 0x10, 0x00);
  402.          ACK = writeIIC(address_W, Write_Buffer, 3); //TP0 Threshold
  403.          setWrite_Buffer_3(0xC1, 0x10, 0x00);
  404.          ACK = writeIIC(address_W, Write_Buffer, 3); //TP1 Threshold
  405.          setWrite_Buffer_3(0xC2, 0x10, 0x00);
  406.          ACK = writeIIC(address_W, Write_Buffer, 3); //TP2 Threshold
  407.          setWrite_Buffer_3(0xC3, 0x10, 0x00);
  408.          ACK = writeIIC(address_W, Write_Buffer, 3); //TP3 Threshold
  409.          setWrite_Buffer_3(0xC4, 0x10, 0x00);
  410.          ACK = writeIIC(address_W, Write_Buffer, 3); //TP4 Threshold
  411.          setWrite_Buffer_3(0xC5, 0x10, 0x00);
  412.          ACK = writeIIC(address_W, Write_Buffer, 3); //TP5 Threshold

  413.          setWrite_Buffer_3(0xC6, 0x10, 0x00);
  414.          ACK = writeIIC(address_W, Write_Buffer, 3); //TP6 Threshold
  415.          setWrite_Buffer_3(0xC7, 0x10, 0x00);
  416.          ACK = writeIIC(address_W, Write_Buffer, 3); //TP7 Threshold
  417.          setWrite_Buffer_3(0xC8, 0x10, 0x00);
  418.          ACK = writeIIC(address_W, Write_Buffer, 3); //TP8 Threshold
  419.          setWrite_Buffer_3(0xC9, 0x10, 0x00);
  420.          ACK = writeIIC(address_W, Write_Buffer, 3); //TP9 Threshold
  421.          setWrite_Buffer_3(0xCA, 0x10, 0x00);
  422.         ACK = writeIIC(address_W, Write_Buffer, 3); //TP10 Threshold
  423.          setWrite_Buffer_3(0xCB, 0x10, 0x00);
  424.         ACK = writeIIC(address_W, Write_Buffer, 3); //TP11 Threshold
  425.          setWrite_Buffer_3(0xCC, 0x10, 0x00);
  426.         ACK = writeIIC(address_W, Write_Buffer, 3); //TP12 Threshold
  427.          setWrite_Buffer_3(0xCD, 0x10, 0x00);
  428.         ACK = writeIIC(address_W, Write_Buffer, 3); //TP13 Threshold
  429.          setWrite_Buffer_3(0xCE, 0x10, 0x00);
  430.         ACK = writeIIC(address_W, Write_Buffer, 3); //TP14 Threshold
  431.          setWrite_Buffer_3(0xCF, 0x10, 0x00);
  432.         ACK = writeIIC(address_W, Write_Buffer, 3); //TP15 Threshold
  433.          //setWrite_Buffer_3(0xD0, 0x02, 0x00);
  434.          //ACK = writeIIC(address_W, &Write_Buffer, 3); //Sleep Threshold
  435.          Delay_us(50);
  436. }

  437. #endif
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表