亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
一個STC單片機驅動MAX7219的音樂節拍器程序
[打印本頁]
作者:
dingxizhang
時間:
2026-5-3 08:10
標題:
一個STC單片機驅動MAX7219的音樂節拍器程序
main.c
#include <reg52.h>
#include <intrins.h>
#include "keyscan.h"
// 定時器0初始化
void Timer0_Init()
{
TMOD |= 0x01; // 定時器0,工作模式1
TH0 = 0xFC; // 1ms定時
TL0 = 0x18;
ET0 = 1; // 允許定時器0中斷
TR0 = 1; // 啟動定時器0
EA = 1; // 開啟總中斷
}
// 主函數
void main()
{
// 初始化
P0 = 0xFF;
P1 = 0xFF;
P2 = 0x00; // LED初始全滅
P3 = 0xFF;
MAX7219_Init();
Clear_Display();
Display_Speed();
Display_BeatType();
Timer0_Init();
while(1)
{
Key_Scan();
}
}
// 定時器0中斷服務程序
void Timer0_ISR() interrupt 1
{
TH0 = 0xFC; // 重新裝載初值
TL0 = 0x18;
timer_count++;
if(is_playing)
{
if(timer_count >= interval)
{
timer_count = 0;
// 產生節拍
Update_LEDs();
Output_Sound();
// 更新拍數
beat_count++;
if(beat_count >= beats_per_bar[beat_type])
{
beat_count = 0;
}
}
}
}
keyscan.c
#include "keyscan.h"
unsigned int interval = 0;
unsigned char is_playing = 0;
unsigned char beat_count = 0;
unsigned int timer_count = 0;
// 按鍵掃描
void Key_Scan()
{
static unsigned char key_up_flag = 1;
static unsigned char key_down_flag = 1;
static unsigned char key_type_flag = 1;
static unsigned char key_start_flag = 1;
// 速度+按鍵
if(KEY_UP == 0)
{
if(key_up_flag)
{
key_up_flag = 0;
if(beat_speed < 240)
{
beat_speed += 1;
Display_Speed();
if(is_playing)
{
// 重新計算間隔
interval = 60000 / beat_speed; // ms
}
}
}
}
else
{
key_up_flag = 1;
}
// 速度-按鍵
if(KEY_DOWN == 0)
{
if(key_down_flag)
{
key_down_flag = 0;
if(beat_speed > 40)
{
beat_speed -= 1;
Display_Speed();
if(is_playing)
{
interval = 60000 / beat_speed; // ms
}
}
}
}
else
{
key_down_flag = 1;
}
// 拍型選擇按鍵
if(KEY_TYPE == 0)
{
if(key_type_flag)
{
key_type_flag = 0;
beat_type = (beat_type + 1) % 4;
beat_count = 0;
Display_BeatType();
Update_LEDs();
}
}
else
{
key_type_flag = 1;
}
// 開始/停止按鍵
if(KEY_START == 0)
{
if(key_start_flag)
{
key_start_flag = 0;
is_playing = !is_playing;
if(is_playing)
{
beat_count = 0;
interval = 60000 / beat_speed; // 計算每個節拍的時間間隔(ms)
timer_count = 0;
// 顯示運行狀態
MAX7219_WriteCmd(5, 0x80); // 在第五位顯示點
}
else
{
MAX7219_WriteCmd(5, 0x00); // 顯示停止狀態
LED1 = LED2 = LED3 = LED4 = LED5 = LED6 = 0; // 關閉所有LED
}
}
}
else
{
key_start_flag = 1;
}
}
void delay_ms(unsigned int ms)
{
unsigned int i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 114; j++);
}
// 更新指示燈
void Update_LEDs()
{
LED1 = LED2 = LED3 = LED4 = LED5 = LED6 = 0; // 先關閉所有LED
switch(beat_type)
{
case 0: // 2/4拍
if(beat_count == 0) LED1 = 1; // 強拍
if(beat_count == 1) LED2 = 1; // 弱拍
break;
case 1: // 3/4拍
if(beat_count == 0) LED1 = 1; // 強拍
if(beat_count == 1) LED2 = 1; // 弱拍
if(beat_count == 2) LED3 = 1; // 弱拍
break;
case 2: // 4/4拍
if(beat_count == 0) LED1 = 1; // 強拍
if(beat_count == 1) LED2 = 1; // 弱拍
if(beat_count == 2) LED3 = 1; // 次強拍
if(beat_count == 3) LED4 = 1; // 弱拍
break;
case 3: // 6/8拍
if(beat_count == 0) LED1 = 1; // 強拍
if(beat_count == 1) LED2 = 1; // 弱拍
if(beat_count == 2) LED3 = 1; // 弱拍
if(beat_count == 3) LED4 = 1; // 次強拍
if(beat_count == 4) LED5 = 1; // 弱拍
if(beat_count == 5) LED6 = 1; // 弱拍
break;
}
}
// 輸出音源信號
void Output_Sound()
{
// 根據拍型輸出不同的音源
switch(beat_type)
{
case 0: // 2/4拍
if(beat_count == 0)
{
SOUND1 = 1; // 強拍
delay_ms(20);
SOUND1 = 0;
}
else
{
SOUND2 = 1; // 弱拍
delay_ms(10);
SOUND2 = 0;
}
break;
case 1: // 3/4拍
if(beat_count == 0)
{
SOUND1 = 1; // 強拍
delay_ms(20);
SOUND1 = 0;
}
else
{
SOUND3 = 1; // 弱拍
delay_ms(10);
SOUND3 = 0;
}
break;
case 2: // 4/4拍
if(beat_count == 0)
{
SOUND1 = 1; // 強拍
delay_ms(20);
SOUND1 = 0;
} else if(beat_count == 2)
{
SOUND2 = 1; // 次強拍
delay_ms(15);
SOUND2 = 0;
}
else
{
SOUND3 = 1; // 弱拍
delay_ms(10);
SOUND3 = 0;
}
break;
case 3: // 6/8拍
if(beat_count == 0)
{
SOUND1 = 1; // 強拍
delay_ms(20);
SOUND1 = 0;
}
else if(beat_count == 3)
{
SOUND2 = 1; // 次強拍
delay_ms(15);
SOUND2 = 0;
}
else
{
SOUND4 = 1; // 弱拍
delay_ms(10);
SOUND4 = 0;
}
break;
}
}
diplay.c
#include "display.h"
unsigned int beat_speed = 120; // 節拍速度(BPM),默認120
unsigned char beat_type = 0; // 拍型索引 0:2/4, 1:3/4, 2:4/4, 3:6/8
// 數字字體(0-9)
unsigned char code font_table[] =
{
0x7E, 0x30, 0x6D, 0x79, 0x33,
0x5B, 0x5F, 0x70, 0x7F, 0x7B
};
// 拍型對應的每小節拍數
unsigned char code beats_per_bar[] = {2, 3, 4, 6};
// MAX7219初始化命令
unsigned char code init_cmds[][2] =
{
{0x0C, 0x01}, // 關閉關機模式
{0x0B, 0x07}, // 掃描所有8位
{0x0A, 0x08}, // 亮度
{0x09, 0x00}, // 解碼模式:無
{0x0F, 0x00} // 顯示測試:關閉
};
// MAX7219寫一個字節
void MAX7219_WriteByte(unsigned char data_byte)
{
unsigned char i;
for(i = 0; i < 8; i++)
{
MAX7219_CLK = 0;
MAX7219_DIN = (data_byte & 0x80) ? 1 : 0;
data_byte <<= 1;
MAX7219_CLK = 1;
}
}
// MAX7219寫命令
void MAX7219_WriteCmd(unsigned char address, unsigned char data_byte)
{
MAX7219_CS = 0;
MAX7219_WriteByte(address);
MAX7219_WriteByte(data_byte);
MAX7219_CS = 1;
}
// MAX7219初始化
void MAX7219_Init()
{
unsigned char i;
for(i = 0; i < 5; i++)
{
MAX7219_WriteCmd(init_cmds[i][0], init_cmds[i][1]);
}
}
// 在數碼管上顯示數字
void Display_Number(unsigned char digit, unsigned char number)
{
if(digit >= 1 && digit <= 8)
{
MAX7219_WriteCmd(digit, number);
}
}
// 顯示當前速度
void Display_Speed()
{
unsigned char bai, shi, ge;
bai = beat_speed / 100;
shi = (beat_speed % 100) / 10;
ge = beat_speed % 10;
// 顯示在4-6位數碼管上
Display_Number(3, font_table[bai]);
Display_Number(2, font_table[shi]);
Display_Number(1, font_table[ge]);
}
// 顯示拍型
void Display_BeatType()
{
switch(beat_type)
{
case 0: Display_Number(8, 0x6D); //2
Display_Number(7, 0x01);
Display_Number(6, 0x33); break; // 4
case 1: Display_Number(8, 0x79); // 3
Display_Number(7, 0x01);
Display_Number(6, 0x33); break; // 4
case 2: Display_Number(8, 0x33); // 4
Display_Number(7, 0x01);
Display_Number(6, 0x33); break; // 4
case 3: Display_Number(8, 0x5F); // 6
Display_Number(7, 0x01);
Display_Number(6, 0x7F); break; // 8
}
}
// 清除所有顯示
void Clear_Display()
{
unsigned char i;
for(i = 1; i <= 8; i++)
{
MAX7219_WriteCmd(i, 0x00);
}
}
復制代碼
作者:
dingxizhang
時間:
2026-5-3 08:14
我的壓縮文件怎么發呀?
作者:
dj3365191
時間:
2026-5-3 17:23
壓縮文件在哪里?
作者:
joyb
時間:
2026-5-4 08:10
MAX7219 是美國MAXIM 公司推出的多位LED 顯示驅動器,采用3 線串行接口傳送數據,可直接與單片機接口連接,用戶能方便修改其內部參數,以實現多位LED 顯示。它內含硬件動態掃描電路、BCD譯碼器、段驅動器和位驅動器。
作者:
wbwcf13e
時間:
2026-5-5 08:01
壓縮文件在哪里?
作者:
heicad
時間:
2026-5-8 16:37
dingxizhang 發表于 2026-5-3 08:14
我的壓縮文件怎么發呀?
這里有方法:
http://www.denmoz.com/bbs/dpj-134340-1.html
作者:
dingxizhang
時間:
2026-5-18 12:59
stc51單片機節拍器.rar
(100.45 KB, 下載次數: 0)
2026-5-18 12:58 上傳
點擊文件名下載附件
這里包含了全部文件
下載積分: 黑幣 -5
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1