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

📄 main.c

📁 凌阳61单片机实现的多功能电子琴源程序代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "SPCE061A.H"
#include "char_lib.h"
#include "note_lib.h"
//#include "pic.h"
#include "organ.h"
#include "song.h"
#include "s480.h" 



//全局变量
unsigned int mode=0;			//模式
// mode=0		模式选择
// mode=1		录音
// mode=2		编辑
// mode=3		播放
int page=0; 			//页
int colume=0;			//列
int n=0;				//已输入的音符数
//  n从1开始,n<=96,n=96时为满屏
int song[96];
int k=-1;

/********主程序********/
int main (void)
{
	*P_SystemClock=0x0013;
	*P_IOB_Dir=0xffff;
	*P_IOB_Attrib=0xffff;
	*P_IOB_Data=0x00ff;
	*P_IOA_Dir=0xff00;
	*P_IOA_Attrib=0xff00;
	*P_IOA_Data=0x00ff;
	lcd_initial();
	Key_Init();
	Initial_INT();
//	display_pic(welcome);
//*P_SystemClock=0x0012;
	delay_nms(500);
	Clear_S();
	display_mode_0();
	speak(KEY_3);
	while(1)
	{
		unsigned int key_code=0;
		unsigned int key_delay=0;
		int key_num=0;
		unsigned char *key_note=null;
		switch(mode)
		{
		//*******************************************************************//	
			case 0:
			while(1)
			{
				*P_Watchdog_Clear=0x0001;
				do{key_code=Key_Get();*P_Watchdog_Clear=0x0001;}
				while(!key_code);
				switch(key_code)
				{			
					case KEY_7: mode=1;Clear_S();display_mode_1();speak(KEY_7);break;
					case KEY_B: mode=2;Clear_S();display_mode_2();speak(KEY_B);break;
					case KEY_F: mode=3;Clear_S();display_mode_3();speak(KEY_F);break;
					default:break;
				}
				if(key_code==KEY_7||key_code==KEY_B||key_code==KEY_F)
				{
					key_code=0;break;
				}
				else key_code=0;
			}
			break;
		//*********************************************************************************//
			case 1:
			while(1)
			{
				*P_Watchdog_Clear=0x0001;
				do{key_code=Key_Get();*P_Watchdog_Clear=0x0001;}
				while(!key_code);
				switch(key_code)
				{
					case KEY_3: mode=0;Clear_S();display_mode_0();break;
					case KEY_7:break;
					case KEY_B:break;
					case KEY_F:break;
					default:
					key_delay=code_to_delay(key_code);
					key_note=code_to_note(key_code);
					display_add(key_note);
					sound(key_delay);
					break;
				}
				if(key_code==KEY_3)
				{
					key_code=0;break;
				}
				else key_code=0;
			}
			break;
		//********************************************************************//
			case 2:
			while(1)
			{
				*P_Watchdog_Clear=0x0001;
				do{key_code=Key_Get();*P_Watchdog_Clear=0x0001;}
				while(!key_code);
				switch(key_code)
				{
					case KEY_3: mode=0;Clear_S();display_mode_0();break;
					case KEY_7:display_del();del_note();break;
					case KEY_B: store_end();mode=3;Clear_S();display_mode_3();break;
	//				case KEY_F:break;
					default:
					key_delay=code_to_delay(key_code);
					key_note=code_to_note(key_code);
					key_num=code_to_num(key_code);
					store_note(key_num);
					display_add(key_note);
					sound(key_delay);
					break;
				}
				if(key_code==KEY_3||key_code==KEY_B)
				{
					key_code=0;break;
				}
				else
				key_code=0;
			}
			break;
			//********************************************************************//
			case 3:
			while(1)
			{
				*P_Watchdog_Clear=0x0001;
				do{key_code=Key_Get();*P_Watchdog_Clear=0x0001;}
				while(!key_code);
				switch(key_code)
				{
					case KEY_0:sing(song0);break;
					case KEY_1:sing(song1);break;
					case KEY_2:sing(song2);break;
					case KEY_4:sing(song3);break;
					case KEY_5:sing(song4);break;
					case KEY_3: mode=0;Clear_S();display_mode_0();break;
					case KEY_7:break;
					case KEY_B:break;
					case KEY_F:break;
					case KEY_E:sing(song);break;
					default:
					break;
				}
				if(key_code==KEY_3)
				{
					key_code=0;break;
				}
				else key_code=0;
			}
			break;
		//******************************************//
		}
		*P_Watchdog_Clear=0x0001;
	}
	return 0;
}
/*************************************************************
型号:      OCM12864-8
编写:      hyc
控制IC:    ST7565p
E-mail:    hyc_sea@mail.sdu.edu.cn
***************************************************************/

