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

📄 dianziqin.c

📁 很好的avr单片机入门程序
💻 C
字号:
/*模拟电子琴,0、1、2、4、5、6、8 分别模拟do re mi fa so la xi*/

#include <iom128v.h>
#include <macros.h>
#include "delay.h"

char count=0x00;
char sound_signal;//定义音符大小 
char sound_pace;//定义节拍大小 
const char music_key[]={0x27,0x23,0x1f,0x00,0x1d,0x1a,0x17,0x00,0x15};
char scan_key()
{
 char i=0;
 char tmp=0x00;
 char intKey=0x00;
 DDRB=0x8f;
 PORTB=0xf8;
  
 for(i=0;i<3;i++)
 {
 PORTB=~(1<<i);
 delay(10);    //等待低电平稳定
 tmp=PINB&0xf0;
 if(tmp!=0xf0)  //有键按下,延时10ms去抖
 {
 delay_ms(10);
 tmp=PINB&0xf0;
 }
 if(tmp!=0xf0) //确有键按下
 {
 tmp&=0xf0;
 switch(tmp)
 {
  case 0xe0: 
  	   intKey=12-4*(3-i);
	   break;
  case 0xd0:   //1 or 5
  	   intKey=13-4*(3-i);
	   break;
  case 0xb0:
  	   intKey=14-4*(3-i);
	   break;
  case 0x70:
  	   intKey=15-4*(3-i);
	   break;
  default:
  	   intKey=0xf0;
	   break;
 }
 return intKey;
 }
 }
 return 0xf0;
}

#pragma interrupt_handler timer1_isr:13
void timer1_isr()       // TC1比较A中断 50ms
{ 
  count=count+1;
  TCNT1=0x00;
 
}
void main()
{

 char key=0x00;
 char intKey=0x00;
 DDRB=0x8f;
 PORTB=0xf8;
 
 OCR1AH=0x00;   
 OCR1AL=0x30;   //  初值,定时50ms

 TIMSK=0x10;
 SEI();
 
 while(1)
 {

 key=scan_key();
 if(key!=0xf0)  //有键按下
 {
  TCCR1B=0x05;  //启动定时器TC1,1024分频
  while(count!=4){

  PORTB^=0x80;
  delay(music_key[key]);}
 }
  TCCR1B=0x00;
   count=0;
 }
 /*
 char tmp;
 DDRB=0x0f;
 PORTB=0xfe;
 DDRA=0xff;
 PORTA=0xff;
 while(1){
 tmp=PINB&0xf0;
 if(tmp==0xd0)
 PORTA=0x00;
 }*/
}

⌨️ 快捷键说明

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