4238|5

61

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

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

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

最新回复

看看啊  详情 回复 发表于 2010-6-2 22:06
点赞 关注

回复
举报

70

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我给你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();
}
}

楼主自己借鉴下,多试验下。如果实在还有问题。
建议楼主把上述功能分块化,一个个的实现,然后再把几个程序合并下,肯定能搞定,祝你好运。
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
十分感谢啊,谢谢了
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

4
 
好的,希望内容不错
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

5
 
看看,了解一下
 
 
 

回复

52

帖子

0

TA的资源

一粒金砂(初级)

6
 
看看啊
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表