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);
}
}
}
} 展开
#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);
}
}
}
} 展开
展开全部
有个地方没看明白,麻烦您解释一下:
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);
}
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
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可能其它位也有微弱的显示,关灯仔细看一下也许可以看见。
Display()里短时间delay(3)扫描了6个数码管后落在n=5位(Display_Bit[5-n],也就是0xfe最left的你所说的第1位),按键扫描和主函数里的循环都比delay(3)长很多,造成n=5位数码管通电时间最长也就是最亮。
让Display()里每个数码管的点亮时间一样即可。
即每次进入Display()只点亮一个数码管,下次进入再点亮下一个。
Display()里短时间delay(3)扫描了6个数码管后落在n=5位(Display_Bit[5-n],也就是0xfe最left的你所说的第1位),按键扫描和主函数里的循环都比delay(3)长很多,造成n=5位数码管通电时间最长也就是最亮。
让Display()里每个数码管的点亮时间一样即可。
即每次进入Display()只点亮一个数码管,下次进入再点亮下一个。
来自:求助得到的回答
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询