单片机中怎么确定I/O接口PX的值?
时间:10-02
整理:3721RD
点击:
小妹刚学51单片机,对于之中的接口赋值问题一直不懂。望高人指教……
问题如下:
4X4 矩阵键盘控制条
形LED 显示
/* 名称:4X4 矩阵键盘控
制条形LED 显示
说明:运行本例时,按
下的按键值越大点亮的
LED 越多。
*/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//矩阵键盘按键特征码表
uchar code KeyCodeTable[]={0x11,0x12,0x14,0x18,0x21,
0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88};
//延时
void DelayMS(uint x)
{
uchar i;
while(x--) for(i=0;i<120;i++);
}
//键盘扫描
uchar Keys_Scan()
{
uchar sCode,kCode,i,k;
//低4 位置0,放入4 行
P1=0xf0;
//若高4 位出现0,则有键按下
if((P1&0xf0)!=0xf0)
{
DelayMS(2);
if((P1&0xf0)!=0xf0)
{
sCode=0xfe; //行扫描码初值
for(k=0;k<4;k++) //对4 行分别进行扫描
{
P1=sCode; //此处对P1进行赋值,因为sCode=0xfe,所以下面的if语句总会执行的。如果接口的值一直在改变的话,那如果在此条语句之前对p1的某一位进行修改,那P1的值是否仍然会改变。望大侠指教?不胜感激……
if((P1&0xf0)!=0xf0)
{
kCode=~P1;
for(i=0;i<16;i++) //查表得到按键序号并返回
if(kCode==KeyCodeTable)
return(i);
}
else
sCode=_crol_(sCode,1);
}
}
}
return(-1);
}
//主程序
void main()
{
uchar i,P2_LED,P3_LED;
uchar KeyNo=-1; //按键序号,-1 表示无按键
while(1)
{
KeyNo=Keys_Scan(); //扫描键盘获取按键序号KeyNo
if(KeyNo!=-1)
{
P2_LED=0xff;
P3_LED=0xff;
for(i=0;i<=KeyNo;i++) //键值越大,点亮的LED 越多
{
if(i<8)
P3_LED>>=1;
else
P2_LED>>=1;
}
P3=P3_LED; //点亮条形LED
P2=P2_LED;
}
}
}
问题如下:
4X4 矩阵键盘控制条
形LED 显示
/* 名称:4X4 矩阵键盘控
制条形LED 显示
说明:运行本例时,按
下的按键值越大点亮的
LED 越多。
*/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//矩阵键盘按键特征码表
uchar code KeyCodeTable[]={0x11,0x12,0x14,0x18,0x21,
0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88};
//延时
void DelayMS(uint x)
{
uchar i;
while(x--) for(i=0;i<120;i++);
}
//键盘扫描
uchar Keys_Scan()
{
uchar sCode,kCode,i,k;
//低4 位置0,放入4 行
P1=0xf0;
//若高4 位出现0,则有键按下
if((P1&0xf0)!=0xf0)
{
DelayMS(2);
if((P1&0xf0)!=0xf0)
{
sCode=0xfe; //行扫描码初值
for(k=0;k<4;k++) //对4 行分别进行扫描
{
P1=sCode; //此处对P1进行赋值,因为sCode=0xfe,所以下面的if语句总会执行的。如果接口的值一直在改变的话,那如果在此条语句之前对p1的某一位进行修改,那P1的值是否仍然会改变。望大侠指教?不胜感激……
if((P1&0xf0)!=0xf0)
{
kCode=~P1;
for(i=0;i<16;i++) //查表得到按键序号并返回
if(kCode==KeyCodeTable)
return(i);
}
else
sCode=_crol_(sCode,1);
}
}
}
return(-1);
}
//主程序
void main()
{
uchar i,P2_LED,P3_LED;
uchar KeyNo=-1; //按键序号,-1 表示无按键
while(1)
{
KeyNo=Keys_Scan(); //扫描键盘获取按键序号KeyNo
if(KeyNo!=-1)
{
P2_LED=0xff;
P3_LED=0xff;
for(i=0;i<=KeyNo;i++) //键值越大,点亮的LED 越多
{
if(i<8)
P3_LED>>=1;
else
P2_LED>>=1;
}
P3=P3_LED; //点亮条形LED
P2=P2_LED;
}
}
}
呃。看了好多遍红字,还是不懂想问什么。在For循环内P1=sCode是不错,但并不会永远等于0xfe,因为下面有条词句将sCode更改了,只有第一次等于0xFE。
