?? buzzer.c
字號:
/*******************************************************************
實驗三
實驗名稱: 蜂鳴器驅動程序實驗,電子琴程序
實驗目的: 對單片機輸入輸出端口的一個小綜合
實驗現象: 有點聲音
環 境: ICCAVR6.31A
設 計 者: shinea8868
說 明: 部分程序原型源自網絡,經本人修改調試可用,請尊重知識產權,如
作商業用途請保留本段文字
完成日期: 2007年4月9日
*******************************************************************/
#include <iom16v.h>
#include <macros.h>
#include "..\ICC_H\SOFTWARE.h"
uint tab[] = {637,568,505,477,425,378,337};//音符
/*-----------------------------------------------------------------
延時程序計算方法
計數個數j = 延時時間/6*晶振頻率 - 1
函數名稱: void DelayMs(uchar i)
函數功能: 毫秒延時
參 數:
返 回 值: 無
-----------------------------------------------------------------*/
void DelayMs(uchar i)
{
uchar j;
while(i--)
{
j = 167;//1mhz 1ms延時
while(j--);
}
}
/*-----------------------------------------------------------------
函數名稱: void KeyScan(void)
函數功能: 鍵盤掃描程序
參 數:
返 回 值: 無
-----------------------------------------------------------------*/
void KeyScan(void)
{
uchar temp; //存放音符
uchar KeyNum = 0; //用來存放按鍵信息
DDRA = 0xff; //置端口A為輸出
PORTA = 0xff; //全部輸出為高電平
DelayMs(1); //延時一段時間
DDRA = 0x00; //置端口A為輸入
if( PINA != 0xff) //是否有按鍵按下
DelayMs(1); //延時去抖動
DDRA = 0xff; //置端口A為輸出
PORTA = 0xff; //全部輸出為高電平
DelayMs(1); //延時一段時間
DDRA = 0x00; //置端口A為輸入
if( PINA != 0xff) //是否有按鍵按下
{ //確實有按鍵按下
switch (PINA & 0xff)//判斷是哪個按鍵按下
{
case 0b11111110: KeyNum = 1;break;
case 0b11111101: KeyNum = 2;break;
case 0b11111011: KeyNum = 3;break;
case 0b11110111: KeyNum = 4;break;
case 0b11101111: KeyNum = 5;break;
case 0b11011111: KeyNum = 6;break;
case 0b10111111: KeyNum = 7;break;
case 0b01111111: KeyNum = 8;break;
default: break;
}
while(PINA != 0xff)
{
DDRB = 0xff;
PORTB&= ~(1<<(KeyNum-1));//顯示對應的發光二極管
DDRA = 0xff; //置端口A為輸出
PORTA = 0xff; //全部輸出為高電平
// DelayMs(1); //延時一段時間
temp = tab[KeyNum-1];
while(temp--)
NOP();
DDRD = (1<<5);
PORTD ^= (1<<5);
DDRA = 0x00;
}
DDRB = 0xff; //設為輸出
PORTB = 0xff; //滅所有的二極管
}
}
/*-----------------------------------------------------------------
函數名稱: void main(void)
函數功能:
參 數:
返 回 值: 無
-----------------------------------------------------------------*/
void main(void)
{
DDRB = 0xff;
PORTB = 0xff;
while(1)
{
// DelayMs(200);
KeyScan();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -