AVR studio編譯環境。波形發生器仿真,全部資料下載:
lcd.zip
(72.27 KB, 下載次數: 108)
2016-9-25 19:23 上傳
點擊文件名下載附件
單片機程序:
- //#include
- //#include
- #include
- #include
- #include
- #include
- #define F_CPU 8000000UL // 8MHz clock
- #include
- #include
- #include
- #define uchar unsigned char
- #define uint unsigned int
- //#define lcdrs PORTG2
- //#define lcdwr PORTG1
- //#define lcden PORTG0
- uchar const table1[]={" The period is"};
- uchar const table2[]={"The frequency is"};
- unsigned char const sin_tab[]={
- 125,128,131,134,138,141,144,147,150,153,156,159,
- 162,165,168,171,174,177,180,182,185,188,191,193,196,198,201,203,
- 206,208,211,213,215,217,219,221,223,225,227,229,231,232,234,235,
- 237,238,239,241,242,243,244,245,246,246,247,248,248,249,249,250,
- 250,250,250,250,250,250,250,249,249,248,248,247,246,246,245,244,
- 243,242,241,239,238,237,235,234,232,231,229,227,225,223,221,219,
- 217,215,213,211,208,206,203,201,198,196,193,191,188,185,182,180,
- 177,174,171,168,165,162,159,156,153,150,147,144,141,138,134,131,
- 128,125,122,119,116,112,109,106,103,100,97,94,91,88,85,82,79,76,73,
- 70,68,65,62,59,57,54,52,49,47,44,42,39,37,35,33,31,30,29,29,28,27,26,25,25,23,21,
- 19,18,16,15,13,12,11,9,8,7,6,5,4,4,3,2,2,1,1,0,0,0,0,0,0,0,0,1,1,2,
- 2,3,4,4,5,6,7,8,9,11,12,13,15,16,18,19,21,23,25,27,29,31,33,35,37,
- 39,42,44,47,49,52,54,57,59,62,65,68,70,73,76,79,82,85,88,97,94,97,
- 100,103,106,109,112,116,119,122
- };
- float period;
- float frequency;
- uchar change_flag;
- uchar const tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
- uchar i=0;
- uchar wave_flag=0;
- uchar sine_wave;
- uchar pluse;
- uchar triangle=0,flag;
- uchar counter=1;
- uchar show_number;
- void write_lcdcom(uchar date)//寫lcd1602命令
- {
- PORTG&=0xFD;
- PORTG&=0xFB;
- _delay_us(5);
- PORTF=date;
- PORTG|=0x01;
- _delay_us(5);
- PORTG&=0xFE;
- }
- void write_lcddate(uchar lcddate)//寫1602數據
- {
- PORTG&=0xFD;
- PORTG|=0x04;
- _delay_us(5);
- PORTF=lcddate;
- PORTG|=0x01;
- _delay_us(5);
- PORTG&=0xFE;
- }
- void lcd_init()//1602初始化
- {
- write_lcdcom(0x38); //display mode
- //write_lcdcom(0x38); //display mode
- //write_lcdcom(0x38); //display mode
- write_lcdcom(0x06); //顯示光標移動位置
- write_lcdcom(0x0c); //顯示開及光標設置
- write_lcdcom(0x01); //顯示清屏
- }
- void display()//顯示字符子函數
- {
- uchar i;
- PORTG&=0xFD;
- PORTG&=0xFB;
- PORTG&=0xFE;
- _delay_ms(1);
- if(change_flag==0)
- {
- write_lcdcom(0x80);//第一行lcd顯示地址
- for(i=0;i<16;i++)
- {
- write_lcddate(table1[i]);//顯示table1中的字符
- }
- }
- else
- {
- write_lcdcom(0x80);//第二行LCD顯示起始地址
- for(i=0;i<16;i++)
- {
- write_lcddate(table2[i]);//顯示table2中的字符
- }
- }
- PORTG|=0x02;
- PORTG|=0x04;
- PORTG|=0x01;
- }
- void lcd_printf(uint x)//LCD數據顯示函數
- {
- uchar x1,x2,x3,x4;
-
- x1=x/1000;
- x2=x%1000/100;
- x3=x%100/10;
- x4=x%10;
-
- write_lcdcom(0xc6);
- write_lcddate(x1+0x30);//0x30是0的ascii碼
- write_lcddate(x2+0x30);
- write_lcddate(x3+0x30);//0x30是0的ascii碼
- write_lcddate(x4+0x30);
- if(change_flag==0)
- {
- write_lcddate('m');
- write_lcddate('s');
- }
- else
- {
- write_lcddate('H');
- write_lcddate('z');
- }
- }
- void io_init(void)//端口初始化
- {
- DDRA=0xFF; //端口A輸出
- DDRC=0xFF; //端口C輸出
- DDRG=0xFF; //端口G輸出
- DDRD=0XFF;
- DDRB=0XFF;
- DDRF=0XFF;
- PORTB&=0xFE; //PB0低電平
- PORTC=0xFF;
- }
- void key()//波形發生按鍵
- {
- if(PINC==0XFE)// 波形轉換
- {
- wave_flag++;
- if(wave_flag>3)
- wave_flag=0;
- }
- while(PINC==0XFE);
- if(PINC==0XFD)//周期頻率轉換
- {
- show_number=1;
- change_flag++;
- if(change_flag>1)
- change_flag=0;
- }
- while(PINC==0XFD);
-
- if(PINC==0XFB)//加
- {
- counter++;
- if(counter>254)
- counter=255;
- }
- while(PINC==0XFB);
-
- if(PINC==0XF7)//減
- {
- counter--;
- if(counter<1)
- counter=1;
- }
- while(PINC==0XF7);
- }
- void timer0_init(void)//中斷初始化
- {
- TCNT0=0x7F;//5;
- TIMSK|=(1<<toie0); 使能tc0溢出中斷
- TCCR0|=(1<<cs01); 8分頻
- }
- ISR(TIMER0_OVF_vect)
- {
- TCNT0=0X7F;
- // i++;
- i=i+counter;
- if(i>=255)
- i=0;
- if(wave_flag==0)//鋸齒波
- {
- PORTA=i;
- period=4000/(counter*5);
- frequency=10000/(period);
- }
- else if(wave_flag==1)//正弦波
- {
- sine_wave=sin_tab[i];
- PORTA=sine_wave;
- period=4000/(counter*5);
- frequency=10000/(period);
- }
- else if(wave_flag==2)//方波
- {
- if(i<127)
- PORTA=0xFF;
- else
- PORTA=0x00;
- period=4000/(counter*5);
- frequency=10000/(period);
- }
- else if(wave_flag==3)//三角波
- {
-
- if(!flag)
- {
- PORTA=triangle++;
- if(triangle==0)
- {triangle=255;flag=1;}
- }
- else if(flag)
- {
- PORTA=triangle--;
- if(triangle==255)
- {triangle=1;flag=0;}
- period=4000/(counter*5);
- frequency=10000/(period);
- }
- }
- }
- /****************************************************************************
- 函數功能:主程序
- 入口參數:
- 出口參數:
- ****************************************************************************/
- int main (void) __attribute__((naked));
- int main(void)
- {
- asm("cli"); //關總中斷
- io_init(); //端口初始化
- timer0_init(); //中斷初始化
- lcd_init();
- asm("sei"); //開總中斷
- display();
- while(1)
- {
- if(change_flag==0)
- {
- if(show_number==1)
- {
- display();
- show_number=0;
- }
- lcd_printf(period);
- }
- else
- {
- if(show_number==1)
- {
- display();
- show_number=0;
- }
- lcd_printf(frequency);
- }
- key();
-
- }
- }
復制代碼
|