由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(2)
2150))
{
ksave0 = KEY_UP;
}
else if ((adc 》= 2200) && (adc 《= 2230))
{
ksave0 = KEY_LEFT;
}
else if ((adc 》= 2240) && (adc 《= 2500))
{
ksave0 = KEY_DOWN;
}
return ksave0;
}
使用五向按键效果如下所示:
第十节 蜂鸣器
蜂鸣器是一种常用的报警设备,常用的蜂鸣器有无源和有源两种类型,无源蜂鸣器需要用一定频率的方波驱动,从而发出不同频率的声音。而有源蜂鸣器只需要通电就会发出固定频率的声音,MT254xboard开发板上的蜂鸣器用的是无源蜂鸣器,因此我们需要用一定频率的方波来驱动。
硬件驱动方面,我们这里使用了PNP三极管来驱动蜂鸣器,BUZZ引脚为芯片的P2.0。对照IO复用表可知,此IO可以作为定时器4的匹配通道1输出。所以我们需要把定时器配置为PWM匹配输出模式:
PERCFG |= (0x01《《4); // 选择定时器4匹配功能中的第2种IO口
P2DIR |= 0x01; // p2.0 输出
P2SEL |= 0x01; // p2.0 复用功能
T4CTL &= ~0x10; // Stop timer 3 (if it was running)
T4CTL |= 0x04; // Clear timer 3
T4CTL &= ~0x08; // Disable Timer 3 overflow interrupts
T4CTL |= 0x03; // Timer 3 mode = 3 - Up/Down
T4CCTL0 &= ~0x40; // Disable channel 0 interrupts
T4CCTL0 |= 0x04; // Ch0 mode = compare
T4CCTL0 |= 0x10; // Ch0 output compare mode = toggle on compare
这里仅仅是配置为匹配输出,具体输出什么样的波形还需要我们再通过计算得出。
void Buzzer_Start(uint16 frequency)
{
P2SEL |= 0x01; // p2.0 复用功能
uint8 prescaler = 0;
// Get current Timer tick divisor setting
uint8 tickSpdDiv = (CLKCONSTA & 0x38)》》3;
// Check if frequency too low
if (frequency 《 (244 》》 tickSpdDiv)){ // 244 Hz = 32MHz / 256 (8bit counter) / 4 (up/down counter and toggle on compare) / 128 (max timer prescaler)
Buzzer_Stop(); // A lower tick speed will lower this number accordingly.
}
// Calculate nr of ticks required to achieve target frequency
uint32 ticks = (8000000/frequency) 》》 tickSpdDiv; // 8000000 = 32M / 4;
// Fit this into an 8bit counter using the timer prescaler
while ((ticks & 0xFFFFFF00) != 0)
{
ticks 》》= 1;
prescaler += 32;
}
// Update registers
T4CTL &= ~0xE0;
T4CTL |= prescaler;
T4CC0 = (uint8)ticks;
// Start timer
T4CTL |= 0x10;
}
这个函数是通过传入参数的形式,使P2.0口发出指定频率的方波。
void Buzzer_Stop(void)
{
T4CTL &= ~0x10; // Stop timer 3
P2SEL &= ~0x01;
P2_0 = 1;
}
这个函数是使蜂鸣器停止,主要有三个动作,停止定时器,将P2.0配置为IO功能并且输出高电平,因为我们使用的是PNP三极管。
我们在按键的程序上加上蜂鸣器的控制,当按下按键时,蜂鸣器响。松开后停止响。
int main(void)
{
char LCDBuf[21]={0}; // 显存
int KeyCnt = 0;
SysStartXOSC();
LCD12864_Init();
LCD12864_DisStr(1, " Buzzer Test");
Buzzer_Init();
P0SEL &= ~0X01; // 设置为IO功能
P0DIR &= ~0X01; // 设置为输入功能
P0IEN |= 0X01; // P0.0 设置为中断方式
PICTL |= 0X01; // 下降沿触发
IEN1 |= 0X20; // 允许P0口中断
P0IFG = 0x00; // 清除中断标志位
EA = 1; // 开总中断
sprintf(LCDBuf, " Key Count : %d", KeyCnt++); // 按键计数
LCD12864_DisStr(3, LCDBuf);
while(1)
{
if(KEY_DOWN == NewKeyValue) // 按键按下
{
SoftWaitUs(25000); // 延时防抖
if((P0&0X01) == 0X00) // 再次确认按键是否按下
{
sprintf(LCDBuf, " Key Count : %d", KeyCnt++); // 按键计数
LCD12864_DisStr(3, " Buzzer Start");
Buzzer_Start(2000);
}
else
{
NewKeyValue = KEY_UP; // 按键松开
Buzzer_Stop();
LCD12864_DisStr(3, " Buzzer Stop");
}
}
}
return 0;
}
按下按键后可以看到LCD显示Buzzer Start,听到蜂鸣器响,如果你有示波器,还能测到P2.0口有一个2KHz的方波。
- 主流蓝牙BLE控制芯片详解(3):创杰 IS1685S(07-18)
- 苹果光环加持,蓝牙Beacon技术成室内定位应用最大黑马(08-02)
- 主流蓝牙BLE控制芯片详解(4):Nordic nRF51822(07-20)
- 蓝牙BLE之室内定位iBeacon应用测验(08-02)
- 由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(5)(08-02)
- 由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(1)(07-13)