?? yinyue.c
字號:
#include <avr/io.h>
#include<avr/pgmspace.h>
#include"bolibei.h"
#include"guangyin.h"
#include<avr/interrupt.h>
#include<avr/signal.h>
#define PRG_RDB(addr) pgm_read_byte(addr)
#define PPI_1_PB (unsigned char *)0x6001;
#define PPI_1_CT (unsigned char *)0x6003;
#define PPI_0_PA (unsigned char *)0x5000;
#define PPI_0_PB (unsigned char *)0x5001;
#define PPI_0_PC (unsigned char *)0x5002;
#define PPI_0_CT (unsigned char *)0x5003;
#define SYSTEM_CLOCK 14745600L
#define PRESCALED_CLOCK_8 (unsigned long) (SYSTEM_CLOCK/8)
#define SAMPLING_RATE 11025
#define TLCD_CTRL (unsigned char *)0x7000;
#define TLCD_DATA (unsigned char *)0x7001;
unsigned char *lcd_data,*lcd_control;
void initialize_ppi(void);
void play(void);
void display(unsigned char *green1);
void search(void);
void delay(int d1,int d2);
void initialize_text_lcd(void);
void lcd_control_wait(void);
void lcd_data_wait(void);
void initialize_timer(void);
void lcdprint(void);
void lcdprint2(void);
void initialize_timer2();
volatile unsigned char font_gre0[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18};
volatile unsigned char font_gre1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18};
volatile unsigned char font_gre2[]={0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x3c};
volatile unsigned char font_gre3[]={0x00,0x00,0x00,0x00,0x18,0x18,0x3c,0x3c};
volatile unsigned char font_gre4[]={0x00,0x00,0x00,0x18,0x18,0x3c,0x3c,0x7e};
volatile unsigned char font_gre5[]={0x00,0x00,0x18,0x18,0x3c,0x3c,0x7e,0x7e};
volatile unsigned char font_gre6[]={0x00,0x18,0x18,0x3c,0x3c,0x7e,0x7e,0xff};
volatile unsigned char font_gre7[]={0x18,0x18,0x3c,0x3c,0x7e,0x7e,0xff,0xff};
volatile unsigned char qumuyi[]={'B','O',' ',' ','L','I',' ','B','E','I','-','-','S','M','L','&','V','I','C'};
volatile unsigned char qumuer[]={'G','U','A','N','G',' ',' ','Y','I','N', ' ',' ','D','E' ,' ',' ','G','U',' ',' ','S','H','I'};
volatile unsigned char *font_gre9,font_yel9;
volatile unsigned char *line,*ppi_ctrl,n,*gre;
volatile unsigned int cnt=0,m=0,x=1,y=1,z=1;
volatile unsigned char *ppi_pb,*ppi_ctr1;
//***********************************************************************************
//中斷服務程序
SIGNAL(SIG_OUTPUT_COMPARE1A)//中斷用過來播放音樂
{ if(y%2!=0){
ppi_pb=PPI_1_PB; //播放曲目一
cnt++;
*ppi_pb=PRG_RDB(&snd_data[cnt]);
if(cnt>=15000)
cnt=0;
if(cnt%200==0){ //判斷采樣時間是否到
n=PRG_RDB(&snd_data[cnt]);
search();}}
else{ //播放曲目二
ppi_pb=PPI_1_PB;
cnt++;
*ppi_pb=PRG_RDB(&snd_data1[cnt]);
if(cnt>=25624)
cnt=0;
if(cnt%200==0){
n=PRG_RDB(&snd_data1[cnt]);
search();}}}
SIGNAL(SIG_OVERFLOW3) // 中斷用來播下一曲
{
y++;
TCNT3H=0Xff;
TCNT3L=0Xff;
cnt=0;
}
SIGNAL(SIG_INTERRUPT0)//中斷用來暫停
{x++; //改變標志位 用來暫停和恢復
if(x%2==0)
{
TIMSK=0x00;}
else TIMSK=0x10;
}
//**********************************************************
int main(void) //主程序
{
MCUCR |=(1<<SRE);
loop: z=y;
if(y%2!=0) lcdprint();
else lcdprint2();
initialize_ppi();//初始化控制ldm的8255
initialize_timer();
initialize_timer2();
ppi_ctr1=PPI_1_CT;
*ppi_ctr1=0x80;
font_gre9=font_gre7;
do{
display(font_gre9);
if (cnt%20==0) //lcd顯示左移
{
*lcd_control=0x18;
}
if(z!=y) goto loop;}
while(1);}
//***********************************************************************************
//lcd 顯示
void initialize_text_lcd(void) //lcd顯示初始化
{
lcd_control=TLCD_CTRL;
lcd_data=TLCD_DATA;
lcd_control_wait();
*lcd_control |=0x38;
lcd_control_wait();
*lcd_control |=0x02;
lcd_control_wait();
*lcd_control |=0x01;
lcd_control_wait();
*lcd_control |=0x06;
lcd_control_wait();
*lcd_control |=0x0e;
lcd_control_wait();
}
void lcd_control_wait(void) //lcd控制命令延時
{
delay(1000,100);
}
void lcd_data_wait(void)// lcd數據延時
{
delay(1000,10);
}
void lcdprint()
{ //顯示曲目一的內容
int i;
initialize_text_lcd();
for(i=0;i<=19;i++){
*lcd_data=qumuyi[i];
lcd_data_wait();}}
void lcdprint2()//顯示曲目二的內容
{int i;
initialize_text_lcd();
for(i=0;i<=23;i++){
*lcd_data=qumuer[i];
lcd_data_wait();}}
//********************************************************************
//LDM顯示
void search(void) //通過采樣值查找LDM的顯示代碼
{
MCUCR |=(1<<SRE);
if(n<=0x75) font_gre9=font_gre0;
if((n>0x75)&&(n<=0x80)) font_gre9=font_gre1;
if((n>0x80)&&(n<=0x83)) font_gre9=font_gre2;
if((n>0x83)&&(n<=0x87)) font_gre9=font_gre3;
if((n>0x87)&&(n<=0x8b)) font_gre9=font_gre4;
if((n>0x8b)&&(n<=0x90)) font_gre9=font_gre5;
if((n>0x90)&&(n<=0x96)) font_gre9=font_gre6;
if(n>0x96) font_gre9=font_gre7;}
void display(unsigned char *green1)
{if(x%2==0)
while(1){ //暫停
if(x%2!=0) break;};//break用來跳出暫停
unsigned char i=0,j=0;
for(j=0;j<30;j++){
for(i=0;i<8;i++){
*gre=green1[i];
*line=(0x01<<i);
delay(10,70);
}
}
}
// *****************************************************
void delay(int d1,int d2)//延時
{
int i,j;
for(i=0;i<d1;i++){
for(j=0;j<d2;j++);
}
}
//************************************************************
//初始化
void initialize_timer(void) //初始化計數器一
{ EIMSK=0X01;
EICRA=0X02;
TCCR1A=0x00;
TCCR1C=0X00;
TCCR1B=0x0a;
TIMSK=0x10;
OCR1A=(unsigned int)(PRESCALED_CLOCK_8/SAMPLING_RATE-1+0.5);
sei();
}
void initialize_timer2() //初始化計數器三
{
TCNT3H=0Xff;
TCNT3L=0Xff;
TCCR3B=0X06;
ETIMSK=0X04;
sei();}
void initialize_ppi(void) // 初始化控制ldm的8255
{
line=PPI_0_PA;
gre=PPI_0_PB;
ppi_ctrl=PPI_0_CT;
*ppi_ctrl=0x80;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -