完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
鸿哥威武,我去年11月份开始学习单片机的,期待像您一样能独立开发项目,目前和您相比,我还差的太远,不过我会努力的!顶鸿哥一个。
|
|
|
|
|
|
|
|
|
|
第十九节:FTC359A驱动的触摸按键
(1) 开场白: 既然上一节介绍了电阻触摸屏,那么这一节顺便把常用的触摸按键也介绍一下。触摸按键在生活中已经很常见了,很多电脑显示屏的电源键就是用触摸按键的方式,比起机械按键更加酷,更加炫。 触摸按键编程非常简单,因为厂家把触摸按键驱动芯片的操作做得非常简单易用,比操作EEPROM简单一百倍。下面我介绍的驱动芯片就是FTC359A,这个厂家给的IC资料是中文的,大家只要在百度上一搜索就能找到。有的电子发烧友会质疑,吴坚鸿你老是介绍这些驱动芯片,算什么本事嘛?当然算。首先,鸿哥介绍的东西都是在某些项目上亲自用过的。其次,我会给出驱动源代码。真正牛的工程师,不但要牛在他的编程技术上,还要牛在他所熟悉和掌握的芯片品种够多够广,一看到项目需求就知道选什么芯片合适。所以说工程师跟医生是一样的道理,越老越吃香。 FTC359A最多可以驱动12个触摸按键,它通过4根引脚采用二进制编码输出的方式。单片机只要读取这4根引脚的电平,就知道那个按键被摸了。比如,当这4根引脚的电平是“0000”时就代表1号键,“0001”代表2号键,“0010”代表3号键,“1111”代表没有按键被按下,就这么简单。 (2)功能需求: 每摸一个按键,蜂鸣器就响一次。 (3)硬件原理: 用单片机4根IO口跟FTC359A的输出编码引脚连接,在布PCB线路的时候,FTC359A的K1,K2,K3…K12引脚分别跟一块悬空的通孔铜皮连接,手指一靠近此通孔铜皮,就会被驱动芯片感应到。在电路板上面盖上绝缘的玻璃或者塑料都没问题,它的穿透力(或者说灵敏度)跟芯片外围所选的一个电容的大小有关。详细资料请参考中文的IC资料,说得非常详细。 (4)源码适合的单片机: PIC18F4520,晶振为11.0592MHz。 (5)源代码讲解如下: #include //补充说明:吴坚鸿程序风格是这样的,凡是输出IO后缀都是_dr,凡是输入的//IO后缀都//是_sr #define beep_dr LATA1 //蜂鸣器输出 #define key_sr1 RB6 //检测FTC395A的二进制编码输出的4根引脚之一 #define key_sr2 RB7 //检测FTC395A的二进制编码输出的4根引脚之一 #define key_sr3 RB3 //检测FTC395A的二进制编码输出的4根引脚之一 #define key_sr4 RB4 //检测FTC395A的二进制编码输出的4根引脚之一 //补充说明:吴坚鸿程序风格是这样的,凡是做延时计数阀值的常量 //前缀都用cnt_表示。凡是延时常量,都应该根据上机实际情况来调整出最佳的数值 #define cnt_delay_cnt 25 //按键去抖动延时阀值 #define cnt_voice_time 60 //蜂鸣器响的声音长短的延时阀值 void key_scan(); //按键扫描函数,放在main函数循环里。也可以放在定时中断里 void key_service(); //按键服务函数,放在main函数循环里 //补充说明:吴坚鸿程序风格是这样的,凡是switch()语句括号里面的变量名 //后缀都用_step表示。 //后缀都用_lock表示。 unsigned char key_lock=0; //按键自锁标志 unsigned char touch_scan_update=0; //触摸按键有新数据标志,0表示无触摸,1表示有触摸 unsigned char touch_key_code=0xff; //触摸按键的中间编码变量 //补充说明:吴坚鸿程序风格是这样的,凡是计数器延时的变量 //后缀都用_cnt表示。 unsigned int delay_cnt=0; //延时计数器的变量 unsigned int voice_time_cnt; //蜂鸣器响的声音长短的计数延时 //补充说明:吴坚鸿程序风格是这样的,凡是做类型的变量的分类 //后缀都用_sec表示。 unsigned char key_sec=0; //哪个按键被触发 //主程序 main() { ADCON0=0x00; ADCON1=0x0f; //全部为数字信号 ADCON2=0xa1; //右对齐 RBPU=0; //上拉电阻 SSPEN=0; TRISB3=1; //检测FTC395A的二进制编码输出的4根引脚之一 TRISB4=1; //检测FTC395A的二进制编码输出的4根引脚之一 TRISB6=1; //检测FTC395A的二进制编码输出的4根引脚之一 TRISB7=1; //检测FTC395A的二进制编码输出的4根引脚之一 T1CON=0x24; //定时器中断配置 TMR1H=0xF5; TMR1L=0x5F; TMR1IF=0; TMR1IE=1; TMR1ON=1; TMR1IE=1; //补充说明,以上的内容为寄存器配置,每种不同的单片机会有点差异, //大家不用过度关注以上寄存器的配置,只要知道有这么一回事即可 beep_dr=0; //关蜂鸣器,上电初始化IO while(1) { CLRWDT(); //喂看门狗,大家不用过度关注此行 key_scan(); //按键扫描函数 key_service(); //按键服务 } } void key_scan() //按键扫描函数 { touch_scan_update=1; //触摸按键有新数据标志,0表示无触摸,1表示有触摸 if(key_sr4==1&&key_sr3==1&&key_sr2==1&&key_sr1==1) { touch_key_code=0x0f; touch_scan_update=0; //触摸按键无新数据标志 } else if(key_sr4==0&&key_sr3==0&&key_sr2==0&&key_sr1==0) { touch_key_code=0x00; } else if(key_sr4==0&&key_sr3==0&&key_sr2==0&&key_sr1==1) { touch_key_code=0x01; } else if(key_sr4==0&&key_sr3==0&&key_sr2==1&&key_sr1==0) { touch_key_code=0x02; } else { touch_scan_update=0; //触摸按键无新数据标志 } if(touch_scan_update==0) //无按键按下 { key_lock=0; delay_cnt=0; } else if(key_lock==0) //触摸按键自锁 { if(touch_key_code==0x00) { ++delay_cnt; if(delay_cnt>cnt_delay_cnt) //抗干扰 { delay_cnt=0; key_lock=1; key_sec=1; } } else if(touch_key_code==0x01) { ++delay_cnt; if(delay_cnt>cnt_delay_cnt) //抗干扰 { delay_cnt=0; key_lock=1; key_sec=2; } } else if(touch_key_code==0x04) { ++delay_cnt; if(delay_cnt>cnt_delay_cnt) //抗干扰 { delay_cnt=0; key_lock=1; key_sec=3; } } else if(touch_key_code==0x02) { ++delay_cnt; if(delay_cnt>cnt_delay_cnt) //抗干扰 { delay_cnt=0; key_lock=1; key_sec=4; } } } } void key_service() //按键服务函数 { switch(key_sec) //按键服务状态切换 { case 1:// 1号键 // 补充说明:voice_time_cnt只要不为0蜂鸣器就会响,中断里判断voice_time_cnt不为0 //时,会不断自减,一直到它为0时,自动把蜂鸣器关闭 voice_time_cnt= cnt_voice_time; //蜂鸣器响“滴”一声就停 key_sec=0; //相应完按键处理程序之后,把按键选择变量清零, //避免一直触发 break; case 2:// 2号键 voice_time_cnt= cnt_voice_time; //蜂鸣器响“滴”一声就停 key_sec=0; //相应完按键处理程序之后,把按键选择变量清零, //避免一直触发 break; case 3://3号键 voice_time_cnt= cnt_voice_time; //蜂鸣器响“滴”一声就停 key_sec=0; //相应完按键处理程序之后,把按键选择变量清零, //避免一直触发 break; case 4://4号键 voice_time_cnt= cnt_voice_time; //蜂鸣器响“滴”一声就停 key_sec=0; //相应完按键处理程序之后,把按键选择变量清零, //避免一直触发 break; } } //中断 void interrupt timer1rbint(void) { if(TMR1IE==1&&TMR1IF==1) //定时中断 { TMR1IF=0; //定时中断标志位关闭 TMR1ON=0; //定时中断开关关闭 if(voice_time_cnt) //控制蜂鸣器声音的长短 { beep_dr=1; //蜂鸣器响 --voice_time_cnt; //蜂鸣器响的声音长短的计数延时 } else { asm("nop"); beep_dr=0; //蜂鸣器停止 } TMR1H=0xF5; //重新设置定时时间间隔 TMR1L=0x5F; TMR1ON=1; //定时中断开关打开 } } (6)小结: 前面花了很多章节来讲液晶的驱动程序,下一节将介绍制作液晶显示屏菜单的基本程序框架。 (未完待续,下节更精彩,不要走开哦) |
|
|
|
|
|
赞一个,先!
|
|
|
|
|
|
鸿哥,帮瞅瞅我写的按键检测程序工作会有什么不稳定的地方没有;谢谢。
/********************************************************* 文件名称:key.C 主控芯片:STC89C52RC 功能描述:TO定时器延时,矩阵键盘扫描(线反转法) 备 注:key键码可自定义 作者日期:田卫卫 / 2013年2月11日 版 本:V2.2 *********************************************************/ uchar keydelay; /*keydelay按键持续ms数; */ bit key_yes=0, key_lock=0; /*按键按下状态,自锁状态*/ uchar keynum; void Key_scan() /*键盘扫描程序*/ { /**************************中断法检测按键代码:开始**************************/ if (S1==0||S2==0||S3==0||S4==0) /*判断按键按下?*/ { keydelay++; /*按键按下持续时间++,单位ms*/ if (keydelay>=KEYXMS) /*按键持续时间大于KEYXMS消抖延时毫秒,则认为按键按下*/ { keydelay=0; /*清零*/ key_yes = 1; /*按键已按下*/ /*以下为键盘,键值计算核心*/ if (key_yes!=key_lock) /*按键的状态不相等?这里是最巧妙的地方,防止一次按键多次触发*/ { key_lock = key_yes; /*把当前按键状态保存起来*/ if (key_yes) /*按键按下,没有松开?*/ { if (S1==0) keynum=1; if (S2==0) keynum=2; if (S3==0) keynum=3; if (S4==0) keynum=4; } } } } else //引用鸿哥的话:在延时去抖动的时候,还必须要监控延时这段时间里,按键IO输入口是否会由于受到某 { //种干扰突然由低变成高,如果一旦变成高,那么延时计数器keydelay必须重新清零 keydelay=0; nkey=0; } /**************************中断法检测按键代码:结束**************************/ } uchar Key_service() /*键盘服务程序*/ { switch (keynum) { case 1: break; case 2: break; case 3: break; case 4: break; default: break; } }
|
|
|
|
|
|
|
|
|
|
鸿哥,救急啊!
|
|
|
|
|
|
我顶!!!
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
求解外围电路实现的是4脚给持续低电平复位并正常工作,高电平不工作的原因
2077 浏览 1 评论
3505 浏览 3 评论
PIC1946程序有一个变量在运行过程中恢复初始值其他变量保持不变
2333 浏览 2 评论
2760 浏览 0 评论
PIC16F1825的RC5引脚,在主程序中操作无效,在中断中可以改变是为什么?
4015 浏览 5 评论
966浏览 0评论
用XC8编译PIC18F25K80时提示下面Error,求怎么解决这个问题
6349浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 20:13 , Processed in 1.048417 second(s), Total 88, Slave 79 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号