|
楼主 |
发表于 2008-2-11 16:59:22
|
显示全部楼层
玩了一年的51,还没有用过avr编过程序。书倒是看过几本,拿它来练练手。
我喜欢通过实战来学习。不喜欢学习板的学习方式。
通过一下午的调试程序终于可以工作了:
#include <iot26v.h>
#include <macros.h >
const unsigned int fri[8]={0x4b71,0x4b73,0x4b75,0x4b77,0x4b79,0x4b7b,0x4c31,0x447e};//
//这是存入的8个频率最后两个是107.5和115前6个是低端的频率。
const unsigned char led[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//////////////////////////////////
void delay(void)
{
unsigned int m,n;
for(m=0;m<100;m++)
{
for(n=0;n<500;n++);
}
}
////////////////////////////////////写频率程序
void writef(unsigned int f)
{
unsigned char i;
PORTB|=(1<<PB5);//CE为1
PORTB&=~(1<<PB4);//CK 0
for(i=0;i<16;i++)
{
if(f&0x01==0X01)
PORTB|=(1<<PB3);
else
PORTB&=~(1<<PB3);//送出数据da
_NOP();
_NOP();
PORTB|=(1<<PB4);//CLK为1,
_NOP();
_NOP();
PORTB&=~(1<<PB4);//CLK 0
_NOP();
_NOP();
f=(f>>1);
}
PORTB&=~(1<<PB5);//CE - 0;
PORTB&=~(1<<PB4);
PORTB&=~(1<<PB3);
}
////////////////////////////////////
////////////////////////////写eeprom
void eepromwrite(unsigned int address,unsigned char date)
{
while(EECR&(1<<EEWE));//等待变为0
EEAR=address;
EEDR=date;
EECR|=(1<<EEMWE);
EECR|=(1<<EEWE);
}
//////////////////////////////////读eeprom
unsigned char eepromread(unsigned int address)
{
while(EECR&(1<<EEWE));//等待变为0
EEAR=address;
EECR|=(1<<EERE);
return EEDR;
}
void main(void)
{
unsigned char i,k;
DDRA=0XFF;
PORTA=0x01;//A口为输出,控制8个led指示灯
DDRB=0X38;//00111000
PORTB=0XC7;//11000111
for(i=0;i<8;i++)
{
delay();
PORTA=(PORTA<<1);
}/////流水灯测试led
/////////////////////////////
k=eepromread(0x0001);//读出上次实用的频率,实现记忆上次频率作用
if(k>7)k=7;
writef( fri[k]);
PORTA=led[k];//led[k]为指示灯
while(1)
{
if((PINB&0X40)==0)//////////////PINB&0X40要加括号
{
k++;
if(k>7)k=0;
writef( fri[k]);
PORTA=led[k];
eepromwrite(0x0001,k);
delay();
delay();
delay();
}
}
} |
|