复位后数码管亮一会(时间极短),全灭。
什么原因?????
程序在此
#include<reg52.h>
char key,num,temp;
char table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07
};
char cbit[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f
};
char buffer[]={
0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40
};
/*******************************************delay*****************************/
void delay(int x)
{
int a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
/*void display(num)
{
P0=table[num];
P1=0xfe;
} */
/**********************************************keyscan*********************/
void keyscan()
{
int i,j;
i=8;
while(i--)
{
P1=cbit[i];
P0=buffer[i];
}
P2=0xff;
temp=P2;
if(temp!=0xff)
delay(10);
temp=P2;
if(temp!=0xff)
{
j++;
/* if(temp==0xfe)key=0;
else if(temp==0xfd)key=1;
else if(temp==0xfb)key=2;
else if(temp==0xf7)key=3;
else if(temp==0xef)key=4;
else if(temp==0xdf)key=5;
else if(temp==0xbf)key=6;
else if(temp==0x7f)key=7; */
switch(temp!=0xff)
{
case 0xfe:
key=0;
break;
case 0xfd:
key=1;
break;
case 0xfb:
key=2;
break;
case 0xf7:
key=3;
break;
case 0xef:
key=4;
break;
case 0xdf:
key=5;
break;
case 0xbf:
key=6;
break;
case 0x7f:
key=7;
break;
}
buffer[j]=table[key];
if(temp!=0xff);
delay(4);
}
}
void main()
{ while(1)
{
keyscan();
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
首先程序居然没有初始化,
还有那个关于 j 的句子是干嘛的,我到底没弄明白,直接键盘扫描后给位选赋值不就得了,
加就加吧,但你好赖给他赋个初值,加个边界啊。
另外 switch(temp!=0xff) 我怎么感觉不太对,如果这样的话括号里面不应该永远是 1 吗?
还有,大哥,,,,51里面一共才多少RAM,你就敢设这么多这样的数组,真勇敢。。。。。
谢谢指出错误,不好意思,移位显示程序(计算机式或计算器式)我编了三四天了,一直没思路,头都大了,程序乱了,重新整理了一下,switch用法确实错了,已改正。j我是想实现移位功能,但没用。移位程序在网上只搜到了一个汇编的
#include<reg52.h>
char key,num,temp;
char table[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07
};
char cbit[]=
{
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f
};
char buffer[]=
{
0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40
};
void delay(int x)
{
int a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void keyscan()
{
int i=0;
int j=0;
if(i<8)
{
i++;
P1=cbit;
P0=buffer;
P2=0xff;
temp=P2;
if(temp!=0xff)
{
delay(10);
temp=P2;
if(temp!=0xff)
{
j++;
switch(temp)
{
case 0xfe:
key=0;
break;
case 0xfd:
key=1;
break;
case 0xfb:
key=2;
break;
case 0xf7:
key=3;
break;
case 0xef:
key=4;
break;
case 0xdf:
key=5;
break;
case 0xbf:
key=6;
break;
case 0x7f:
key=7;
break;
}
buffer[j]=table[key];
if(temp!=0xff);
delay(4);
}
}
}
}
void main()
{ while(1)
{
keyscan();
}
}
下载后只在第二位数码管显示键值
继续求移位程序
不是吧,你能正确的显示出键值?
这个程序明显会陷入没有意义的循环,每一次 keyscan() 调用时都会给 i,j 赋初值0, 接下来的 if(i<8) 就没有意义了,下面在 if 的执行语句块里,又给P0,P1,P2 附了初值,相当于每次运行到这个地方就会初始化一下(也就是说只要键盘没按下去就会一直的出现初始化,我实在想不通会有正确的键值,还是在第二位,我板子刚让我整废也没法在板子上试,不好意思,这些全是我想的),接下来是消抖,还行吧,至于那个 j 我感觉没作用,如果想进行移位的话,可以在键盘扫描完之后,对P0进行赋值的时候,可以也对 P1 进行向左或向右的移位处理,实现位选信号的改变,这样那个 buffer[] 和 cbit[] 以及变量 j 就不需要了。
至于对数码管P1和P0的初始化,你可以写在main函数中 while() 的前面,或者为了规范,可以另外写一个初始化函数。
RAM即使是528的,说到底他也是个51,弱得很,能少占用内存就少占用吧,还是养成习惯的好,你的这个程序中想那些 table[] 之类不会改变的数组,定义时用 code char 定义,可以不占用RAM,而是当做程序的一部分。
上面的纯粹是脑子想的,没试验,如果有不对见谅啊。。。
一周热门 更多>