讲起来有点麻烦啊,下面是一个我刚开始学单片机的时候写的,是用MSP430F149单片机,实现4*4矩阵按键识别,在数码管个位显示0~F,如果只要显示0~9,你自己修改下
还有你要的移位功能,再定义个uchar nPos=0X01;然后每次循环判断按键的时候: P4OUT=~nPos;
nPos<<=1;
结合你的硬件电路自己改一改吧,不难实现,我就不给你弄了。
还有我这数码管的码值、按键的键值跟你那也可能不一样的,需要注意
#include
typedef unsigned char uchar;
typedef unsigned int uint;
void Delay(void);
void main(void)
{
uchar keyin,key;
uchar Po[4]={0X70,0XB0,0XD0,0XE0};
uchar keyvalue[16]=
{
0X7E,0X7D,0X7B,0X77,
0XBE,0XBD,0XBB,0XB7,
0XDE,0XDD,0XDB,0XD7,
0XEE,0XED,0XEB,0XE7
};
uchar num[16]=
{
0XC0,0XF9,0XA4,0XB0,
0X99,0X92,0X82,0XF8,
0X80,0X90,0X88,0X83,
0XC6,0XA1,0X86,0X8E
};
uint i,j,k;
WDTCTL=WDTPW+WDTHOLD;
P1DIR=0XF0;
P4DIR=0XFF;
P5OUT=0XFF;
P5DIR=0XFF;
while(1)
{
for(i=0;i<4;i++)
{
P1OUT=Po[i];
if(P1IN!=(Po[i]|0X0F)) //如果有键被按下
{
Delay(); //延时消抖
if(P1IN!=(Po[i]|0X0F)) //再次检测按键状态
keyin=P1IN;
while(P1IN!=(Po[i]|0X0F)); //等待按键被放开
for(j=0;j<16;j++)
{
key=keyvalue[j];
if(key==keyin)
k=j;
P5OUT=num[k];
Delay();
};
}
}
}
}
void Delay(void)
{
uint tmp;
for(tmp = 10000;tmp > 0;tmp--);
}
程序可以分为3个部分:
1\采集
根据电路的不同,采集方法也略有不同,简单些的可以采用矩阵电路.
可以采用扫描方式或者中断方式.
2\处理
做4个字节寄存器,如果存储空间不大,4个半字节寄存器也可以.
分为个/十/百/千位.
采集到第一个数字后,放入个位,采集到第二个数字,把个位数字的数移入到十位,新数字放入个位...依次类推,直到放入到千位.
3\显示
把个/十/百/千位的数字对应输出即可.
如果最高位为0,则不显示.
先用7位数据线,静态点亮单个数码管.
一个成功之后,再扩展到4个,动态显示.
这个貌似很简单哦