久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10683|回復: 4
打印 上一主題 下一主題
收起左側

STC8G1K08T單片機觸摸按鍵應用程序與原理圖

  [復制鏈接]
跳轉到指定樓層
樓主
ID:964800 發(fā)表于 2021-9-8 10:37 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式

  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        //定義主時鐘

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


  10. /*************        功能說明        **************
  11. 請先別修改程序, 直接下載HEX文件測試, 下載時選擇主頻11.0592MHz.

  12. 本程序支持11個按鍵, 觸摸按鍵簡單處理和識別:

  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為觸摸指示, 當按鍵觸摸時, 輸出低電平點亮LED, 不觸摸時LED滅.
  16. P3.0 P3.1為串口1, 當有觸摸動作時, 串口返回觸摸的鍵碼(ASCII碼 00~15 對應TK00~TK15).
  17. 往串口發(fā)送字符'R'或'r', 返回各個按鍵的讀數值.

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


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


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



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

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


  28. /*************        本地函數聲明        **************/
  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. /****************  外部函數聲明和外部變量聲明 *****************/


  35. /******************** 主函數 **************************/
  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個觸摸按鍵測試程序\r\n");

  44.         P_SW2 |= 0x80;        //允許訪問XSF

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

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


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

  62.         
  63.         while (1)
  64.         {
  65.                 Readkey();
  66.                 if(read_cnt >= 50)        //控制檢測按鍵的速度
  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觸摸時讀數會降低2000左右, 則(0點-1000)為判斷鍵的閾值.
  73.                                 {
  74.                                         if(i != 5)        //TK05無效
  75.                                         {
  76.                                                 UART1_TxByte(i/10+'0');                //鍵按下, 則返回鍵號
  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觸摸時讀數會降低3000左右, 則(0點-1000)為判斷鍵的閾值.
  87.                                 {
  88.                                         UART1_TxByte(i/10+'0');                //鍵按下, 則返回鍵號
  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'))        //串口請求返回信息
  99.                 {
  100.                         for(i=0; i<16; i++)        ReturnValue(i);        //返回各個通道的讀數
  101.                         cmd  = 0;
  102.                 }
  103.         }
  104. }
  105. /**********************************************/
  106.   
  107. //========================================================================
  108. // 函數: void        ReturnValue(u8 ch)
  109. // 描述: 返回一個通道的讀數。
  110. // 參數: ch: 通道數.
  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. // 函數: void Readkey(void)
  134. // 描述: 讀一個鍵的讀數。
  135. // 參數: 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)        //數據溢出, 錯誤處理(略)
  146.         {
  147.                 TSSTA2 |= 0x40;        //寫1清零
  148.         }
  149.         if(j & 0x80)        //掃描完成
  150.         {
  151.                 TSSTA2 |= 0x80;        //寫1清零
  152.                 TK_cnt[j & 0x0f] = TSDAT;        //保存某個通道的讀數
  153.                 read_cnt++;                //讀次數+1, 用于延時或讀鍵計數
  154.         }
  155. }


  156. //========================================================================
  157. // 函數: void        UART1_config(u32 brt, u8 timer, u8 io)
  158. // 描述: UART1初始化函數。
  159. // 參數:   brt: 通信波特率.
  160. //       timer: 波特率使用的定時器, timer=2: 波特率使用定時器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: 波特率使用定時器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不輸出高速時鐘
  179.         TR1  = 1;                        // 運行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位數據, 1位起始位, 1位停止位, 無校驗
  187. //        PS  = 1;        //高優(yōu)先級中斷
  188.         ES  = 1;        //允許中斷
  189.         REN = 1;        //允許接收
  190. }



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

  206. //========================================================================
  207. // 函數: void UART1_PrintString(u8 *puts)
  208. // 描述: 串口1字符串打印函數
  209. // 參數: 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. // 函數: void UART1_int (void) interrupt UART1_VECTOR
  224. // 描述: 串口1中斷函數
  225. // 參數: 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. }
復制代碼

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

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品九九九 | 亚洲一页| 伊人精品久久久久77777 | 色播久久久 | 一区二区亚洲 | 亚洲国产欧美一区二区三区久久 | 中文字幕久久精品 | 国产激情偷乱视频一区二区三区 | 在线观看国产三级 | 在线免费观看毛片 | 中文二区| 亚洲狠狠 | 免费观看一级特黄欧美大片 | 国产特级毛片 | 国产亚洲精品久久久久动 | 另类二区 | 91在线最新 | 国产一区二区在线免费观看 | 日韩av第一页 | 日韩一区二区三区在线视频 | 91 在线 | 国产日产欧产精品精品推荐蛮挑 | 成人免费在线观看 | 日本一道本视频 | 亚洲成人高清 | 久久99精品久久久久久国产越南 | 亚洲人精品午夜 | 日韩在线视频免费观看 | 亚州综合在线 | 成人精品高清 | 天堂资源| 91一区二区 | 天堂成人国产精品一区 | 69av片| 成人精品国产免费网站 | 日日日日日日bbbbb视频 | 精品一二三区视频 | 日韩av在线一区二区 | 91国产视频在线 | 综合一区二区三区 | 秋霞影院一区二区 |