- /*------------------------------------------------------------------*/
- /* --- 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).
- 往串口发送字符'R'或'r', 返回各个按键的读数值.
- 本例测试板的参考电容为333(0.033uF), TK00~TK07触摸时读数会降低2000左右, TK08~TK15触摸时读数会降低3000左右.
- 上电后先读键200次但不处理键, 然后将此时的读数作为0点.
- ******************************************/
- /************* 本地常量声明 **************/
- /************* 本地变量声明 **************/
- bit B_TX1_Busy; // 发送忙标志
- 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)); //等待时钟稳定
- // 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)), 放电时间(系统时钟周期数) 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; //高优先级中断
- ES = 1; //允许中断
- REN = 1; //允许接收
- }
- //========================================================================
- // 函数: void UART1_TxByte(u8 dat)
- // 描述: 串口1发送一个字节函数
- // 参数: dat: 要发送的数据.
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2018-4-2
- // 备注:
- //========================================================================
- void UART1_TxByte(u8 dat)
- {
- B_TX1_Busy = 1; //标志发送忙
- SBUF = dat; //发一个字节
- while(B_TX1_Busy); //等待发送完成
- }
- //========================================================================
- // 函数: 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;
- }
- }
复制代码
Keil代码工程下载:
STC8G1K08T-触摸按键与LED自动扫描相关程序.7z
(154.73 KB, 下载次数: 203)
|