打印

数码管显示不正常!着急呀!

[复制链接]
4560|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
甄蔡组合|  楼主 | 2007-4-9 09:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟在做51学习 。用键盘输入,数码管显示共六个管子。但我在键盘输入时,六个数码管总是显示同一个键值。p2口输出显示。p1口接收键盘。p0用于显示选择。用外部中断0启动扫描。下面是我的程序。请高人指点。如何实现按位接收键值并显示。小弟十分感谢!!!

void time0() interrupt 0 using 0
{
unsigned char i;
P1=0x00;

for(i=0;i<2;i++) 
{

 if(i==0)
 {
 E3=1;SA=0;SB=0;SC=0;//开第0位显示
 ch[0]=keyscan();//键盘扫描
 delay(3);
 }

 if(i==1)
 {
 E3=1;SA=1;SB=0;SC=0;//开第一位显示
 ch[1]=keyscan();
 delay(3);
 }
。。。。。。

if(i==6)
 {
 E3=1;SA=0;SB=1;SC=1;//开第6位显示
 ch[5]=keyscan();
 delay(3);
 }


}

/*if(1)
{
E3=1;SA=0;SB=0;SC=0;
keyscan();
delay(1);
}

if(1)
 {
 E3=1;SA=1;SB=0;SC=0;
//P2=table[3];
keyscan();
delay(1);
}*/

}

void main(void)
{
unsigned char i;
SP=0x50;
EA=0;
time_init();//设置初值


for(i=0;i<2;i++)
{
P0=1;
E3=1;
display(ch);
delay(1);
}


}

相关帖子

沙发
ayb_ice| | 2007-4-9 10:16 | 只看该作者

还是去新手园地吧

还是去新手园地吧,那个地方比较适合你。。。

使用特权

评论回复
板凳
甄蔡组合|  楼主 | 2007-4-9 11:17 | 只看该作者

2楼 我是新手 如果你是高手就指点一下

使用特权

评论回复
地板
dai_weis| | 2007-4-9 11:21 | 只看该作者

如果让你显示:123456,每位一个数字正常么?

使用特权

评论回复
5
WSL_5631| | 2007-4-9 11:32 | 只看该作者

不知道你要实现什么功能

if(i==0)
{
E3=1;SA=0;SB=0;SC=0;//开第0位显示
ch[0]=keyscan();//键盘扫描
delay(3);
}

if(i==1)
{
E3=1;SA=1;SB=0;SC=0;//开第一位显示
ch[1]=keyscan();
delay(3);
}
不知道你键盘程序怎么写的
下面keyscan()返回的值应该是一样的,当然显示的数值一样
ch[0]=keyscan();//键盘扫描
ch[1]=keyscan();

使用特权

评论回复
6
疯狂的闪电| | 2007-4-9 12:53 | 只看该作者

最好把全部程序写出来

1、for(i=0;i<2;i++)  ,怎么能显示六位
2、键盘扫描程序不知道写成怎么样。
3、(楼上)下面keyscan()返回的值应该是一样的,当然显示的数值一样
ch[0]=keyscan();//键盘扫描
ch[1]=keyscan();
4、P0口有没有接上拉?

使用特权

评论回复
7
甄蔡组合|  楼主 | 2007-4-9 14:49 | 只看该作者

我想实现键盘输入六位数。然后显示。请高手指点

#include <reg51.h>
#include<math.h>
#include <stdio.h>
#include<stdlib.h>

sbit SA=P0^0;
sbit SB=P0^1;
sbit SC=P0^2;
sbit E3=P0^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// 0,1,2,3,4,5,6,7,8,9

unsigned char key,temp,ch[6];






void time_init(void)//定时器0初始化
{

TMOD=0x09;
//TH0=0xf4;TL0=0xc0;//定时3.125ms
//TR0=1;
ET0=1;
EX0=1;
IT0=0;
EA=1;
}


void display(unsigned char k) //显示程序
{
  P2=table[k];
}

