[求助]关于操作数码管位闪烁的问题

wuxiangyun   2009-12-12 12:21 楼主
我现在的电路是一个4位的数码管,四个按键(左移<,加+,减-,确定)
进入设定程序后数码管的第一位开始闪烁,按加减调整大小。
然后按下左移键,数码管的第二位开始闪烁,按加减调整大小。
往后依次按上面的程序调整直到第四位完成,按确定结束
有没有高手能给我提供个程序啊,我写了两天,还是不行,麻烦各位了

回复评论 (5)

我给你AVR的类似程序吧。 不能完全对应上,但完全可以借鉴; 弄明白原理就OK 。

[code]//ICC-AVR application builder : 2006-3-27 14:01:07
// Target : M16
// Crystal: 8.0000Mhz

#include
#include

void port_init(void)
{
PORTA = 0x00;
DDRA  = 0xC0;
PORTB = 0x00;
DDRB  = 0x02;
PORTC = 0x00; //m103 output only
DDRC  = 0xFF;
PORTD = 0x00;
DDRD  = 0x00;
}

//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();

MCUCR = 0x00;
GICR  = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}



[code]/*
功能:
K1:加1。一直加到99
K2:减1。一直减到0
K3:LED亮
K4:LED灭
*/
#include
#define uchar unsigned char
#define uint  unsigned int
#define Left  0x80
#define Right 0x40
unsigned char const Tab[]={0x14,0x9F,0x38,0x1A,0x93,0x52,0x50,0x1F,
                          0x10,0x12,0x11,0xD0,0x74,0x98,0x70,0x71};
                                                  
void display();//负责把显示缓冲区的数据显示到数码管
void process(uchar left,uchar right);//刷新显示缓冲区
void delay(uint ticks);//延时

void GetKey();
/////////
uchar ShuMa[2];//显示缓冲区
//////////////////////////////
//KEY
uchar CNT=0;
uchar KeyUp=0;
uchar KeyDown=0;
/////////////////////////////
void main()
{
init_devices();
while(1)
{
  GetKey();
  if(KeyUp)                //加计数处理
     {
          if(++CNT==100)CNT=99 ;//K1:加1。一直加到99
          KeyUp=0;
     }
  if(KeyDown)              //减计数处理
     {
          if(CNT--==0)CNT=0 ;
          KeyDown=0;
         }
  process(CNT/10,CNT%10);           //计数值处理
  display();               //动态扫描显示

}

}


void display()
{
PORTA=Left|Right;//关显示
PORTC=ShuMa[0];  //输出数据
PORTA=~Left;          //开左数码管
delay(10);          //延时
PORTA=Left|Right;//关显示
PORTC=ShuMa[1];  //输出数据
PORTA=~Right;          //开右数码管
delay(10);          //延时
}

void process(uchar left,uchar right)
{
ShuMa[0]=Tab[left];//查表
ShuMa[1]=Tab[right];//查表
}


void delay(uint ticks)
{
uchar i;
while(ticks--)for(i=100;i!=0;i--);//约0.1mS
}

/////////////////
//KEY
void GetKey()
{
while((PINA&0x04)==0)
{
  KeyUp=1;//加法按键标志
  display();
}
while((PINA&0x08)==0)
{
  KeyDown=1;//减法按键标志
  display();
}
while((PINA&0x10)==0)
{
  PORTB|=0x02;                  //LED亮
  display();
}
while((PINA&0x20)==0)
{
  PORTB&=~0x02;                  //LED灭
  display();
}
}

楼主自己借鉴下,多试验下。如果实在还有问题。
建议楼主把上述功能分块化,一个个的实现,然后再把几个程序合并下,肯定能搞定,祝你好运。
点赞  2009-12-12 12:51
十分感谢啊,谢谢了
点赞  2009-12-12 18:59
好的,希望内容不错
点赞  2010-5-6 13:42
看看,了解一下
点赞  2010-6-2 09:39
看看啊
点赞  2010-6-2 22:06
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复