找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1639|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

AT32F107配觸摸IC(vk3816ip)的程序問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
請(qǐng)各位大神幫忙看到軟件哪里問題,怎么讀到的按鍵值(觸摸TP1、 TP2、TP3)都是一樣的。每10MS秒調(diào)用這個(gè)函數(shù) 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. //函數(shù)名稱: void sendStart()
  19. //函數(shù)功能: IIC 的起始位
  20. //函數(shù)輸入: 無
  21. //函數(shù)輸出: 無
  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. //函數(shù)名稱: void sendStop()
  41. //函數(shù)功能: IIC 的結(jié)束位
  42. //函數(shù)輸入: 無
  43. //函數(shù)輸出: 無
  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. //函數(shù)名稱: bit readACK()
  62. //函數(shù)功能: 讀取 IIC 的 acknowledge 標(biāo)志位
  63. //函數(shù)輸入: 無
  64. //函數(shù)輸出: IIC 的 ACK 信號(hào) 返回 1 表示無 acknowledge,0 表示有 acknowledge
  65. //中間變量: 無
  66. //--------------------------------------------------------------------------------------------------
  67. BYTE readACK() //讀取應(yīng)答信號(hào)
  68. {
  69.         I2C_DAT_OUTPUT();
  70.         //SCL=0;
  71.         I2C_CLK_CLR();
  72.         // SDA=1; /*此處為釋放 SDA 總線,由從從機(jī)發(fā)出低電平應(yīng)答*/
  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. //函數(shù)名稱: void sendACK()
  91. //函數(shù)功能: 主控端送出應(yīng)答信號(hào)
  92. //函數(shù)輸入: 無
  93. //函數(shù)輸出: 無
  94. //中間變量: 無
  95. //--------------------------------------------------------------------------------------------------
  96. void sendACK() //輸出應(yīng)答信號(hào)
  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. //函數(shù)名稱: void sendNOACK()
  109. //函數(shù)功能: 主控端送出無應(yīng)答信號(hào)
  110. //函數(shù)輸入: 無
  111. //函數(shù)輸出: 無
  112. //中間變量: 無
  113. //--------------------------------------------------------------------------------------------------
  114. void sendNOACK() //輸出無應(yīng)答信號(hào)
  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. //函數(shù)名稱: void sendByte(uchar dat)
  127. //函數(shù)功能: 主控端寫一個(gè)字節(jié)到從機(jī)
  128. //函數(shù)輸入: dat = 發(fā)送的字節(jié)
  129. //函數(shù)輸出: 無
  130. //中間變量: i
  131. //--------------------------------------------------------------------------------------------------
  132. void sendByte(BYTE dat) //寫一個(gè)字節(jié)
  133. {
  134.         BYTE i;
  135.         I2C_DAT_OUTPUT();
  136.         Delay_us(2);
  137.         for(i=0;i<8;i++)
  138.         {
  139.                 //SCL=0; /*鉗住 I2C 總線,準(zhǔn)備發(fā)送數(shù)據(jù) */
  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 上串接電阻,根據(jù)電阻大小不同,電阻越大建議將該
  153.                 時(shí)間適當(dāng)加長(zhǎng),100KHZ 以內(nèi)即可;*/
  154.                 //SCL=1;
  155.                 I2C_CLK_SET();
  156.                 /*此處由于 51 單片機(jī)的特性不需要做輸入輸出設(shè)置,
  157.                 但如果是其他單片機(jī)需要先將其 IO 口改為輸入上拉的設(shè)置,讀到高之后,SCL 轉(zhuǎn)為輸出為高。
  158.                 在讀寫完 ACK 后的第一個(gè) clock 下降緣從機(jī)會(huì)鉗住 SCL 腳做資料處理,
  159.                 所以將 SCL 腳置為輸入上拉,并等待 SCL 被釋放。*/
  160.                 Delay_us(2);
  161.                 dat<<=1;
  162.         }
  163. }
  164. //--------------------------------------------------------------------------------------------------
  165. //函數(shù)名稱: uchar readByte()
  166. //函數(shù)功能: 主控端對(duì)從機(jī)讀取一個(gè)字節(jié)
  167. //函數(shù)輸入: 無
  168. //函數(shù)輸出: 讀取完成的字節(jié)
  169. //中間變量: i, dat
  170. //--------------------------------------------------------------------------------------------------
  171. BYTE readByte() //讀一個(gè)字節(jié)
  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 上串接電阻,根據(jù)電阻大小不同,電阻越大建議將該
  185.                 時(shí)間適當(dāng)加長(zhǎng),100KHZ 以內(nèi)即可;*/
  186.                 dat<<=1;
  187.                 //SCL=1;
  188.                 I2C_CLK_SET();
  189.                 /*此處由于 51 單片機(jī)的特性不需要做輸入輸出設(shè)置,
  190.                 但如果是其他單片機(jī)需要先將其 IO 口改為輸入上拉的設(shè)置,讀到高之后,SCL 轉(zhuǎn)為輸出為高。
  191.                 在讀寫完 ACK 后的第一個(gè) clock 下降緣從機(jī)會(huì)鉗住 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. //函數(shù)名稱: bit writeIIC(uchar addrW, uchar *writeData, uchar length)
  202. //函數(shù)功能: 主控端對(duì)從機(jī)數(shù)據(jù)寫入
  203. //函數(shù)輸入: addrW = 從機(jī)地址及寫入旗幟
  204. // *writeData = 預(yù)備寫入數(shù)據(jù)的首個(gè)地址
  205. // length = 寫入數(shù)據(jù)的長(zhǎng)度(字節(jié)數(shù))
  206. //函數(shù)輸出: 返回 IIC 通訊的 acknowledge 狀態(tài),若為 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); //傳送地址與寫入標(biāo)記
  215.         ACK = readACK();
  216.         if (ACK)
  217.         {
  218.                 sendStop(); //地址不正確或裝置未連接,送出停止信號(hào)
  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,送出停止信號(hào)
  228.                         return ACK;
  229.                 }
  230.         }
  231.         sendStop(); //資料寫入完成,送出停止信號(hào)
  232.         return ACK;
  233. }
  234. //--------------------------------------------------------------------------------------------------
  235. //函數(shù)名稱: bit readIIC(uchar addrR, uchar *readData, uchar length)
  236. //函數(shù)功能: 主控端對(duì)從機(jī)數(shù)據(jù)讀取
  237. //函數(shù)輸入: addrR = 從機(jī)地址及讀取旗幟
  238. // *readData = 預(yù)備讀取后存放數(shù)據(jù)的首個(gè)地址
  239. // length = 讀取數(shù)據(jù)的長(zhǎng)度(字節(jié)數(shù))
  240. //函數(shù)輸出: 返回 IIC 通訊的 acknowledge 狀態(tài),若為 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); //傳送地址與讀取標(biāo)記
  249.         ACK = readACK();
  250.         if (ACK)
  251.         {
  252.                 sendStop(); //地址不正確或裝置未連接,送出停止信號(hào)
  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(); //資料讀取完成,送出停止信號(hào)
  264.         return ACK;
  265. }
  266. //--------------------------------------------------------------------------------------------------
  267. //函數(shù)名稱: void setWrite_Buffer_3(uchar byte1, uchar byte2, uchar byte3)
  268. //函數(shù)功能: 寫入 3 個(gè)字節(jié)到寫入緩存寄存器
  269. //函數(shù)輸入: byte1
  270. // byte2
  271. // byte3
  272. //函數(shù)輸出: 無
  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); //讀取按鍵狀態(tài)
  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
復(fù)制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表