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