我现在的电路是一个4位的数码管,四个按键(左移<,加+,减-,确定)
进入设定程序后数码管的第一位开始闪烁,按加减调整大小。
然后按下左移键,数码管的第二位开始闪烁,按加减调整大小。
往后依次按上面的程序调整直到第四位完成,按确定结束
有没有高手能给我提供个程序啊,我写了两天,还是不行,麻烦各位了
我给你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();
}
}
楼主自己借鉴下,多试验下。如果实在还有问题。
建议楼主把上述功能分块化,一个个的实现,然后再把几个程序合并下,肯定能搞定,祝你好运。