矩阵式键盘扫描c程序Word格式.docx
- 文档编号:16169594
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:11
- 大小:30.70KB
矩阵式键盘扫描c程序Word格式.docx
《矩阵式键盘扫描c程序Word格式.docx》由会员分享,可在线阅读,更多相关《矩阵式键盘扫描c程序Word格式.docx(11页珍藏版)》请在冰豆网上搜索。
uchartemp;
ucharkey;
//键顺序吗
voidbeep();
//蜂鸣器
voiddelay0(ucharx);
//x*0.14MS
//--------------------------------------------------
/*延时子程序*/
voiddelay(ucharx)
{ucharj;
while((x--)!
=0)
{for(j=0;
j<
125;
j++)
{;
}
}
/*键扫描子程序*/
voidkeyscan(void)
{
P1=0x0F;
//低四位输入
delay
(1);
temp=P1;
//读P1口
temp=temp&
0x0F;
temp=~(temp|0xF0);
if(temp==1)
key=0;
elseif(temp==2)
key=1;
elseif(temp==4)
key=2;
elseif(temp==8)
key=3;
else
key=16;
P1=0xF0;
//高四位输入
//读P1口
0xF0;
temp=~((temp>
>
4)|0xF0);
key=key+0;
key=key+4;
key=key+8;
key=key+12;
dis_buf=table[key];
//查表得键值
/*判断键是否按下*/
voidkeydown(void)
P1=0xF0;
if(P1!
=0xF0)
{
keyscan();
beep();
//while(P1!
=0xF0);
//等待键释放
}
voidbeep()
unsignedchari;
for(i=0;
i<
100;
i++)
{
delay0(4);
BEEP=!
BEEP;
//BEEP取反
}
BEEP=1;
//关闭蜂鸣器
delay(250);
//延时
voiddelay0(ucharx)
while(x--)
for(i=0;
i<
13;
i++){}
//--------------------------------------------------
main()
P0=0xFF;
//置P0口
P2=0xFF;
//置P2口
dis_buf=0xBF;
while
(1)
{
keydown();
P0=dis_buf;
//键值送显示
delay
(2);
P2=0x7F;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
reg52.h>
sbitkey0=P1^0;
sbitkey1=P1^1;
sbitkey2=P1^2;
sbitkey3=P1^3;
sbitkey4=P1^4;
sbitkey5=P1^5;
sbitkey6=P1^6;
sbitkey7=P1^7;
voidkey_judge(void)
{ucharkeyvalue=0;
//设置按键变量,初始化为0表示没有按键
keyvalue=P1&
0xFF;
//得到键值
while(keyvalue!
=0xff)
//如果按键有按下
delay(1000);
//软件延时消抖
if((keyvalue&
P1)!
//确实有按下
while((keyvalue^P1)!
=0x0)//等待按键释放
delay(500);
switch(keyvalue)
case0xfe:
managekey0();
break;
case0xfd:
managekey1();
case0xfb:
managekey2();
case0xf7:
managekey3();
case0xef:
managekey4();
case0xdf:
managekey5();
case0xbf:
managekey6();
case0x7f:
managekey7();
default:
break;
keyvalue=0;
//重新初始化键值,跳出循环
keyvalue=P1&
0Xff;
//是误动作,则继续查询,等待下一轮按键
voidmanagekey0(void)
voiddelay(uintn)
{uinti;
for(i=0;
n;
i++;
);
voidmain(void)
//初始化
while
(1)
key_judge();
for(;
{//其它程序
/*现在修改这位同学的程序*/
bitkeyjudge(void)
{//ucharKeyV;
ucharKeyV1;
//uchartmp;
KeyV1=0xf0;
P1=KeyV1;
if((P1&
0xf0)!
=0xf0)
//return(0);
修改
//mling(12);
return
(1);
else
return(0);
ucharkbscan(void)/*按键扫描*/
{bitflag1;
flag=keyjudge(void);
if(flag1==1)
{while((P1&
0xf0)==0xf0)//按键释放?
//这里可存放按键扫描的值
//0表示没有键按下
/*
下面的这段写法让人有点晕
{for(a=0;
a<
4;
a++)
{tmp=P3;
tmp=0xfe;
KeyV=_crol_(tmp,a);
if(P34==0)
{KeyV=P3;
if(P35==0)
if(P36==0)
if(P37==0)
for(;
;
)
{if((tmp&
0xf0)==0xf0)
return(KeyV);
*/
1、按键扫描(线反转)
//--------------------------------------------------------------------------------------------------
//函数名称:
program_SCANkey
//函数功能:
程序扫描键盘,
//
有键按下完成按键处理,无键按下直接返回
//--------------------------------------------------------------------------------------------------
voidprogram_SCANkey()
unsignedcharkey_code;
if(judge_hitkey())
//判断是否有键按下
//延时20ms左右,消除抖动干扰
//判断是否有效按键
key_code=scan_key();
//获取键值
while(judge_hitkey());
//等待按键释放
key_manage(key_code);
//键盘扫描、键盘散转、按键处理
judge_hitkey
//判断是否有键按下,有返回1,没有返回0
//列判断,还可以用行判断。
bitjudge_hitkey()
//判断是否有键按下,有返回1,没有返回0
unsignedcharscancode,keycode;
scancode=0x0F;
//开始设定P1.0~P1.3输出全1(初值)即表明无键闭合
KEY=scancode;
keycode=KEY;
//读取P1.0~P1.3的真实状态,从而确定有没有键被按下
if(keycode==0x0F)
return(0);
//全1则无键闭合
else
//否则有键闭合
scan_key
//扫描键盘,返回键值(高四位代表行,低四位代表列)
//说明:
scancode扫描码,keycode键值,keycode_line行,keycode_row列
//过程:
先扫描行,确定那行的按键被按下。
再扫描列,确定那列的按键被按下,从而确定那个按键被按下。
unsignedcharscan_key()
unsignedcharscancode,keycode,keycode_line,keycode_row;
scancode=0xF0;
//列置低,行置高
KEY=scancode;
//输入扫描码,扫描行
keycode_line=KEY;
//KEY的值是与键盘相连的P的状态值。
若没有按键按下KEY的值为0xF0,若有按键按下则KEY的值就不是0xF0
//列置高,行置低
//输入扫描码,扫描列
keycode_row=KEY;
若没有按键按下KEY的值为0x0F,若有按键按下则KEY的值就不是0x0F
keycode=((keycode_line&
0xF0)|(keycode_row&
0x0F));
return(keycode);
2、按键扫描(逐行扫描)
kbscan
键盘扫描子程序
判断是否有键按下,有返回键值,没有返回0
//p1的高四位为列,低四位为行
P1.7
P1.6
P1.5
P1.4
P1.3
P1.2
P1.1
P1.0
列4
列3
列2
列1
行4
行3
行2
行1
先根据列判断是否有键按下,没有返回0,有则逐行扫描以确定按键所在的行,再确定按键所在列
从而最终确定该按键。
ucharkbscan(void)
ucharsccode,recode;
P1=0xf0;
//置所有行为低电平,行扫描,列线输入(此时)
=0xf0)
//判断是否有有键按下(读取列的真实状态,若第4列有键按下则P1的值会变成01110000),有往下执行
delays();
//延时去抖动(10ms)
if((P1&
//再次判断列中是否是干扰信号,不是则向下执行
sccode=0xFE;
//逐行扫描初值(即先扫描第1行)
while((sccode&
0x10)!
=0)//行扫描完成时(即4行已经全部扫描完成)sccode为11101111停止while
P1=sccode;
//输出行扫描码
if((P1&
//本行有键按下(即P1(真实的状态)的高四位不全为1)
recode=(P1&
0xf0)|0x0f;
//输出列扫描码按位或运算
return(sccode&
recode);
//返回行和列
else//所扫描的行没有键按下,则扫描下一行,直到4行都扫描,此时sccode值为11101111退出while程序
sccode=(sccode<
<
1)|0x01;
//行扫描码左移一位
return0;
//无键按下,返回0
--------------------------------------------------------------------------------------------------------------------------
/*Main.c*/
#include"
global.c"
voidSystemInit();
voidTimer1Init();
voidKickDog();
voiddelay();
unsignedintjudge_key();
unsignedintscan_key();
unsigned
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 矩阵 键盘 扫描 程序