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

QQ登錄

只需一步,快速開始

帖子
查看: 10784|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

STC8G1K08T單片機(jī)觸摸按鍵應(yīng)用程序與原理圖

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主

  1. /*------------------------------------------------------------------*/
  2. /* --- STC MCU International Limited -------------------------------*/
  3. /* --- STC 1T Series MCU RC Demo -----------------------------------*/
  4. /* If you want to use the program or the program referenced in the  */
  5. /* article, please specify in which data and procedures from STC    */
  6. /*------------------------------------------------------------------*/


  7. /*********************************************************/

  8. #define MAIN_Fosc        11059200L        //定義主時(shí)鐘

  9. #include        "..\..\STC8Gxxx.h"


  10. /*************        功能說(shuō)明        **************
  11. 請(qǐng)先別修改程序, 直接下載HEX文件測(cè)試, 下載時(shí)選擇主頻11.0592MHz.

  12. 本程序支持11個(gè)按鍵, 觸摸按鍵簡(jiǎn)單處理和識(shí)別:

  13. P1.0(TK07)   P1.1(TK06)   P1.3(TK04)   P1.4(TK03)   P1.5(TK02)   P1.6(TK01)   P5.4(TK00)
  14. P3.2(TK13)   P3.3(TK12)   P3.4(TK11)   P3.5(TK10)

  15. P3.6為觸摸指示, 當(dāng)按鍵觸摸時(shí), 輸出低電平點(diǎn)亮LED, 不觸摸時(shí)LED滅.
  16. P3.0 P3.1為串口1, 當(dāng)有觸摸動(dòng)作時(shí), 串口返回觸摸的鍵碼(ASCII碼 00~15 對(duì)應(yīng)TK00~TK15).
  17. 往串口發(fā)送字符'R'或'r', 返回各個(gè)按鍵的讀數(shù)值.

  18. 本例測(cè)試板的參考電容為333(0.033uF), TK00~TK07觸摸時(shí)讀數(shù)會(huì)降低2000左右, TK08~TK15觸摸時(shí)讀數(shù)會(huì)降低3000左右.
  19. 上電后先讀鍵200次但不處理鍵, 然后將此時(shí)的讀數(shù)作為0點(diǎn).


  20. ******************************************/


  21. /*************        本地常量聲明        **************/



  22. /*************        本地變量聲明        **************/
  23. bit        B_TX1_Busy;        // 發(fā)送忙標(biāo)志

  24. u16        idata TK_cnt[16];
  25. u8        read_cnt;
  26. u8        cmd;
  27. u16        idata TK_zero[16];


  28. /*************        本地函數(shù)聲明        **************/
  29. void        UART1_config(u32 brt, u8 io);        // brt: 通信波特率. io=0: 串口1切換到P3.0 P3.1,  =1: 切換到P3.6 P3.7, =2: 切換到P1.6 P1.7,  =3: 切換到P4.3 P4.4.
  30. void         UART1_PrintString(u8 *puts);
  31. void         UART1_TxByte(u8 dat);
  32. void        ReturnValue(u8 ch);
  33. void         Readkey(void);



  34. /****************  外部函數(shù)聲明和外部變量聲明 *****************/


  35. /******************** 主函數(shù) **************************/
  36. void main(void)
  37. {
  38.         u8        i;
  39.         
  40.         P3n_standard(0xc3);
  41.         UART1_config(115200L, 0);                // brt: 通信波特率. io=0: 串口1切換到P3.0 P3.1
  42.         EA = 1;                //允許全局中斷
  43.         UART1_PrintString("11個(gè)觸摸按鍵測(cè)試程序\r\n");

  44.         P_SW2 |= 0x80;        //允許訪問(wèn)XSF

  45. //        XOSCCR = 0xc0;                              //啟動(dòng)外部晶振
  46. //        while (!(XOSCCR & 1));                      //等待時(shí)鐘穩(wěn)定
  47. //        CLKDIV = 0x00;                              //時(shí)鐘不分頻
  48. //        CKSEL = 0x01;                               //選擇外部晶振

  49.         TSRT = 0x00;                //沒(méi)有LED分時(shí)掃描
  50.         TSCHEN1 = 0xdf;        //TK00~TK04, TK05, TK06, TK07
  51.         TSCHEN2 = 0x3c;        //TK10~TK13
  52.         TSCFG1  = (7<<4) + 6;        //開關(guān)電容工作頻率 = fosc/(2*(TSCFG1[6:4]+1)), 放電時(shí)間(系統(tǒng)時(shí)鐘周期數(shù)) 0(125) 1(250) 2(500) 3(1000) 4(2000) 5(2500) 6(5000) 7(7500) 最小3
  53.         TSCFG2  = 1;                        //配置觸摸按鍵控制器的內(nèi)部參考電壓(AVCC的分壓比), 0(1/4)  1(1/2)  2(5/8)  3(3/4)
  54.         TSCTRL = (1<<7);                        //開始自動(dòng)掃描, 無(wú)平均, B7: TSGO,  B6: SINGLE,  B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP
  55. //        TSCTRL = (1<<7) + (1<<6);        //開始單次掃描, 無(wú)平均
  56. //        TSCTRL = (1<<7) + (1<<6)+3;        //開始單次掃描, 4次平均
  57. //        TSCTRL = (1<<7) + (1<<6)+1;        //開始單次掃描, 2次平均
  58.         
  59. //        P_SW2 &= ~0x80;                //禁止訪問(wèn)xsf


  60.         for(read_cnt=0; read_cnt<200; )        Readkey();                //讀200次鍵, 將此值作為未觸摸時(shí)的0點(diǎn), 要求上電時(shí)不要觸摸按鍵
  61.         for(i=0; i<16; i++)                TK_zero[i] = TK_cnt[i];        //保存0點(diǎn)

  62.         
  63.         while (1)
  64.         {
  65.                 Readkey();
  66.                 if(read_cnt >= 50)        //控制檢測(cè)按鍵的速度
  67.                 {
  68.                         read_cnt = 0;
  69.                         P36 = 1;        //滅LED
  70.                         for(i=0; i<8; i++)
  71.                         {
  72.                                 if(TK_cnt[i] <= (TK_zero[i]-1000))        //TK00~TK07觸摸時(shí)讀數(shù)會(huì)降低2000左右, 則(0點(diǎn)-1000)為判斷鍵的閾值.
  73.                                 {
  74.                                         if(i != 5)        //TK05無(wú)效
  75.                                         {
  76.                                                 UART1_TxByte(i/10+'0');                //鍵按下, 則返回鍵號(hào)
  77.                                                 UART1_TxByte(i%10+'0');
  78.                                                 UART1_TxByte(0x0d);
  79.                                                 UART1_TxByte(0x0a);
  80.                                                 P36 = 0;        //亮LED
  81.                                         }
  82.                                 }
  83.                         }
  84.                         for(i=10; i<14; i++)
  85.                         {
  86.                                 if(TK_cnt[i] <= (TK_zero[i]-1500))                //TK08~TK15觸摸時(shí)讀數(shù)會(huì)降低3000左右, 則(0點(diǎn)-1000)為判斷鍵的閾值.
  87.                                 {
  88.                                         UART1_TxByte(i/10+'0');                //鍵按下, 則返回鍵號(hào)
  89.                                         UART1_TxByte(i%10+'0');
  90.                                         UART1_TxByte(0x0d);
  91.                                         UART1_TxByte(0x0a);
  92.                                         P36 = 0;        //亮LED
  93.                                 }
  94.                         }
  95.                 }
  96.                
  97.                
  98.                 if((cmd == 'R') || (cmd == 'r'))        //串口請(qǐng)求返回信息
  99.                 {
  100.                         for(i=0; i<16; i++)        ReturnValue(i);        //返回各個(gè)通道的讀數(shù)
  101.                         cmd  = 0;
  102.                 }
  103.         }
  104. }
  105. /**********************************************/
  106.   
  107. //========================================================================
  108. // 函數(shù): void        ReturnValue(u8 ch)
  109. // 描述: 返回一個(gè)通道的讀數(shù)。
  110. // 參數(shù): ch: 通道數(shù).
  111. // 返回: none.
  112. // 版本: VER1.0
  113. // 日期: 2010-12-15
  114. // 備注:
  115. //========================================================================
  116. void        ReturnValue(u8 ch)
  117. {
  118.         u16        j;
  119.         j = TK_cnt[ch];
  120.         UART1_TxByte('K');
  121.         UART1_TxByte(ch/10+'0');
  122.         UART1_TxByte(ch%10+'0');
  123.         UART1_TxByte('=');
  124.         UART1_TxByte(j / 10000 + '0');
  125.         UART1_TxByte((j % 10000)/1000 + '0');
  126.         UART1_TxByte((j % 1000)/100 + '0');
  127.         UART1_TxByte((j % 100)/10 + '0');
  128.         UART1_TxByte(j % 10 + '0');
  129.         UART1_TxByte(0x0d);
  130.         UART1_TxByte(0x0a);
  131. }

  132. //========================================================================
  133. // 函數(shù): void Readkey(void)
  134. // 描述: 讀一個(gè)鍵的讀數(shù)。
  135. // 參數(shù): none.
  136. // 返回: none.
  137. // 版本: VER1.0
  138. // 日期: 2010-12-15
  139. // 備注:
  140. //========================================================================
  141. void Readkey(void)
  142. {
  143.         u8        j;

  144.         j = TSSTA2;

  145.         if(j & 0x40)        //數(shù)據(jù)溢出, 錯(cuò)誤處理(略)
  146.         {
  147.                 TSSTA2 |= 0x40;        //寫1清零
  148.         }
  149.         if(j & 0x80)        //掃描完成
  150.         {
  151.                 TSSTA2 |= 0x80;        //寫1清零
  152.                 TK_cnt[j & 0x0f] = TSDAT;        //保存某個(gè)通道的讀數(shù)
  153.                 read_cnt++;                //讀次數(shù)+1, 用于延時(shí)或讀鍵計(jì)數(shù)
  154.         }
  155. }


  156. //========================================================================
  157. // 函數(shù): void        UART1_config(u32 brt, u8 timer, u8 io)
  158. // 描述: UART1初始化函數(shù)。
  159. // 參數(shù):   brt: 通信波特率.
  160. //       timer: 波特率使用的定時(shí)器, timer=2: 波特率使用定時(shí)器2, 其它值: 使用Timer1做波特率.
  161. //          io: 串口1切換到的IO,  io=0: 串口1切換到P3.0 P3.1,  =1: 切換到P3.6 P3.7, =2: 切換到P1.6 P1.7,  =3: 切換到P4.3 P4.4.
  162. // 返回: none.
  163. // 版本: VER1.0
  164. // 日期: 2018-4-2
  165. // 備注:
  166. //========================================================================
  167. void        UART1_config(u32 brt, u8 io)        // brt: 通信波特率,  timer=2: 波特率使用定時(shí)器2, 其它值: 使用Timer1做波特率. io=0: 串口1切換到P3.0 P3.1,  =1: 切換到P3.6 P3.7, =2: 切換到P1.6 P1.7,  =3: 切換到P4.3 P4.4.
  168. {
  169.         brt = 65536UL - (MAIN_Fosc / 4) / brt;
  170.         TR1 = 0;
  171.         AUXR &= ~0x01;                //S1 BRT Use Timer1;
  172.         AUXR |=  (1<<6);        //Timer1 set as 1T mode
  173.         TMOD &= ~(1<<6);        //Timer1 set As Timer
  174.         TMOD &= ~0x30;                //Timer1_16bitAutoReload;
  175.         TH1 = (u8)(brt >> 8);
  176.         TL1 = (u8)brt;
  177.         ET1 = 0;                        // 禁止Timer1中斷
  178.         INT_CLKO &= ~0x02;        // Timer1不輸出高速時(shí)鐘
  179.         TR1  = 1;                        // 運(yùn)行Timer1

  180. //                 if(io == 1)        {S1_USE_P32P33();        P3n_standard(0x0c);}        //切換到 P3.2 P3.3        用于8腳MCU
  181. //        else if(io == 2)        {S1_USE_P54P53();        P5n_standard(0x18);}        //切換到 P5.4 P5.3        用于8腳MCU
  182.                  if(io == 1)        {S1_USE_P36P37();        P3n_standard(0xc0);}        //切換到 P3.6 P3.7
  183.         else if(io == 2)        {S1_USE_P16P17();        P1n_standard(0xc0);}        //切換到 P1.6 P1.7
  184.         else if(io == 3)        {S1_USE_P43P44();        P4n_standard(0x18);}        //切換到 P4.3 P4.4
  185.         else                                {S1_USE_P30P31();        P3n_standard(0x03);}        //切換到 P3.0 P3.1

  186.         SCON = (SCON & 0x3f) | (1<<6);        // 8位數(shù)據(jù), 1位起始位, 1位停止位, 無(wú)校驗(yàn)
  187. //        PS  = 1;        //高優(yōu)先級(jí)中斷
  188.         ES  = 1;        //允許中斷
  189.         REN = 1;        //允許接收
  190. }



  191. //========================================================================
  192. // 函數(shù): void UART1_TxByte(u8 dat)
  193. // 描述: 串口1發(fā)送一個(gè)字節(jié)函數(shù)
  194. // 參數(shù): dat: 要發(fā)送的數(shù)據(jù).
  195. // 返回: none.
  196. // 版本: VER1.0
  197. // 日期: 2018-4-2
  198. // 備注:
  199. //========================================================================
  200. void UART1_TxByte(u8 dat)
  201. {
  202.         B_TX1_Busy = 1;                //標(biāo)志發(fā)送忙
  203.         SBUF = dat;                        //發(fā)一個(gè)字節(jié)
  204.         while(B_TX1_Busy);        //等待發(fā)送完成
  205. }

  206. //========================================================================
  207. // 函數(shù): void UART1_PrintString(u8 *puts)
  208. // 描述: 串口1字符串打印函數(shù)
  209. // 參數(shù): puts: 字符串指針.
  210. // 返回: none.
  211. // 版本: VER1.0
  212. // 日期: 2018-4-2
  213. // 備注:
  214. //========================================================================
  215. void UART1_PrintString(u8 *puts)
  216. {
  217.     for (; *puts != 0;        puts++)
  218.         {
  219.                 UART1_TxByte(*puts);
  220.         }
  221. }


  222. //========================================================================
  223. // 函數(shù): void UART1_int (void) interrupt UART1_VECTOR
  224. // 描述: 串口1中斷函數(shù)
  225. // 參數(shù): none.
  226. // 返回: none.
  227. // 版本: VER1.0
  228. // 日期: 2018-4-2
  229. // 備注:
  230. //========================================================================
  231. void UART1_int (void) interrupt UART1_VECTOR
  232. {
  233.         if(RI)
  234.         {
  235.                 RI = 0;
  236.                 cmd = SBUF;
  237.         }

  238.         if(TI)
  239.         {
  240.                 TI = 0;
  241.                 B_TX1_Busy = 0;
  242.         }
  243. }
復(fù)制代碼

Keil代碼工程下載: STC8G1K08T-觸摸按鍵與LED自動(dòng)掃描相關(guān)程序.7z (154.73 KB, 下載次數(shù): 203)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:1035652 發(fā)表于 2022-6-20 12:13 | 只看該作者
支持樓主,666,下載下來(lái)看看。
回復(fù)

使用道具 舉報(bào)

板凳
ID:64253 發(fā)表于 2022-7-15 15:40 | 只看該作者
支持,下來(lái)看看具體內(nèi)容
回復(fù)

使用道具 舉報(bào)

地板
ID:405591 發(fā)表于 2022-9-5 11:03 | 只看該作者
感謝,正在調(diào)試這塊
回復(fù)

使用道具 舉報(bào)

5#
ID:1016023 發(fā)表于 2022-9-26 14:29 | 只看該作者
您好,請(qǐng)教一下寫代碼的思路?   用STC8T1K08T這顆芯片觸摸開關(guān)  控制WS2812 RGB燈的顏色
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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