导航:首页 > 操作系统 > 单片机键盘c语言

单片机键盘c语言

发布时间:2023-02-13 06:44:36

Ⅰ 求单片机C语言 键盘控制的解释 求告诉注释

#include<reg51.h>
//你用的是51系列的单片机,所以加上头文件

#define uchar unsigned char
#define uint unsigned int

#define SCANPORT P1
//定义键盘扫描的端口P1口

uchar uca_LineScan[4]={0xEF,0xDF,0xBF,0x7F};
//我觉得这里有错,应该是{0xEF,0xDF,0xBF,0x7F},原来是{0xFE,0xFD,0xFB,0xF7}

uchar ucKeyScan() //键盘扫描函数,看哪个按键按下
{
uchar Temp=0;
uchar ucRow=0,ucLine=0; //定义扫描的行和列

for(ucLine=0;ucLine<4;ucLine++)
{
SCANPORT=uca_LineScan[ucLine];
//把0xEF赋值给P1管脚,其含义是取第一行,扫描哪个按键按下了。
Temp=SCANPORT & 0x0F;
//屏蔽高四位管脚(这些管脚是行管脚所在的位置),看这行的哪个按键按下
if(Temp!=0x0F) //判断哪个按键,并赋给列ucRow一个值
{
switch(Temp) //简单,不解释
{
case 0x0E: ucRow=10;break;
case 0x0D: ucRow=20;break;
case 0x0B: ucRow=30;break;
case 0x07: ucRow=40;break;
default: ucRow=50;break;
}
break;
}
}
//循环四次,就是扫描完四行,外成循环是行,里面判断这行里哪列的按键按下

SCANPORT=0x0F;

return ucRow+ucLine+1;
//返回哪个按键按下。如返回12,则意思是2行1列的按键按下
//注意:我说的是函数里的行和列,你给的图看不清楚连线,所以不一定对应你的行和列

}

void vKeyProcess(unsigned char ucKeyCode)//不同按键按下,对应不同的操作
{

switch(ucKeyCode)
{
case 11:P2=0xff;P3=0x7f;break; //'7'
case 12:P2=0xff;P3=0x3f;break; //'8'
case 13:P2=0xff;P3=0x1f;break;
case 14:P2=0xff;P3=0x0f;break;

case 21:P2=0xff;P3=0x07;break; //'4'
case 22:P2=0xff;P3=0x03;break; //'5'
case 23:P2=0xff;P3=0x01;break;
case 24:P2=0xff;P3=0x00;break;

case 31:P3=0x00;P2=0x7f;break; //'1'
case 32:P3=0x00;P2=0x3f;break; //'2'
case 33:P3=0x00;P2=0x1f;break;
case 34:P3=0x00;P2=0x0f;break;

case 41:P3=0x00;P2=0x07;break; //'3'
case 42:P3=0x00;P2=0x03;break;
case 43:P3=0x00;P2=0x01;break; //'0'
case 44:P3=0x00;P2=0x00;break; //'+'

default:break;
}
}
void main()
{
while(1)
{
vKeyProcess(ucKeyScan());
}
}
小弟出道未久,不足之处,还请各位大虾指教一二

Ⅱ 单片机中独立键盘和矩阵键盘如何一起使用 请用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();
}
}

Ⅲ 关于单片机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);
//是死循环,退不出来~~~
}
思路很好~~编得有点乱~~~

Ⅳ 求一段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知道用

Ⅳ 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语言怎么赋值

#i nclude<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define ank P1 //键盘到单片机的端口
//DB 50H,1CH,39H,16H,38H,78H,70H,0FEH,0EFH,0FFH;A B, C, D, E, ,F ,P, -, ,. ,COLSE
//DB 01H,0C7H,22H,82H,0C4H,88H,08H,0C3H,00H,80H;带小数点的字形码0.,1.,-----9.

uchar code table[]={ //键盘编码"1~F~0"
0xD7,0x32,0x92,0xD4,
0x98,0x18,0xD1,0x10,
0x90,0x50,0x1C,0x39,
0x16,0x38,0x78,0x11};
uchar num,temp,num1;
void delay(uint z) //延时子程序 Zms
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar keyscan(); //键盘函数声明
void display(uchar aa);//显示函数声明
void main() //主函数
{

while(1)
{
display(keyscan());
}
}
void display(uchar aa) //显示子程序
{
//la=1;
//P0=table[aa-1];
//la=0;
SBUF=table[aa-1];
}
uchar keyscan() //键盘扫描程序,取回一个键盘号
{
ank=0xfe;
temp=ank;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=ank;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=ank;
switch(temp)
{
case 0xee:num=1;
break;
case 0xde:num=2;
break;
case 0xbe:num=3;
break;
case 0x7e:num=4;
break;
}
while(temp!=0xf0)
{
temp=ank;
temp=temp&0xf0;
}
}
}

ank=0xfd;
temp=ank;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=ank;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=ank;
switch(temp)
{
case 0xed:num=5;
break;
case 0xdd:num=6;
break;
case 0xbd:num=7;
break;
case 0x7d:num=8;
break;
}
while(temp!=0xf0)
{
temp=ank;
temp=temp&0xf0;
}
}
}

ank=0xfb;
temp=ank;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=ank;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=ank;
switch(temp)
{
case 0xeb:num=9;
break;
case 0xdb:num=10;
break;
case 0xbb:num=11;
break;
case 0x7b:num=12;
break;
}
while(temp!=0xf0)
{
temp=ank;
temp=temp&0xf0;
}
}
}

ank=0xf7;
temp=ank;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=ank;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=ank;
switch(temp)
{
case 0xe7:num=13;
break;
case 0xd7:num=14;
break;
case 0xb7:num=15;
break;
case 0x77:num=16;
break;
}
while(temp!=0xf0)
{
temp=ank;
temp=temp&0xf0;
}
}
}
return num;
}
这个是取按键值的程序,然后具体做什么,你可以自己做函数。

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

使用这个到板子里面:

Ⅷ 键盘 单片机程序C语言

哪有这样写的?

你说的也不清楚啊

P3.1串口输出一个信号给电脑四个键带便“上下左右”,...

这句什么意思呢?

阅读全文

与单片机键盘c语言相关的资料

热点内容
lk4102加密芯片 浏览:588
怎么更改app店面 浏览:489
设备部门如何做好服务器 浏览:849
androido下载 浏览:478
神奇高量战法副图源码 浏览:830
汇编语言设计凯撒密码加密器 浏览:392
主次梁加密是加在哪里 浏览:664
模板匹配算法matlab 浏览:825
外地程序员去北京 浏览:24
安卓机换苹果12如何转移数据 浏览:420
互联网ntp服务器地址及端口 浏览:613
pdf到word转换器 浏览:269
飞行解压素材 浏览:498
51单片机指令用背吗 浏览:936
unityai算法 浏览:834
我的世界ice服务器如何打开pvp 浏览:975
c语言编程如何做标记 浏览:884
python数据分析实战pdf 浏览:985
u盘插入文件夹 浏览:918
华为amd云服务器 浏览:497