void delay(char x)//延时函数
{
     char i;
     while(x--)
     for(i=0;i<125;i++)
     continue;
      


void check(void)//判断键盘松开
{
 while(temp!=0x0f) 
   { 
     temp=P1; 
     temp=temp & 0x0f;              
}


/*void check_down(void)//判断键盘按下
{
while(temp==0x0f) 

   { 
     temp=P1; 
     temp=temp & 0x0f;              
}

}*/

unsigned char keyscan(void) //按键扫描子程序
{
 
//P1=0x00;
 P1_7=0;
 temp=P1;
temp&=0x0f;
//check_down();

if(temp !=0x0f)
 {
  
delay(9);
 temp=P1;
  
  temp&=0x0f;
  if(temp !=0x0f)
  {
   temp=P1;
   temp&=0x0f;

   switch(temp)
   {
   case 0x0d:key=55;break;
   case 0x0b:key=22;break;
   case 0x07:key=11;break;
   }
   display(key);
  // check(); 
 }
 }

 P1=0xFF;
 P1_6=0;
 temp=P1;
 temp&=0x0f;
 if(temp !=0x0f)
 {
  
  temp=P1;
  delay(9);
temp&=0x0f;
  if(temp !=0x0f)
  {
   temp=P1;
   temp&=0x0f;

   switch(temp)
   {
   case 0x0e:key=33;break;
   case 0x0d:key=3;break;
   case 0x0b:key=2;break;
   case 0x07:key=1;break;
}
   display(key);
  
  // check();  
 }
 }

 P1=0xFF;
 P1_5=0;
 temp=P1;
 temp&=0x0f;
 if(temp !=0x0f)
 {
  
  temp=P1;
  delay(9);
  temp&=0x0f;
  if(temp !=0x0f)
  {
   temp=P1;
   temp&=0x0f;

   switch(temp)
   {
   case 0x0e:key=44;break;
   case 0x0d:key=6;break;
   case 0x0b:key=5;break;
   case 0x07:key=4;break;
}
   display(key);
  //check();
}
 }

 P1=0xFF;
 P1_4=0;
 temp=P1;
 temp&=0x0f;
 if(temp !=0x0f)
 {
  
  temp=P1;
  delay(9);
  temp&=0x0f;
  if(temp !=0x0f)
  {
   temp=P1;
   temp&=0x0f;

   switch(temp)
   {
   case 0x0e:key=0;break;
   case 0x0d:key=9;break;
   case 0x0b:key=8;break;
   case 0x07:key=7;break;
   }
   display(key);
  //check();
 
}}
return(key);
}


void time0() interrupt 0 using 0
{
unsigned char i;
P1=0x00;

for(i=0;i<2;i++) 
{

 if(i==0)
 {
 E3=1;SA=0;SB=0;SC=0;
 ch[0]=keyscan();
 delay(3);
 }

 if(i==1)
 {
 E3=1;SA=1;SB=0;SC=0;
 ch[1]=keyscan();
 delay(3);
 }
}

/*if(1)
{
E3=1;SA=0;SB=0;SC=0;
keyscan();
delay(1);
}

if(1)
 {
 E3=1;SA=1;SB=0;SC=0;
//P2=table[3];
keyscan();
delay(1);
}*/

}

void main(void)
{
unsigned char i;
SP=0x50;
EA=0;
time_init();


for(i=0;i<2;i++)
{
P0=1;
E3=1;
display(ch);
delay(1);
}

使用特权

评论回复
8
甄蔡组合|  楼主 | 2007-4-9 14:51 | 只看该作者

用51发循环显示都没问题

用51发循环显示都没问题,说明硬件没问题。就是接上键盘后不能把键盘的数值正确的显示出来。

使用特权

评论回复
9
甄蔡组合|  楼主 | 2007-4-9 14:55 | 只看该作者

我只是编了两位

使用特权

评论回复
10
ayb_ice| | 2007-4-9 15:53 | 只看该作者

随便说说

程序太长一般是没有人感兴趣的,不如说思路。。。

使用特权

评论回复
11
甄蔡组合|  楼主 | 2007-4-9 16:24 | 只看该作者

求助高手

使用特权

评论回复
12
dai_weis| | 2007-4-9 16:38 | 只看该作者

我提的问题视而不见,请问如何帮你?

使用特权

评论回复
13
yharbour| | 2007-4-9 16:49 | 只看该作者

你显示下一位的时候好像没有把上一位关调

使用特权

评论回复
14
甄蔡组合|  楼主 | 2007-4-9 20:05 | 只看该作者

dai_weis不好意思

数字显示 没问题 ,但那只是软件发出。接键盘后好像是逻辑上出了问题。但我没有找到是哪的问题

使用特权

评论回复
15
dai_weis| | 2007-4-9 21:12 | 只看该作者

问题好像出在键盘函数中调用的

dispkey(key)中,改改,改成把key的值送入显示缓冲数组中的某个上面看看,
如果你的显示数组是:data[0];data[1]....data[5]
把它送到data[2]上看看怎么样

使用特权

评论回复
16
ayb_ice| | 2007-4-10 08:00 | 只看该作者

随便说说

建议你单独处理按键程序,把键号存入指定单元,显示从指定单元取数显示,这样也便于查找问题...
感觉你还没有整体概念,写程序要有任务概念...

使用特权

评论回复
17
甄蔡组合|  楼主 | 2007-4-10 08:47 | 只看该作者

小弟继续努力 谢谢各位大虾

使用特权

评论回复
18
甄蔡组合|  楼主 | 2007-4-11 18:11 | 只看该作者

终于有了突破 程序有点意思了

使用特权

评论回复
19
甄蔡组合|  楼主 | 2007-4-13 11:12 | 只看该作者

小弟 的MSN zhenyongan2008@hotmail.com

希望和朋友们交流

使用特权

评论回复
20
yezi2030| | 2007-4-25 15:27 | 只看该作者

我这有一个,你可以参考一下

#include <at89x51.h>


/*0~9字符数据*/
unsigned char code DATA_7SEG[10]={0X3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*扫描控制信号*/
unsigned char code act[4]={0xfe,0xfd,0xfb,0xf7};
/*数码管缓冲区*/
unsigned char disp[4];
/*数据缓冲区指针*/
unsigned char dpt=0;

void int_buf()
  {
    unsigned char i;
       for(i=0;i<4;i++)
          disp=DATA_7SEG;
  }
/*--------------------------*/
void timers0() interrupt 1
  {
    TH0=0xec;
     TL0=0x77;
     /*由pb送出字符*/
     P1=disp[dpt];
     P2=act[dpt];/*pc端口送出扫描信号*/
     dpt++;/*指针+1*/
     if(dpt>=4)/*清除指针*/
       dpt=0;
  }
/*-------------------------*/
void int_t0()/*初始化计数器0*/
  {
    TMOD=0x01;
     TH0=0xec;
     TL0=0x77;
     IE=0x82;
     IE1=1;
  }
/*------------------------*/
void main()
  {
      int_t0();/*初始化计数器t0*/
        int_buf();/*载入显示器初值*/
      
        while(1);

    }

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

198

帖子

0

粉丝