⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yinyue.c

📁 1 利用atmage128向上所带的D/A转换电路实现以小段音乐程序的播放。 2 利用LDM点阵来显示声音的大小。 3 实现循环播放
💻 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 + -