当前位置:首页 » 编程语言 » 单片机键盘c语言

单片机键盘c语言

发布时间: 2022-08-06 16:18:04

⑴ 单片机键盘去抖动c语言程序!!!

使用这个到板子里面:

  • #include <reg52.h>

  • sbit ADDR0 = P1^0;

  • sbit ADDR1 = P1^1;

  • sbit ADDR2 = P1^2;

  • sbit ADDR3 = P1^3;

  • sbit ENLED = P1^4;

  • sbit KEY1 = P2^4;

  • sbit KEY2 = P2^5;

  • sbit KEY3 = P2^6;

  • sbit KEY4 = P2^7;

  • unsigned char code LedChar[] = { //数码管显示字符转换表0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};

  • void delay();

  • void main(){

  • bit keybuf = 1; //按键值暂存,临时保存按键的扫描值

  • bit backup = 1; //按键值备份,保存前一次的扫描值

  • unsigned char cnt = 0; //按键计数,记录按键按下的次数

  • ENLED = 0; //选择数码管 DS1 进行显示

  • ADDR3 = 1;

  • ADDR2 = 0;

  • ADDR1 = 0;

  • ADDR0 = 0;

  • P2 = 0xF7; //P2.3 置 0,即 KeyOut1 输出低电平

  • P0 = LedChar[cnt]; //显示按键次数初值

  • while (1){

  • keybuf = KEY4; //把当前扫描值暂存

  • if (keybuf != backup){ //当前值与前次值不相等说明此时按键有动作

  • delay(); //延时大约 10ms

  • if (keybuf == KEY4){ //判断扫描值有没有发生改变,即按键抖动

  • if (backup == 0){ //如果前次值为 0,则说明当前是弹起动作

  • cnt++; //按键次数+1

  • //只用 1 个数码管显示,所以加到 10 就清零重新开始

  • if (cnt >= 10){

  • cnt = 0;

    }

    P0 = LedChar[cnt]; //计数值显示到数码管上

    }

  • backup = keybuf; //更新备份为当前值,以备进行下次比较
    }
    }
    }
    }

  • /* 软件延时函数,延时约 10ms */

  • void delay(){

  • unsigned int i = 1000;

  • while (i--);
    }

⑵ 关于单片机c语言4*4小键盘程序

借用一下你的程序~
char
keypad_scan()
{
char
key,i;
P2=0xf0;
//定义高四位输出,低四位输入
while(P2!=0xf0)

//等待按键按下
do
{
for(i=0;i<3;i++)
{
P2=ksp[i];
//扫描出是哪一行(列)
-->但错了,变成赋值运算了~
if(P2!=ksp[i])
//扫描出是哪一列(行)
-->但错了~
{
delay();//延时消抖后再判断该行有无键按下
key=P2;
//扫描出按键
-->本可以到这里了就可以直接得出按键值的~~~~
if(key!=ksp[i])
return
(key);
}
}
}while(1);
//是死循环,退不出来~~~
}
思路很好~~编得有点乱~~~

⑶ 单片机中独立键盘和矩阵键盘如何一起使用 请用C语言写个程序说明,谢谢。

这个很好处理呀,比如以下举例,独立+矩阵,实现独立按键相当于类似SHIFT作用的效果。
#include<reg51.h>
#define uchar unsigned char
uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0到f
uchar keyval,num;
sbit skey=P1^0; //独立键P1.0
void delay(uchar a)
{
uchar i,j;
for(i=0;i<a;i++)
for(j=0;j<125;j++);
}
uchar kbscan(void) //矩阵键扫描程序
{
unsigned char sccode,recode;
P3=0x0f; //发0扫描,列线输入
if ((P3 & 0x0f) != 0x0f) //有键按下
{
delay(20); //延时去抖动
if ((P3&0x0f)!= 0x0f)
{
sccode = 0xef; //逐行扫描初值
while((sccode&0x01)!=0)
{
P3=sccode;
if((P3&0x0f)!=0x0f)
{
recode=(P3&0x0f)|0xf0;
while((P3&0x0f)!=0x0f);//等待键抬起
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return 0; //无键按下,返回0
}
void getkey(void)
{
unsigned char key;
key=kbscan();
if(key==0)
{
return;
}
switch(key)
{
case 0x11:keyval=7;break;
case 0x12:keyval=4;break;
case 0x14:keyval=1;break;
case 0x18:keyval=10;break;
case 0x21:keyval=8;break;
case 0x22:keyval=5;break;
case 0x24:keyval=2;break;
case 0x28:keyval=0;break;
case 0x41:keyval=9;break;
case 0x42:keyval=6;break;
case 0x44:keyval=3;break;
case 0x48:keyval=11;break;
case 0x81:keyval=12;break;
case 0x82:keyval=13;break;
case 0x84:keyval=14;break;
case 0x88:keyval=15;break;
default:keyval=0xff;break;
}
//以下处理独立按键
if(skey==0)
{
if(keyval!=0xff)keyval+=16; //如果独立键按下,键值加16
while(skey==0); //等待独立键释放
}
}
void t0isr() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
switch(num)
{
case 0:P2=0x01;break;
case 1:P2=0x02;break;
case 2:P2=0x04;break;
case 3:P2=0x08;break;
default:break;
}
if(keyval<16) P0=~tab[keyval]; //独立键未按正常显示
else P0=~(tab[keyval]|0x80); //独立键按下显示+DP
num++;
num&=0x03;
}
main()
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
getkey();
}
}

⑷ 51单片机矩阵键盘(c语言) 求大神啊~

uchar
KeyScan(void)
{
static
uchar
k=0;
//由于函数在调用结束时k值已返回给函数,k作为局部变量即可
/////////
uchar
Trg,Trg1,Trg2,Cont1,Cont2;
uchar
ReadData1,ReadData2;
/////////
P3=0x0f;
ReadData1=P3^0x0f;
Trg1=ReadData1&(ReadData1^Cont1);
//触发键
Cont1=ReadData1;
//长按键
/////////
P3=0xf0;
ReadData2=P3^0xf0;
Trg2=ReadData2&(ReadData2^Cont2);
Cont2=ReadData2;
Trg=Trg1+Trg2;
////////
switch(Trg)
{
case
0x81:{k=1;break;}
case
0x41:{k=2;break;}
case
0x21:{k=3;break;}
case
0x11:{k=4;break;}
case
0x82:{k=5;break;}
case
0x42:{k=6;break;}
case
0x22:{k=7;break;}
case
0x12:{k=8;break;}
case
0x84:{k=9;break;}
case
0x44:{k=10;break;}
case
0x24:{k=11;break;}
case
0x14:{k=12;break;}
case
0x88:{k=13;break;}
case
0x48:{k=14;break;}
case
0x28:{k=15;break;}
case
0x18:{k=16;break;}
default:{k=0;break;}
}
return(k);
}
//在主函数里面直接调用keyboard()函数,直接返回键值;
然后在数码管显示。
好好的研究下这个键盘程序,
这种方式很程序很精炼、简单
绝对可以调出来。

⑸ 键盘 单片机程序C语言

我吧我做的给你 我作成了

uchar KeyScan(void)//键盘扫描、、传出键盘码()键盘码要先定义
{
uint8 temp,keyvalue;
keyup=1;//上下左右 中
keydown=1;
keyright=1;
keyleft=1;
keyok=1;
Keyboard_P2=0xff;
temp=Keyboard_P2;
temp=temp&0xf8;
//temp=0xb8;
if(temp!=0xf8)
{
Delay(50);//防抖动
if(temp!=0xf8)
{
switch(temp)
{
case 0x78: keyvalue= key_left;break;
case 0xb8: keyvalue=key_up; break;
case 0xd8: keyvalue=key_down; break;
case 0xe8: keyvalue=key_right; break;
case 0xf0: keyvalue=key_ok; break;
}
while(temp!=0xf8)
{
temp=Keyboard_P2;//防止按着不放
temp=temp&0xf8;
}
return keyvalue;
}

}

}

⑹ 求一段51单片机按键C语言程序详解

P1.0、P1.1都控制 LED
试试下面程序:

#include <reg51.h>
sbit led = P1^0;
sbit key = P1^7;
void main()
{
while(1) led = key;
}

P1.1知道用

⑺ 通过键盘往单片机中输入任意数字的C语言程序

我这有个AVR的矩阵键盘的识别程序、其中PORTA就相当于51里的P0一样的端口的表示、PINA也是指的PORTA口、和PORTA的区别是PINA只能读!其他都一样的和51
/********************************************************
实验七: 矩阵式键盘实验
说明: 按按键K1-K16 数码管显示0-F的键码
注意: K17-K19为独立按键,使用这个程序是没有反应的

CPU型号: ATMEGA128A
晶振频率: 8MHZ
日期: 2011-3-12
联系方法: [email protected]
********************************************************/
#include <iom128v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
void Delayus(uint US); //微秒延时子程序
void Delayms(uint MS); //毫秒延时子程序
uchar key_scan(void);
void init_io(void);
//共阳数码管数字码
uchar led_discode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};

uchar key_val=0;
//主函数
void main (viod)
{
uchar key_io;
init_io();
while(1)
{
PORTD=0XF0;
Delayms(5);
key_io=PIND & 0xf0;
if(key_io !=0xf0)
{
PORTD=0XF0;
Delayms(1);
key_io=PIND & 0xf0;
if(key_io !=0xf0)
{
key_val=key_scan();
key_val |= key_io;
}
switch(key_val)
{
case 0xee: key_val=0x00; break; //按键K1

case 0xde: key_val=0x01; break; //按键K2

case 0xbe: key_val=0x02; break; //按键K3

case 0x7e: key_val=0x03; break; //按键K4

case 0xed: key_val=0x04; break; //按键K5

case 0xdd: key_val=0x05; break; //按键K6

case 0xbd: key_val=0x06; break; //按键K7

case 0x7d: key_val=0x07; break; //按键K8

case 0xeb: key_val=0x08; break; //按键K9

case 0xdb: key_val=0x09; break; //按键K10

case 0xbb: key_val=0x0a; break; //按键K11

case 0x7b: key_val=0x0b; break; //按键K12

case 0xe7: key_val=0x0c; break; //按键K13

case 0xd7: key_val=0x0d; break; //按键K14

case 0xb7: key_val=0x0e; break; //按键K15

case 0x77: key_val=0x0f; break; //按键K16
} // switch(key_val)
} // if(key_io !=0xf0)

PORTD=0XF0;
//等待松开按键
key_io=PIND & 0xf0;
while(key_io !=0xf0)
{
key_io=PIND & 0xf0;
}
PORTC=led_discode[key_val]; //显示按键码
} // while(1)
}
void init_io(void)
{
DDRA=0XFF;//设置A口味输出
PORTA=0XFF;

DDRB=0XFf;;//设置B口味输出
PORTB=0XFF; //数码管位控制

DDRC=0XFF; //数码管段控制
PORTC=0X00;

DDRD=0X0F; //键盘接口
PORTD=0XF0;

DDRF=0X0E;
PORTF=0X0E;
PORTF&=0XF7; //锁存关闭LED显示

DDRB |=0X10; //PB4设为输出
PORTB|=0X10; //关闭PB4外接的LED
}
uchar key_scan(void)
{
uchar m,temp=0xf7;
for(m=0;m<4;m++)
{
PORTD=temp | 0xf0;
Delayms(1);
if((PIND & 0XF0)!=0XF0)
return(temp & 0x0f);
temp>>=1;
}
}
/****************************************************
函数名称: Delayus
功 能: 延时指定微秒(8M晶振)
参 数: US--延时的微秒数(大约,不是很精确,MS越大越准确)
返回值 : 无
/****************************************************/
void Delayus(uint US)
{
uint i;
US=US*5/4;
for( i=0;i<US;i++);
}
/****************************************************
函数名称: Delayms
功 能: 延时指定毫秒(8M晶振)
参 数: MS--延时的毫秒数
返回值 : 无
通过软件仿真反复实验得到的数值
/****************************************************/
void Delayms(uint MS)
{
uint i,j;
for( i=0;i<MS;i++)
for(j=0;j<1141;j++);
}

⑻ 单片机键盘去抖动c语言程序!!!

这按键去抖,本来就不可能完全消除抖动,只是说能消除绝大部分抖动情况
你知道,毛刺出现的时间一定是多长么?你按下的时间也一定是多长么?
你能将这两个时间精确到us级别么?哪怕是精确到us级别,仍然有极端现象出现
何况,这个两个时间本身就是不确定的,我们只是找出这两个时间的最可能范围
将两个时间的范围进行区别
如果你还是觉得程序不合理,那么好吧,你可以用一个数学的方法去研究和推导
直到你找到一个更高级的算法,那么你就可以改进它了
不过,一个51单片机,谁还会为几乎可以忽略的事件,而专门浪费一大堆程序空间,
耗费一大段指令周期来实现这个算法?
俗话说得好:过犹不及就是这个道理

热点内容
图片服务器ftp 发布:2025-01-22 15:52:33 浏览:506
sql打开bak文件 发布:2025-01-22 15:47:32 浏览:106
opengl服务器源码 发布:2025-01-22 15:40:02 浏览:908
python部署服务 发布:2025-01-22 15:38:46 浏览:282
压缩机卡装 发布:2025-01-22 15:37:04 浏览:446
每天跑步40分钟可以缓解压力吗 发布:2025-01-22 15:33:24 浏览:448
线性表的链式存储结构与顺序存储 发布:2025-01-22 15:32:45 浏览:295
解压缩大师 发布:2025-01-22 15:26:51 浏览:386
xp访问win7共享打印机无权限 发布:2025-01-22 15:23:22 浏览:830
python中pandas 发布:2025-01-22 15:21:42 浏览:639