关于单片机4*4矩阵键盘的程序,有好多地方不明白其用意啊。
P1.0~P1.3为列,P1.4~P1.7为行;程序如下:intkeyscan(){unsignedchark,k_temp;//首先定义了两个无符号型的字符型变量,这里...
P1.0~P1.3为列,P1.4~P1.7为行;
程序如下:
int keyscan()
{
unsigned char k, k_temp; //首先定义了两个无符号型的字符型变量,这里明白;
P1=0xf0; //置P1的口高4位全为1,低四位全为0,即行全为1.列全为0,这里对吧;
k=P1; //将P1的值赋值给k;
if (k != 0xf0) /*(1)如果k != 0xf0 就是这里,K怎么可能不等于0xf0呢;另外直接写
P0 != 0xf0 不就行了,为什么还要先赋值给k再写呢这步呢?*/
{
delay();
k_temp=P1;
if (k == k_temp)
{
k=0xfe; //(2)这里为什么让k为0xfe?
do
{
P1=k; /*(3)让P1为k的值了,那么下面的那个if怎么可能 != P1呢?
if( k !=P1)
{
switch( P1 )
{
……; //里面的程序省去了;
}
}
k=_crol_(k,1);
}while(k != 0xfe);
}
}
} //真心求助了!!谢谢! 没有财富了,实在是不好意思。 展开
程序如下:
int keyscan()
{
unsigned char k, k_temp; //首先定义了两个无符号型的字符型变量,这里明白;
P1=0xf0; //置P1的口高4位全为1,低四位全为0,即行全为1.列全为0,这里对吧;
k=P1; //将P1的值赋值给k;
if (k != 0xf0) /*(1)如果k != 0xf0 就是这里,K怎么可能不等于0xf0呢;另外直接写
P0 != 0xf0 不就行了,为什么还要先赋值给k再写呢这步呢?*/
{
delay();
k_temp=P1;
if (k == k_temp)
{
k=0xfe; //(2)这里为什么让k为0xfe?
do
{
P1=k; /*(3)让P1为k的值了,那么下面的那个if怎么可能 != P1呢?
if( k !=P1)
{
switch( P1 )
{
……; //里面的程序省去了;
}
}
k=_crol_(k,1);
}while(k != 0xfe);
}
}
} //真心求助了!!谢谢! 没有财富了,实在是不好意思。 展开
2个回答
展开全部
闹明白这些问题,先要闹明白:P1是准双向口,读之前需要置1。
P1内部有弱上拉,输出高电平的时候,可以被外部信号拉低。
注意,整个按键扫描的过程中,P1.4~P1.7始终输出的是高电平,但这个高电平是弱上拉的,可以被外部信号拉低,输出1,你再读回来的时候,就不一定是1,具体取决于外部电路的信号。
多说一下,输出0,你再读回来的时候,一定是0。
最开始的P1=0xF0,是检测有没有键被按下,P1.0~P1.3同时输出低电平,如果有键按下,则P1.4~P1.7中至少有一位会被拉低,读回来的结果必然与0xF0不相等,由此可以知道有没有按键按下。
这时无法识别具体是哪个键,要知道具体是哪个按键,需要P1.0~P1.3则轮流输出低电平,如果有按键按下,这个输出的低电平就通过按键拉低P1.4~P1.7,具体信号取决于矩阵中的哪个键被按下。
P1内部有弱上拉,输出高电平的时候,可以被外部信号拉低。
注意,整个按键扫描的过程中,P1.4~P1.7始终输出的是高电平,但这个高电平是弱上拉的,可以被外部信号拉低,输出1,你再读回来的时候,就不一定是1,具体取决于外部电路的信号。
多说一下,输出0,你再读回来的时候,一定是0。
最开始的P1=0xF0,是检测有没有键被按下,P1.0~P1.3同时输出低电平,如果有键按下,则P1.4~P1.7中至少有一位会被拉低,读回来的结果必然与0xF0不相等,由此可以知道有没有按键按下。
这时无法识别具体是哪个键,要知道具体是哪个按键,需要P1.0~P1.3则轮流输出低电平,如果有按键按下,这个输出的低电平就通过按键拉低P1.4~P1.7,具体信号取决于矩阵中的哪个键被按下。
追问
太好了,终于弄明白if那里的关系了。只是 k=0xfe 这里还有点不太明白, k=0xfe 为什么让最后一位为0? 如果我写成 k=0xf0 呢, 同样是把后四位置为 0 ,如果有键按下的时候,对应的高四位就会被拉低为 0 了。 不写 k=0xfe 而写成 k=0xf0 可不可以呢,如果可以的话,在程序的前面不是已经把 0xf0 的值存在k里面了吗,是不是这里就可以不写东西了?而程序里为什么要那样写呢?
回答的太专业了
追答
k=0xfe只有k中的最低位写成0,后面循环里面有个_crol_移位,显然,这里的目的是“轮流”将某一位写成0。
至于后面的while( k!= 0xfe )感觉是有点问题,似乎、仿佛,好像着应该是 while( k!=0xef ),这个不太确定,也可能与省略的程序有关。
2013-04-02
展开全部
计算题:(-18)除以 2又1/4 +4/9 除以(-16) ( 1又1/5 - 1/10 - 2/5 )/ (-6/5)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询