|
楼主 |
发表于 2006-9-13 17:56:53
|
显示全部楼层
我把源程序在发一遍把
//ICC-AVR application builder : 2006-9-13 13:45:46
// Target : M128
// Crystal: 8.0000Mhz
#include <iom128v.h>
#include <macros.h>
#include "math.h"
#define uchar unsigned char
#define uint unsigned int
#define CON 1000
uint cntold; //初始计数值:0
uint cntnew;
//数码管字型表,对应0,1,2,3,4,5,6,7,8,9//
const uchar Table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x51,0x79,0x71};
uchar ledbuff[4]={0x3f,0x3f,0x3f,0x3f}; //显示初始值:0 0 0 0
void Display(uchar *p) //动态显示函数,参数p为待显示的数组名
{uchar i,sel=0x01;
for(i=0;i<4;i++)
{PORTC=~sel; //选通最右边的数码管
PORTA=Table[p]; //送字型码
DelayMs(1); //显示延时
sel=sel<<1; //移位以显示前一位
}
}
//计数值处理函数。参数i:计数值;参数p:处理数据存放的数组名//
//功能:此函数用于将计数值拆分为BCD码的千,百,十,一数据,用于查表显示//
void Process(uint i,uchar *p)
{p[0]=i/1000;
i=i%1000;
p[1]=i/100;
i=i%100;
p[2]=i/10;
i=i%10;
p[3]=i;
}
void HZ(unsigned long int i, uchar *p)
{
uint tem;
p[0]=CON/i;
tem=CON%i;
tem= tem*10;
p[1]=tem/i;
tem=tem %i;
tem*=10;
p[2]=tem/i;
tem=tem %i;
tem*=10;
p[3]=tem/i;
}
void port_init(void)
{
PORTA = 0xFF;
DDRA = 0xFF;
PORTB = 0xFF;
DDRB = 0xFF;
PORTC = 0xFF; //m103 output only
DDRC = 0xFF;
PORTD = 0x00;
DDRD = 0x00;
PORTE = 0x00;
DDRE = 0x00;
PORTF = 0x00;
DDRF = 0x00;
PORTG = 0x00;
DDRG = 0x00;
}
//TIMER1 initialize - prescale:1
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1Hz
// actual value: Out of range
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0x00 /*INVALID SETTING*/; //setup
TCNT1L = 0x00 /*INVALID SETTING*/;
OCR1AH = 0x00 /*INVALID SETTING*/;
OCR1AL = 0x00 /*INVALID SETTING*/;
OCR1BH = 0x00 /*INVALID SETTING*/;
OCR1BL = 0x00 /*INVALID SETTING*/;
OCR1CH = 0x00 /*INVALID SETTING*/;
OCR1CL = 0x00 /*INVALID SETTING*/;
ICR1H = 0x00 /*INVALID SETTING*/;
ICR1L = 0x00 /*INVALID SETTING*/;
TCCR1A = 0x00;
TCCR1B = 0xc2; //start Timer clk/8, up chufa
}
#pragma interrupt_handler timer1_capt_isr:12
void timer1_capt_isr(void)
{
cntnew=(ICR1H<<8)|ICR1L;
TCNT1H = 0x00 ;
TCNT1L = 0x00 ;
ICR1H = 0x00 ;
ICR1L = 0x00 ;
TCCR1B = 0xc2;
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
XDIV = 0x00; //xtal divider
XMCRA = 0x00; //external memory
port_init();
timer1_init();
MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EICRB = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK = 0x20; //timer interrupt sources
ETIMSK = 0x00; //extended timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void DelayMs(uint i) //Ms级延时,参数i为延时时间
{
uint j;
for(;i!=0;i--)
{for(j=8000;j!=0;j--) {;}}
}
void main(void)
{
unsigned long int Load=20;
init_devices();
//初始化I/O口
PORTA=0xff; //点亮以测试所有的数码管
PORTC=0x00;
// DelayMs(100); //延时
PORTC=0xff; //熄灭所有的数码管
while(1)
{
if ((cntnew&0xfff8)!=(cntold&0xfff8))
{
cntold=cntnew;
}
// hextobcd(cntold);
// Process(cntold,ledbuff); //计数值处理
// Process(Load,ledbuff); //计数值处理
HZ(Load,ledbuff); //计数值处理
// HZ(cntold,ledbuff); //计数值处理
Display(ledbuff); //动态扫描显示
}
} |
|