?? 波形發(fā)生器.txt
字號:
//***************FileName:Compare.C***************//
//***************ICCAVR V6.30編譯*****************//
#include <iom16v.h>
#define uchar unsigned char
#define uint unsigned int
//數(shù)碼管字型表,對應(yīng)0,1,2,3,4,5,6,7,8,9//
uchar Table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar Data[4]={0,0,0,1}; //定義初始方波頻率:1KHz
uchar Key1_Flag,Key2_Flag,Key3_Flag;
void DelayMs(uint i ) //Ms級延時,參數(shù)i為延時時間
{uint j;
for(;i!=0;i--)
{for(j=1142;j!=0;j--) {;}} //原來8000,改為1142//
}
void Display(uchar *p) //動態(tài)顯示函數(shù),參數(shù)p為待顯示的數(shù)組名
{uint i,sel=0xff7f;
for(i=0;i<4;i++)
{PORTC=sel; //選通最右邊的數(shù)碼管
PORTA=Table[p[i]]; //送字型碼
DelayMs(2); //顯示延時
sel=sel>>1; //移位以顯示前一位
}
}
void Key_Process(uchar *p)
{uchar i,j,k;
while((PINB&0x01)==0) {Display(Data);Key1_Flag=1;} //處理頻率百位,最高5
while((PINB&0x02)==0) {Display(Data);Key2_Flag=1;}
while((PINB&0x04)==0) {Display(Data);Key3_Flag=1;}
if(Key1_Flag==1)
{p[3]++;
if(p[3]==10) p[3]=0;
Key1_Flag=0;}
if(Key2_Flag==1) //處理頻率十位,最高9
{p[2]++;
if(p[2]==10) p[2]=0;
Key2_Flag=0;}
if(Key3_Flag==1) //處理頻率各位,最高9
{p[1]++;
if(p[1]==10) p[1]=0;
Key3_Flag=0;}
}
void Set_Process(void)
{uint i,j;
i=Data[0]*1000+Data[1]*100+Data[2]*10+Data[3];
j=500/i;
OCR1AH=j>>8;
OCR1AL=j&0x00ff;
}
void Init_IO(void) //初始化I/O口
{DDRA=0xff; //設(shè)置A口為推挽1輸出
PORTA=0xff;
DDRC=0xff; //設(shè)置C口為推挽1輸出
PORTC=0xff;
DDRB=0x00; //設(shè)置B口為三態(tài)輸入
PORTB=0x00;
DDRD=0xff; //設(shè)置D口為推挽1輸出
PORTD=0xff;
}
void Init_Timer1(void) //初始化T/C1的輸入捕獲中斷
{TIMSK=TIMSK|0x10; //輸出比較使能
TCCR1B=0x0a; //時鐘1 頻,輸出比較匹配清除定時器值
TCNT1H=0x00; //清除定時器值
TCNT1L=0x00;
Set_Process(); //OCR1A,OCR1B置初值
SREG=SREG|0x80; //全局中斷開
}
void main(void)
{Init_IO(); //初始化I/O口
PORTA=0xff; //點亮以測試所有的數(shù)碼管
PORTC=0x00;
Init_Timer1();
DelayMs(300); //延時
PORTC=0xff; //熄滅所有的數(shù)碼管
while(1)
{Key_Process(Data);
Set_Process();
Display(Data); //動態(tài)掃描顯示
}
}
#pragma interrupt_handler Compare:7
void Compare(void)
{PORTD=~PORTD;}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -