📄 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 + -