Ⅰ 求单片机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语言程序!!!
使用这个到板子里面:
#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语言
哪有这样写的?
你说的也不清楚啊
P3.1串口输出一个信号给电脑四个键带便“上下左右”,...
这句什么意思呢?