- 在单片机内部P1,P2,P3口各I/O口线片内均有固定的上拉电阻,当这3个准双向I/O口作为输入口使用时,向该口先写“1”
才能读取这个I/O的状态,P3.4 =1 ,如果这个I/O口没有3态就是没有3态关系这个I/O就跟连接的元器件是一个线与的关系,所以按键按下去就是低电平。如果有3态的I/O口就是跟连接的器件是一个线或的关系,高阻态并非是高电平还是低电平,而是高阻状态,如果外接高它就是高,接低它就是低电平。 - 实例:先写个程序检测下吧[page]
#include
#define uchar unsigned char
sbit
sbit key1= P3^4 ;//接的一个按键
sbit dula = P2^6;// 段啦
sbit wela = P^7;// 位啦
uchar num;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x3f,0};//编码表 数组 code 是在ROM区
void main(){
以上程序存在问题:按下按键时候数码管显示的不是1 2.....9 0 1...
#include
#define uchar unsigned char
sbit
sbit key1= P3^4 ;//接的一个按键
sbit dula = P2^6;// 段啦
sbit wela = P^7;// 位啦
uchar num;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x3f,0};//编码表 数组 code 是在ROM区
void main(){
- 按键在闭合和断开时,触点会存在抖动现象
我们解决的是按下去的毛刺去掉:延时函数 10毫秒
#include
#define uchar unsigned char
sbit
sbit key1= P3^4 ;//接的一个按键
sbit dula = P2^6;// 段啦
sbit wela = P^7;// 位啦
uchar num;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x3f,0};//编码表 数组 code 是在ROM区
//此为延时 测试值为1毫秒级
void delay(uint z)
{
}
void main(){
经过以上的更改是改善了问题但是还是会存在抖动现象,原因是我们只是在按下去消除抖动,没有在松手消除抖动,但是实际的项目中一般我们都是按下去的时候做消除抖动,如果想要达到更好的效果可以在松手也做消除抖动。程序简单修改如下:
#include
#define uchar unsigned char
sbit
sbit key1= P3^4 ;//接的一个按键
sbit dula = P2^6;// 段啦
sbit wela = P^7;// 位啦
uchar num;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x3f,0};//编码表 数组 code 是在ROM区
//此为延时 测试值为1毫秒级
void delay(uint z)
{
}
void main(){
以上程序是独立键盘的应用中确实存在的一些问题和本人的一些简单的解决问题的思路。当然延时也可以改成5毫秒尽量的不要让MCU过多的等待。一般的项目中都不会采用延时来去抖动,可以用定时器来去除抖动。特别在一些嵌入式系统中常用定时器去抖动,因为嵌入式设备的硬件资源太宝贵了哦。希望大牛们给个定时器的去除抖动程序。!!!!
上一篇:基于51单片机的D/A & A/D 与单片机接口原理
下一篇:51单片机数码管交通灯程序
推荐阅读最新更新时间:2024-03-16 13:53