///////////////////////////////////////////////
//		9 	A---------------VDD
//		8 	K----------------GND
//		7  	VSS--------------GND
//		6 	VDD--------------VDD

//		5	CDA--------------IOB4
//      4	SCK--------------IOB3
//		3 	A0 --------------IOB2
//		2	/RES-------------IOB1
//		1 	/CS--------------IOB0
/////////////////////////////////////////////////


/***************************************************/
/*125us的延时*/
void delay_nus(int n)//125us
{
	while(n--);
	*P_Watchdog_Clear=0x0001;
}

/*毫秒级延时*/
void delay_nms(int n)//
{
  int i;
  for(i=0;i<n;i++)
    delay_nus(78);
  
}

/*写命令到寄存器*/
void send_cmd(unsigned char cmd)
{
  unsigned char i;
  unsigned char tmp;
  LCD_A0_L;            //指令通道  
  LCD_SCK_H;			//时钟高,变数据
  LCD_CS_L;               //片使能
  delay_nus(5);
  for(i=0;i<8;i++)
  {
    tmp=cmd&0x0080;
    if(tmp)
    	LCD_CDA_H;
    else
    	LCD_CDA_L;
    LCD_SCK_L;		//时钟低,送数据
    __asm("NOP");
    __asm("NOP");
    LCD_SCK_H;		//上升沿,读数据
    __asm("NOP");
    __asm("NOP");
    cmd<<=1;
  }
  LCD_CS_H;              //片禁能
  delay_nus(5); 
}

/*写数据到DDRAM*/
void send_dat(unsigned char dat)
{
  unsigned char i;
  unsigned char tmp;
  LCD_A0_H;       	 	//数据通道      
  LCD_SCK_H;			//时钟高,变数据
  LCD_CS_L;              //片使能
  delay_nus(5); 
  for(i=0;i<8;i++)
  {
  	tmp=dat&0x0080;
    if(tmp) 	LCD_CDA_H;
    else    	LCD_CDA_L;
    LCD_SCK_L;		//时钟低,送数据
    __asm("NOP");
    __asm("NOP");
    __asm("NOP");
    __asm("NOP");
    LCD_SCK_H;		//时钟高,变数据
     __asm("NOP");
    __asm("NOP");
    __asm("NOP");
    __asm("NOP");
    dat<<=1;
  }
  LCD_CS_H;              //片禁能
  delay_nus(5);
}
/*写页地址*/
void set_page_address(unsigned char dat)
{
    send_cmd(0xb0|dat);
}

/*写列地址*/
void set_colume_address(unsigned char dat)
{
    unsigned char tmp;
	tmp=dat>>4;
	tmp&=0x00ff;
    send_cmd(0x10|tmp);  //送列地址高三位
	tmp=0x0f&dat; 
    send_cmd(tmp);       //送列地址低四位
}
/*清屏*/
void Clear_S()
{
  unsigned char i,j;
  for(i=0;i<8;i++)
  {
    set_page_address(i);
    set_colume_address(0x00);
    for(j=0;j<0x84;j++)
    {
      send_dat(0x00);
    }
  }
}


/*显示汉字*/
void display_cha(unsigned char *cha,int page,int colume)
{
	int j;
	set_page_address(page);
    set_colume_address(colume);
    for(j=0;j<16;j++)
    {
    	send_dat(*(cha+j));
   	}
   	set_page_address(page+1);
    set_colume_address(colume);
     for(j=0;j<16;j++)
    {
    	send_dat(*(cha+16+j));
   	}
 }
 /*显示音符*/
void display_note(unsigned char *note,int page,int colume)
{
	int j;
	set_page_address(page);
    set_colume_address(colume);
    for(j=0;j<8;j++)
    {
    	send_dat(*(note+j));
   	}
 }
/*显示一副图像*/ 
void display_pic(unsigned char *pic)
{
	int i,j;
	set_page_address(1);
	set_colume_address(0);
	for(i=1;i<7;i++)
	{
		for(j=0;j<128;j++)
		{
			send_dat(*(pic+128*(i-1)+j));
		}
		set_page_address(i+1);
		set_colume_address(0);
	}
}
 
 
/*显示模式选择界面*/
void display_mode_0(void)
{
	send_cmd(0xa6);
    display_cha(qing,0,0);
    display_cha(xuan,0,16);
    display_cha(ze,0,32);
    display_cha(gong,0,48);
    display_cha(zuo,0,64);
    display_cha(mo,0,80);
    display_cha(shi,0,96);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -