ARM综合编程--LED--ADC--UART--中断--PWM综合示例按键和旋钮控制音乐

第一步:定义全局变量

  • 包括歌曲和音符数组。
  • 定义控制LED灯和按键的GPIO地址(这里你需要提供准确的硬件位置信息)。
  • 定义用于ADC旋钮调节音量的变量。
// 全局变量定义
char song0[] = {
   2, 3, 4, 3, 2, 3, 2, 3, 2, 4, 2, 1, 4, 3, 2};  // 两只老虎
char song1[] = {
   1, 2, 3, 4, 5, 6, 7, 6, 5, 4, 3, 2, 1};         // 生日快乐
char song2[] = {
   4, 4, 5, 5, 6, 6, 7, 7, 6, 6, 5, 5};             // abcdefg
char song3[] = {
   7, 6, 5, 4, 3, 2, 1};                            // 祝你平安

char yf[] = {
   0, 191, 172, 159, 144, 135, 120, 107};  // 音符对应的频率表

char song_index = 0;  // 当前播放的歌曲索引
char play_pos = 0;    // 当前音符位置

// LED 和按键的 GPIO 地址(根据你的实际硬件位置调整)
#define GPIO_LED1 *(volatile long*)0x11400000  // LED 1 的 GPIO 地址
#define GPIO_LED2 *(volatile long*)0x11400004  // LED 2 的 GPIO 地址
#define GPIO_LED3 *(volatile long*)0x11400008  // LED 3 的 GPIO 地址
#define GPIO_LED4 *(volatile long*)0x1140000C  // LED 4 的 GPIO 地址

#define BUTTON_PIN *(volatile long*)0x11000020  // 按键的 GPIO 地址,用于切换歌曲

// ADC 的 GPIO 地址,用于旋钮控制音量
#define ADCCON   *(volatile long*)0x126C0000  // ADC 控制寄存器
#define ADCDAT   *(volatile long*)0x126C000C  // ADC 数据寄存器
#define ADCMUX   *(volatile long*)0x126C001C  // ADC 多路复用器

第二步:UART 串口初始化

  • 初始化 UART 用于调试输出。
  • 实现串口发送字符和字符串的功能。
// 串口初始化及调试输出相关定义
#define GPA1CON  *(volatile long*)0x11400020  // GPIO A1 控制寄存器
#define ULCON2   *(volatile long*)0x13820000  // UART2 控制寄存器
#define UCON2    *(volatile long*)0x13820004  // UART2 控制寄存器
#define UTRSTAT2 *(volatile long*)0x13820010  // UART2 状态寄存器
#define UTXH2    *(volatile long*)0x13820020  // UART2 发送寄存器
#define UBRDIV2  *(volatile long*)0x13820028  // UART2 波特率分频寄存器
#define UFRACVAL2 *(volatile long*)0x1382002C // UART2 波特率小数部分寄存器

// 串口初始化函数
void uart_init(void) {
   
    GPA1CON = GPA1CON & ~0xF;
    GPA1CON = GPA1CON | (1 << 1);    // UART TX
    GPA1CON = GPA1CON & ~(0xF << 4);
    GPA1CON = GPA1CON | (1 << 5);    // UART RX

    ULCON2 = 0x03;                   // 8 位数据,无校验,1 位停止位
    UCON2 = 0x05;                    // 轮询模式
    UBRDIV2 = 53;                    // 设置波特率为 115200
    UFRACVAL2 = 4;
}

// 串口发送单个字符
void putc(char ch) {
   
    while (!(UTRSTAT2 & (1 << 1)));  // 等待发送缓冲区空
    UTXH2 = ch;
}

// 串口发送字符串
void puts(char *s) {
   
    int i = 0;
    while (s[i]) {
   
        putc(s[i])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值