|
楼主 |
发表于 2009-7-16 08:52:37
|
显示全部楼层
实用程序
编码器控制MAX538—12DA实现无级调压。SPI/74HC595方式显示控制值
在我的实验板测试通过。
//ICC-AVR application builder : 2009-6-20 10:37:26
// Target : M48
// Crystal: 8.0000Mhz
#include <iom48v.h>
#include <macros.h>
#include "delay.h"
#include "port48.h"
#define PD PORTD
#define PB PORTB
#define PC PORTC
#define ss_0 PB2_0
#define ss_1 PB2_1
#define ssa_0 PB1_0
#define ssa_1 PB1_1
#define N 6
const uchar led[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
const uchar ledrl[]={0xfe,0xfd,0xfb,0xf7,0xef,0xff};
uchar ladc[];
uint value;
uint key;
uint vdd;
void port_init(void)
{
PORTB = 0xff;
DDRB = 0xff;
PORTC = 0xff; //m103 output only
DDRC = 0xff;
PORTD = 0x07;
DDRD = 0xff;
// DRB4_0;
}
//SPI initialize
// clock rate: 62500hz
void spi_init(void)
{
SPCR = 0x51; //setup SPI
SPSR = 0x00; //setup SPI
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
spi_init();
MCUCR = 0x00;
EICRA = 0x02; //extended ext ints
EIMSK = 0x01;
//timer0_init();
SEI();
}
/********电压转换*****************/
/*
uint conv(uint i)
{
long x;
uint y;
x=(3955*(long)i)/4096;
y=(uint)x;
return y;
}
*/
uchar SPI_Mt(char t)
{
SPDR = t;
while(!(SPSR &(1 << SPIF)));
return SPDR;
}
//显示运算程序
void operation(uint dis_val)
{uchar i;
ladc[0]= dis_val/10000;
ladc[1]=(dis_val%10000)/1000;
ladc[2]=(dis_val%1000)/100;
ladc[3]=(dis_val%100)/10;
ladc[4]=dis_val%10;
for(i=0;i<6;i++)
{
ss_0;
SPI_Mt(ledrl);
SPI_Mt(led[ladc]);
ss_1;
delay_nus(50);
}
}
void max538(void)
{ssa_0;
SPI_Mt((vdd>>8)&0x0F);
SPI_Mt(vdd);
ssa_1;
}
//***********主程序*******************************
void main(void)
{uint a0=0;
init_devices();
max538();
while(1)
{
operation(vdd);
if(key==1) {key=0;max538();}
}
}
#pragma interrupt_handler int0_isr:iv_INT0
void int0_isr(void)
{
//external interupt on INT0
delay_nus(100);
if(PIND_2==0)
{
if(PIND_0==1){if(vdd<4095)vdd++;}
else {if(vdd>0)vdd--;}
key=1;
}
} |
|