懂单片机的请进!

求一C程序在单片机4*4上输入数字,数字在数码管显示,显示形式类似手机输入号码一样。即输入第一个数字,显示在个位,输入第二个数字后,第一个数字跳到十位,第二个数字在个位……我只要做到第四位数字。没有现有程序,给我说一下工作原理也行。谢谢!扫描键盘那部分我已经做好好了,就是差显示方面的不行
2026年09月26日 14:23
有3个网友回答
网友(1):

讲起来有点麻烦啊,下面是一个我刚开始学单片机的时候写的,是用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--);
}

网友(2):

程序可以分为3个部分:
1\采集
根据电路的不同,采集方法也略有不同,简单些的可以采用矩阵电路.
可以采用扫描方式或者中断方式.
2\处理
做4个字节寄存器,如果存储空间不大,4个半字节寄存器也可以.
分为个/十/百/千位.
采集到第一个数字后,放入个位,采集到第二个数字,把个位数字的数移入到十位,新数字放入个位...依次类推,直到放入到千位.
3\显示
把个/十/百/千位的数字对应输出即可.
如果最高位为0,则不显示.

先用7位数据线,静态点亮单个数码管.
一个成功之后,再扩展到4个,动态显示.

网友(3):

这个貌似很简单哦