51单片机,按键输入,只能显示数码管第一位的数,其他一切正常。

#include<reg52.h>#include<intrins.h>#defineucharunsignedcharunsignedcharcodetable[]={... #include<reg52.h>

#include<intrins.h>
#define uchar unsigned char
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 0~9;
unsigned char code Display_Bit[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; // Left~Right; Low active
void Delay(uchar i);
void Display(int num[6]);
sbit beep=P2^3;
sbit duan=P2^6;
sbit wei=P2^7;
void Delay(uchar i)
{
int j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void Display(int num[6])
{
int n=0;
for(n=0;n<6;n++){
wei=0;
duan=0;
duan=1;
P0=table[num[n]];
duan=0;
wei=1;
P0=Display_Bit[5-n]; //从右往左显示
wei=0;
Delay(3);
}

}
uchar keyscan()
{
while(1)
{
unsigned char recode,i,j,key;
for(i=0;i<4;i++)
{
P3=0xff;
P3=~(0x01<<i);//取行数
recode=P3>>4;
if(recode<0x0f)//判断按键
{
for(j=0;j<4;j++)
{
if(!(recode&0x01<<j))//取列数
break;
}
key=(i<<2)+j;
beep=0;
Delay(50); //蜂鸣器延时
beep=1;
return key;//返回键值 0-15
}//if(recode<0x0f)
Delay(5); //延时
}//for(i=0;i<4;i++)
}//while(1)
}
void main()
{
int z[6]={1,2,3,4,5,6};
int i,k=0xff;
while(1){
for(i=0;i<6;i++){
Display(z);
k=keyscan();
if(k!=0xff){
z[i]=k;
Delay(10);
}
}
}
}
展开
 我来答
yes__mcu
2013-01-26 · TA获得超过923个赞
知道小有建树答主
回答量:387
采纳率:0%
帮助的人:438万
展开全部
你这个程序主要是因为显示的时候,最后一位没有消隐。退出显示程序的时候,最后显示的那一位始终在显示,而调用按键的时候,如果没有按键按下,则不会返回主函数,所以看起来好像是只有1位显示。另外说一句题外话,你这个程序的风格确实不敢恭维
wolf_lhy
2013-01-26 · TA获得超过6608个赞
知道大有可为答主
回答量:1090
采纳率:66%
帮助的人:535万
展开全部
有个地方没看明白,麻烦您解释一下:
void Display(int num[6])
{
int n=0;
for(n=0;n<6;n++){
wei=0;
duan=0;
duan=1;
P0=table[num[n]];
duan=0;
wei=1;
P0=Display_Bit[5-n]; //从右往左显示注意:这个地方应该是P0吗?你搞错了吧?
wei=0;
Delay(3);
}
追问
是p0,我这块板p0即作为位选,有作为段选。我是要加中断吗?应该怎么加?
追答
void Display(int num[6])
{
int n=0;
for(n=0;n<6;n++){
wei=0;
duan=0;
duan=1;
P0=table[num[n]];
duan=0;
wei=1;
P0=Display_Bit[5-n]; //从右往左显示注意:这个地方应该是P0吗?你搞错了吧?
wei=0;
Delay(3);
}

是不是你那句Delay(3)时间太短了呢?
你把它修改成 Delay(255);试试看.

另外,你的上面的程序,我无法复制到Keil里,一复制格式就是个错误的.

如果有可能,你把你的电路原理和源程序发到我E箱里,我看一下.
我的E箱是 壹四二捌二柒肆五二零.秋秋.com
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
迁徙的蜗蜗牛
2013-01-26 · 超过11用户采纳过TA的回答
知道答主
回答量:31
采纳率:100%
帮助的人:26.6万
展开全部
可能其它位也有微弱的显示,关灯仔细看一下也许可以看见。
Display()里短时间delay(3)扫描了6个数码管后落在n=5位(Display_Bit[5-n],也就是0xfe最left的你所说的第1位),按键扫描和主函数里的循环都比delay(3)长很多,造成n=5位数码管通电时间最长也就是最亮。

让Display()里每个数码管的点亮时间一样即可。
即每次进入Display()只点亮一个数码管,下次进入再点亮下一个。
来自:求助得到的回答
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式