51hei.png (43.2 KB, 下載次數: 98)
下載附件
2021-9-8 15:22 上傳
51hei.png (141.28 KB, 下載次數: 93)
下載附件
2021-9-8 15:23 上傳
- /*------------------------------------------------------------------*/
- /* --- STC MCU International Limited -------------------------------*/
- /* --- STC 1T Series MCU RC Demo -----------------------------------*/
- /* If you want to use the program or the program referenced in the */
- /* article, please specify in which data and procedures from STC */
- /*------------------------------------------------------------------*/
- /*********************************************************/
- #define MAIN_Fosc 11059200L //定義主時鐘
- #include "..\..\STC8Gxxx.h"
- /************* 功能說明 **************
- 請先別修改程序, 直接下載HEX文件測試, 下載時選擇主頻11.0592MHz.
- 本程序支持11個按鍵, 觸摸按鍵簡單處理和識別:
- P1.0(TK07) P1.1(TK06) P1.3(TK04) P1.4(TK03) P1.5(TK02) P1.6(TK01) P5.4(TK00)
- P3.2(TK13) P3.3(TK12) P3.4(TK11) P3.5(TK10)
- P3.6為觸摸指示, 當按鍵觸摸時, 輸出低電平點亮LED, 不觸摸時LED滅.
- P3.0 P3.1為串口1, 當有觸摸動作時, 串口返回觸摸的鍵碼(ASCII碼 00~15 對應TK00~TK15).
- 往串口發(fā)送字符'R'或'r', 返回各個按鍵的讀數值.
- 本例測試板的參考電容為333(0.033uF), TK00~TK07觸摸時讀數會降低2000左右, TK08~TK15觸摸時讀數會降低3000左右.
- 上電后先讀鍵200次但不處理鍵, 然后將此時的讀數作為0點.
- ******************************************/
- /************* 本地常量聲明 **************/
- /************* 本地變量聲明 **************/
- bit B_TX1_Busy; // 發(fā)送忙標志
- u16 idata TK_cnt[16];
- u8 read_cnt;
- u8 cmd;
- u16 idata TK_zero[16];
- /************* 本地函數聲明 **************/
- 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.
- void UART1_PrintString(u8 *puts);
- void UART1_TxByte(u8 dat);
- void ReturnValue(u8 ch);
- void Readkey(void);
- /**************** 外部函數聲明和外部變量聲明 *****************/
- /******************** 主函數 **************************/
- void main(void)
- {
- u8 i;
-
- P3n_standard(0xc3);
- UART1_config(115200L, 0); // brt: 通信波特率. io=0: 串口1切換到P3.0 P3.1
- EA = 1; //允許全局中斷
- UART1_PrintString("11個觸摸按鍵測試程序\r\n");
- P_SW2 |= 0x80; //允許訪問XSF
- // XOSCCR = 0xc0; //啟動外部晶振
- // while (!(XOSCCR & 1)); //等待時鐘穩(wěn)定
- // CLKDIV = 0x00; //時鐘不分頻
- // CKSEL = 0x01; //選擇外部晶振
- TSRT = 0x00; //沒有LED分時掃描
- TSCHEN1 = 0xdf; //TK00~TK04, TK05, TK06, TK07
- TSCHEN2 = 0x3c; //TK10~TK13
- 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
- TSCFG2 = 1; //配置觸摸按鍵控制器的內部參考電壓(AVCC的分壓比), 0(1/4) 1(1/2) 2(5/8) 3(3/4)
- TSCTRL = (1<<7); //開始自動掃描, 無平均, B7: TSGO, B6: SINGLE, B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP
- // TSCTRL = (1<<7) + (1<<6); //開始單次掃描, 無平均
- // TSCTRL = (1<<7) + (1<<6)+3; //開始單次掃描, 4次平均
- // TSCTRL = (1<<7) + (1<<6)+1; //開始單次掃描, 2次平均
-
- // P_SW2 &= ~0x80; //禁止訪問xsf
- for(read_cnt=0; read_cnt<200; ) Readkey(); //讀200次鍵, 將此值作為未觸摸時的0點, 要求上電時不要觸摸按鍵
- for(i=0; i<16; i++) TK_zero[i] = TK_cnt[i]; //保存0點
-
- while (1)
- {
- Readkey();
- if(read_cnt >= 50) //控制檢測按鍵的速度
- {
- read_cnt = 0;
- P36 = 1; //滅LED
- for(i=0; i<8; i++)
- {
- if(TK_cnt[i] <= (TK_zero[i]-1000)) //TK00~TK07觸摸時讀數會降低2000左右, 則(0點-1000)為判斷鍵的閾值.
- {
- if(i != 5) //TK05無效
- {
- UART1_TxByte(i/10+'0'); //鍵按下, 則返回鍵號
- UART1_TxByte(i%10+'0');
- UART1_TxByte(0x0d);
- UART1_TxByte(0x0a);
- P36 = 0; //亮LED
- }
- }
- }
- for(i=10; i<14; i++)
- {
- if(TK_cnt[i] <= (TK_zero[i]-1500)) //TK08~TK15觸摸時讀數會降低3000左右, 則(0點-1000)為判斷鍵的閾值.
- {
- UART1_TxByte(i/10+'0'); //鍵按下, 則返回鍵號
- UART1_TxByte(i%10+'0');
- UART1_TxByte(0x0d);
- UART1_TxByte(0x0a);
- P36 = 0; //亮LED
- }
- }
- }
-
-
- if((cmd == 'R') || (cmd == 'r')) //串口請求返回信息
- {
- for(i=0; i<16; i++) ReturnValue(i); //返回各個通道的讀數
- cmd = 0;
- }
- }
- }
- /**********************************************/
-
- //========================================================================
- // 函數: void ReturnValue(u8 ch)
- // 描述: 返回一個通道的讀數。
- // 參數: ch: 通道數.
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2010-12-15
- // 備注:
- //========================================================================
- void ReturnValue(u8 ch)
- {
- u16 j;
- j = TK_cnt[ch];
- UART1_TxByte('K');
- UART1_TxByte(ch/10+'0');
- UART1_TxByte(ch%10+'0');
- UART1_TxByte('=');
- UART1_TxByte(j / 10000 + '0');
- UART1_TxByte((j % 10000)/1000 + '0');
- UART1_TxByte((j % 1000)/100 + '0');
- UART1_TxByte((j % 100)/10 + '0');
- UART1_TxByte(j % 10 + '0');
- UART1_TxByte(0x0d);
- UART1_TxByte(0x0a);
- }
- //========================================================================
- // 函數: void Readkey(void)
- // 描述: 讀一個鍵的讀數。
- // 參數: none.
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2010-12-15
- // 備注:
- //========================================================================
- void Readkey(void)
- {
- u8 j;
- j = TSSTA2;
- if(j & 0x40) //數據溢出, 錯誤處理(略)
- {
- TSSTA2 |= 0x40; //寫1清零
- }
- if(j & 0x80) //掃描完成
- {
- TSSTA2 |= 0x80; //寫1清零
- TK_cnt[j & 0x0f] = TSDAT; //保存某個通道的讀數
- read_cnt++; //讀次數+1, 用于延時或讀鍵計數
- }
- }
- //========================================================================
- // 函數: void UART1_config(u32 brt, u8 timer, u8 io)
- // 描述: UART1初始化函數。
- // 參數: brt: 通信波特率.
- // timer: 波特率使用的定時器, timer=2: 波特率使用定時器2, 其它值: 使用Timer1做波特率.
- // 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.
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2018-4-2
- // 備注:
- //========================================================================
- 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.
- {
- brt = 65536UL - (MAIN_Fosc / 4) / brt;
- TR1 = 0;
- AUXR &= ~0x01; //S1 BRT Use Timer1;
- AUXR |= (1<<6); //Timer1 set as 1T mode
- TMOD &= ~(1<<6); //Timer1 set As Timer
- TMOD &= ~0x30; //Timer1_16bitAutoReload;
- TH1 = (u8)(brt >> 8);
- TL1 = (u8)brt;
- ET1 = 0; // 禁止Timer1中斷
- INT_CLKO &= ~0x02; // Timer1不輸出高速時鐘
- TR1 = 1; // 運行Timer1
- // if(io == 1) {S1_USE_P32P33(); P3n_standard(0x0c);} //切換到 P3.2 P3.3 用于8腳MCU
- // else if(io == 2) {S1_USE_P54P53(); P5n_standard(0x18);} //切換到 P5.4 P5.3 用于8腳MCU
- if(io == 1) {S1_USE_P36P37(); P3n_standard(0xc0);} //切換到 P3.6 P3.7
- else if(io == 2) {S1_USE_P16P17(); P1n_standard(0xc0);} //切換到 P1.6 P1.7
- else if(io == 3) {S1_USE_P43P44(); P4n_standard(0x18);} //切換到 P4.3 P4.4
- else {S1_USE_P30P31(); P3n_standard(0x03);} //切換到 P3.0 P3.1
- SCON = (SCON & 0x3f) | (1<<6); // 8位數據, 1位起始位, 1位停止位, 無校驗
- // PS = 1; //高優(yōu)先級中斷
- ES = 1; //允許中斷
- REN = 1; //允許接收
- }
- //========================================================================
- // 函數: void UART1_TxByte(u8 dat)
- // 描述: 串口1發(fā)送一個字節(jié)函數
- // 參數: dat: 要發(fā)送的數據.
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2018-4-2
- // 備注:
- //========================================================================
- void UART1_TxByte(u8 dat)
- {
- B_TX1_Busy = 1; //標志發(fā)送忙
- SBUF = dat; //發(fā)一個字節(jié)
- while(B_TX1_Busy); //等待發(fā)送完成
- }
- //========================================================================
- // 函數: void UART1_PrintString(u8 *puts)
- // 描述: 串口1字符串打印函數
- // 參數: puts: 字符串指針.
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2018-4-2
- // 備注:
- //========================================================================
- void UART1_PrintString(u8 *puts)
- {
- for (; *puts != 0; puts++)
- {
- UART1_TxByte(*puts);
- }
- }
- //========================================================================
- // 函數: void UART1_int (void) interrupt UART1_VECTOR
- // 描述: 串口1中斷函數
- // 參數: none.
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2018-4-2
- // 備注:
- //========================================================================
- void UART1_int (void) interrupt UART1_VECTOR
- {
- if(RI)
- {
- RI = 0;
- cmd = SBUF;
- }
- if(TI)
- {
- TI = 0;
- B_TX1_Busy = 0;
- }
- }
復制代碼
51hei.png (6.64 KB, 下載次數: 86)
下載附件
2021-9-8 15:23 上傳
Keil代碼工程下載:
STC8G1K08T-觸摸按鍵與LED自動掃描相關程序.7z
(154.73 KB, 下載次數: 203)
2021-9-8 15:22 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|