|
|
爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 慕名而来 于 2022-11-10 12:48 编辑
昨天发帖:STC8H单片机硬件触摸按键的简单实现(1)——官方例程与配置软件https://www.mydigit.cn/thread-353279-1-1.html(出处: 数码之家),说了一下STC8H单片机硬件触摸按键编程的前期准备——查看串口数据、确定按键状态值,接下来完成这段应用程序。
长居本坛的朋友或许知道,我基本上只玩STC的51单片机,虽然也弄了十几年了,但经常只是做些时钟、万年历这些单片机地皮级的应用,C编程一直都是座门墩的水平始终没能登堂入室,很多时候都是在做用例程、改例程、简化例程的所谓编程,真的不会自己起头写代码,这段触摸按键代码也不例外,只是以最简单的代码实现了最基本的使用功能,因为应用模式为按键自动重复检测模式,所以,这段代码整合的其他工程里应用时是否会出现分时冲突还不知道,我也试图测试单次检测模式但没能实现,在此也希望高手指点。
- /**********************************************************************
- //如有转载请注明出处
- //代码原创:wannenggong 2022-11-10
- //单片机型号:STC8H4K64TL,电源电压3.3V,使用外接RX8025T-32768信号源做外部晶振
- //接线方式:P1.1口经1K电阻连接金属触摸片,P1.0口经470Ω电阻连接LED到正电源
- //触摸按键工作模式:自动重复扫描
- //实验目标:触摸按键时LED亮起,不触摸按键时LED熄灭
- ***********************************************************************/
- #include "STC8H.h" //包含了u8、u16、u32的定义
- #include <intrins.h>
- sbit wng_led=P1^0;
- //------------------------------------------
- void key_init()
- {
- P_SW2 |= 0x80; //允许访问XFR
- TSRT = 0x00; //不开启LED驱动分时功能
- TSCHEN1 = 0x02; //仅使能TK01(P1.1)
- TSCHEN2 = 0x00; //其他按键没有使用
- TSCFG1 = (7<<4) + 3; //开关电容工作频率 = fosc/(2*(TSCFG1[6:4]+1)), 放电时间(系统时钟周期数) 0(125) 1(250) 2(500) 3(1000) 4(2000) 5(2500) 6(5000) 7(7500) 最小3
- TSCFG2 = 2; //配置触摸按键控制器的内部参考电压(AVCC的分压比), 0(1/4) 1(1/2) 2(5/8) 3(3/4)
- TSWUTC = 0x0c; //32768/(32*8*0x0c)=10Hz=100ms唤醒一次
- TSCTRL = 0xB0; //使用外部晶振
- // TSCTRL = 0xA0; //使用内部晶振
- //----TSCTRL寄存器详解如下--------------
- //B7:TSGO=1使能触摸按键
- //B6:SINGLE=1单次扫描模式、=0自动重复扫描
- //B5:TSWAIT=1完成一轮扫描后、TSIF 被硬件置 1,此时触摸按键控制器会暂停扫描,直到 TSIF 标志位被清 0后才开始下一轮的扫描
- //B4:TSWUCS=0使用内部32K晶振
- //B3:TSDCEN=0不使能16位比较器
- //B2:TSWUEN=1使能低功耗唤醒功能
- //B1B0:TSSAMP=11单次按键扫描4次
- //--------------------------------------
- P_SW2 &= ~0x80; //禁止访问XFR
- //IE2 |= 0x80;
- }
- //----键值读取函数--------------------
- u8 Read_Key_value(void)
- {
- u8 j,wng_data;
- u16 i, wng_value=0;
- P_SW2 |= 0x80;
- for(i=0; i<100; i++)
- {
- j = TSSTA2;
- if(j & 0x40) //数据溢出
- {
- TSSTA2 |= 0x40; //写1清零
- wng_value=0xee; //返回错误码0xee
- }
- if(j & 0x80) //扫描完成
- {
- TSSTA2 |= 0x80; //写1清零
- wng_value=TSDAT;
- wng_data=wng_value>>12; //获取高8位数据的高4位用于判断
- }
- }
- P_SW2 &= ~0x80;
- return (wng_data);
- }
- //----按键函数------------------------------
- void key01()
- {
- u8 wng;
- wng=Read_Key_value();
- if(wng==0xee)
- return;
- else
- {
- if(wng<0x03) //选取一个中值用来判断按键状态
- wng_led=0;
- else if(wng>0x03)
- wng_led=1;
- }
- }
- //------------------------------------------
- void main(void)
- {
- P1M1=0x00;
- P1M0=0x00;
- P3M1=0x00;
- P3M0=0x00;
- P5M1=0x00;
- P5M0=0x00;
- key_init();
- wng_led=1;
- while(1)
- {
- key01();
-
- }
- }
复制代码
|
打赏
-
查看全部打赏
|