单片机c语言矩阵

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

uchar code DSY_CODE[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00
};
uchar code KeyCodeTable[]=
{
0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88
};

void Delay()
{
uchar i;
for(i=0;i<200;i++);
}

uchar Keys_Scan()
{
uchar sCode,kCode,i,k;
P1 = 0xf0;
if((P1&0xf0)!=0xf0)
{
Delay();
if((P1&0xf0)!=0xf0)
{
sCode = 0xfe;
for(k=0;k<4;k++)
{
P1 = sCode;
if((P1&0xf0)!=0xf0)
{
kCode = ~P1;
for(i=0;i<16;i++)
{
if(kCode == KeyCodeTable[i])
return i;
}
}
else
sCode = _crol_(sCode,1);
}
}
}
return -1;
}

void main()
{
uchar KeyNO = -1;
uchar i,P2_LED,P3_LED;
while(1)
{
KeyNO = Keys_Scan();
if(KeyNO != -1)
{
P2_LED = 0xff;
P3_LED = 0xff;
for(i=0;i<=KeyNO;i++)
{
if(i<8)
P3_LED>>=1;
else
P2_LED>>=1;
}
P3 = P3_LED;
P2 = P2_LED;
}
}
}
备注下程序啊,非常感谢
还有一点就是程序中的code的作用请说明清楚点, 请回答的高手认真点,谢谢 ,

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

uchar code DSY_CODE[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00
};
uchar code KeyCodeTable[]=
{
0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88
};

void Delay() //延时,不用多说,延时时间600us左右
{
uchar i;
for(i=0;i<200;i++);
}

uchar Keys_Scan() //键盘扫描程序
{
uchar sCode,kCode,i,k;
P1 = 0xf0; //P1低四位置零
if((P1&0xf0)!=0xf0) //读高四位数据,根据高四位是否有零判断是否有键按下
{
Delay(); //若有键按下,延时,去抖动
if((P1&0xf0)!=0xf0) //再次判断是否有键按下,防止上一步是误判断
{
sCode = 0xfe; //确实有键按下,准备读键值
for(k=0;k<4;k++) //4*4矩阵键盘,需要扫描四次
{
P1 = sCode; //行线最低位置零
if((P1&0xf0)!=0xf0) //判断第一行是否有键按下
{
kCode = ~P1; //若有键按下,读键值
for(i=0;i<16;i++) //键值总共会有16种可能情况
{
if(kCode == KeyCodeTable[i]) //读键值表,判断是几号键按下
return i; //返回按键编号
}
}
else
sCode = _crol_(sCode,1); //若第一行没有键按下,循环左移一位,扫描第二行
}
}
}
return -1; //若没有键按下,返回错误值
}

void main()
{
uchar KeyNO = -1;
uchar i,P2_LED,P3_LED;
while(1)
{
KeyNO = Keys_Scan(); //扫描键盘
if(KeyNO != -1) //有键按下
{
P2_LED = 0xff; //显示清零
P3_LED = 0xff;
for(i=0;i<=KeyNO;i++) //显示程序,16个LED对应16个按键,一一对应,根据按键编号显示对应LED
{
if(i<8)
P3_LED>>=1;
else
P2_LED>>=1;
}
P3 = P3_LED;
P2 = P2_LED;
}
}
}

这是程序是一个按键扫描程序,P1口接4*4矩阵键盘,P2,P3分别接8个LED,灌电流点亮,每个按键对应一个LED,每按下一个键,相应的LED便被点亮

DSY_CODE 这个数组是4位8段数码管的码表,码表上看是共阳数码管,对应数码管显示1-f,最后一个是全亮;
KeyCodeTable 是4*4矩阵键盘的键值,4*4矩阵键盘每按下一个键,有两位被拉低,取反就是有两位置高,这两位一位位于低四位,一位位于高四位,所有总共有16种情况
建议你看一看51单片机的书,里面矩阵键盘跟数码管讲得很清楚
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-08-31
code的作用是把数据放到程序存储空间(flash),给别人的程序注释真的挺难的,你要是看不懂,可以自己写一个呀