#include <avr/io.h>
#include <util/delay.h>
#define bis(addr,bit) (1&(addr>>bit))
#define bic(addr,bit) (!(1&(addr>>bit)))
#define cbi(addr,bit) addr &= ~(1<<bit)
#define sbi(addr,bit) addr |= (1<<bit)
//7セグ(mode1→10→sel1→sel10)
//PC2=ラッチ
//PC1=クロック
//PC0=データ
//リレー制御用データ
//PD4=ラッチ
//PD3=クロック
//PD2=データ
//MUTE_PTN
//PD7=ラッチ
//PD6=クロック
//PD5=データ
//秋月のシリアル通信タイプの7セグにHC595が使われてるので、回路も
//それに合わせて作成
//8連バーLED
//16TS(トップサラウンド)
//15TMR(トップミドルライト)
//14TML(トップミドルレフト)
//13RHR(リアハイトライト)
//12RHL(リアハイトレフト)
//11SBR(サラウンドバックライト)
//10SBL(サラウンドバックレフト)
//09SR(サラウンドライト)
//08SL(サラウンドレフト)
//07FWR(フロントワイドライト)
//06FWL(フロントワイドレフト)
//05FHR(フロントハイトライト)
//04FHC(フロントハイトセンター)
//03FHL(フロントハイトレフト)
//02FR(フロントライト)
//01FC(フロントセンター)
//00FL(フロントレフト)
//20SWFR(サブウーファーフロントライト)
//19SWFL(サブウーファーフロントレフト)
//18SWRR(サブウーファーリアライト)
//17SWRL(サブウーファーリアレフト)
uint8_t mode;
uint8_t select[14] = {0};
uint8_t mute_state;
uint8_t num_dat[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
uint32_t mute_dat0[65] = {0x80000000,0x40000000,0x20000000,0x10000000,
0x08000000,0x04000000,0x02000000,0x01000000,
0x00800000,0x00400000,0x00200000,0x00100000,
0x00080000,0x00040000,0x00020000,0x00010000,
0x00008000,0x00004000,0x00002000,0x00001000,
0x00000800,0x7FFFFFFF,0xBFFFFFFF,0xDFFFFFFF,
0xEFFFFFFF,0xF7FFFFFF,0xFBFFFFFF,0xFDFFFFFF,
0xFEFFFFFF,0xFF7FFFFF,0xFFBFFFFF,0xFFDFFFFF,
0xFFEFFFFF,0xFFF7FFFF,0xFFFBFFFF,0xFFFDFFFF,
0xFFFEFFFF,0xFFFF7FFF,0xFFFFBFFF,0xFFFFDFFF,
0xFFFFEFFF,0xFFFFF7FF,0xE0000000,0x1C000000,
0x03000000,0x00C00000,0x00300000,0x000C0000,
0x00038000,0x00006000,0x00001800,0x00005000,
0x00002800,0x00007800,0xFFFF87FF,0xFFFFE7FF,
0xFFFF9FFF,0xFFFFD7FF,0xFFFFAFFF,0xFFFFFFFF,
};//+下位16ビット0で、4回繰り返し
uint32_t mute_dat1[21]= {
// FRONTB_LCR FRONTH_LCR FRONTH_LCR FRONTW_LR
0xE0000000,0x1C000000,0x03800000,0x00600000,
// SURR_B_LCR SURR_R_LCR SURR_H_LCR SURR_LR
0x001C0000,0x00038000,0x00007000,0x00000C00,
// TM_LCR TS
0x00000380,0x00000040,
// FRONTB_LCR FRONTH_LCR FRONTH_LCR FRONTW_LR
0x1FFFFFFF,0xE3FFFF3F,0xFC7FFF3F,0xFF9FFF3F,
// SURR_B_LCR SURR_R_LCR SURR_H_LCR SURR_LR
0xFFE3FF3F,0xFFFC7F3F,0xFFFF8F3F,0xFFFFF33F,
// TM_LCR TS
0xFFFFFC7F,0xFFFFFFBF,0xFFFFFFFF,};
uint8_t h_l_seg[2] = {0b01110110,0b00111000,};//ミュートONでL表示、ミュートOFFでH表示
void disp(uint8_t cmd) { //bit0:7seg bit1:mute_ptn bit2:relay
if (cmd & 1) { //7セグ更新
for (uint8_t i = 0; i < 8; i++) { //ミュートONでL表示、ミュートOFFでH表示
if (bis(h_l_seg[ mute_state ], 7 - i))sbi(PORTC, 0);
else cbi(PORTC, 0);
sbi(PORTC, 1);
cbi(PORTC, 1);
}
for (uint8_t i = 0; i < 8; i++) { //select10の桁
if (select[mode] < 10) cbi(PORTC, 0);
else if (bis(num_dat[select[mode] / 10], 7 - i))sbi(PORTC, 0);
else cbi(PORTC, 0);
sbi(PORTC, 1);
cbi(PORTC, 1);
}
for (uint8_t i = 0; i < 8; i++) { //select1の桁
if (bis(num_dat[select[mode] % 10], 7 - i))sbi(PORTC, 0);
else cbi(PORTC, 0);
sbi(PORTC, 1);
cbi(PORTC, 1);
}
for (uint8_t i = 0; i < 8; i++) { //mode10の桁
if (mode < 10) cbi(PORTC, 0);
else if (bis(num_dat[mode / 10], 7 - i))sbi(PORTC, 0);
else cbi(PORTC, 0);
sbi(PORTC, 1);
cbi(PORTC, 1);
}
for (uint8_t i = 0; i < 8; i++) { //mode1の桁
if (bis(num_dat[mode % 10], 7 - i))sbi(PORTC, 0);
else cbi(PORTC, 0);
sbi(PORTC, 1);
cbi(PORTC, 1);
}
sbi(PORTC, 2);
cbi(PORTC, 2);
}
//PD4=ラッチ
//PD3=クロック
//PD2=リレーオフインジケーター用データ
if (cmd & 2) { //mute_ptn表示
if (mode == 0) {//32モード切替
for (uint8_t c = 0; c < 4; c++) {
for (uint8_t i = 0; i < 32; i++) {
if (bis(mute_dat0[select[mode]], 31 - i))sbi(PORTD, 2);
else cbi(PORTD, 2);
sbi(PORTD, 3);
cbi(PORTD, 3);
}
}
} else if(mode==1) {
for (uint8_t c = 0; c < 4; c++) {
for (uint8_t i = 0; i < 32; i++) {
if (bis(mute_dat1[select[mode]], 31 - i))sbi(PORTD, 2);
else cbi(PORTD, 2);
sbi(PORTD, 3);
cbi(PORTD, 3);
}
}
} else if (mode == 2) {
for (uint8_t c = 0; c < 4; c++) {
if(c==select[mode])sbi(PORTD, 2);
else cbi(PORTD, 2);
for (uint8_t i = 0; i < 32; i++) {
sbi(PORTD, 3);
cbi(PORTD, 3);
}
}
} else if (mode == 13) {
//略
}
sbi(PORTD, 4);
cbi(PORTD, 4);
}
//PD7=ラッチ
//PD6=クロック
//PD5=リレー制御用データ
if (cmd & 4) { //リレー制御
if (mute_state == 0) {
sbi(PORTD, 5);
for (uint8_t i = 0; i < 128; i++) {
sbi(PORTD, 6);
cbi(PORTD, 6);
}
} else if (mode == 0) {
for (uint8_t c = 0; c < 4; c++) {
for (uint8_t i = 0; i < 32; i++) {
if (bis(mute_dat0[select[mode]], 31 - i))cbi(PORTD, 5);
else sbi(PORTD, 5);
sbi(PORTD, 6);
cbi(PORTD, 6);
}
}
} else if (mode == 1) {
for (uint8_t c = 0; c < 4; c++) {
for (uint8_t i = 0; i < 32; i++) {
if (bis(mute_dat1[select[mode]], 31 - i))cbi(PORTD, 5);
else sbi(PORTD, 5);
sbi(PORTD, 6);
cbi(PORTD, 6);
}
}
} else if (mode == 2) {
for (uint8_t c = 0; c < 4; c++) {
if(c==select[mode])cbi(PORTD, 5);
else sbi(PORTD, 5);
for (uint8_t i = 0; i < 32; i++) {
sbi(PORTD, 6);
cbi(PORTD, 6);
}
}
} else if (mode == 13) {
//略
}
sbi(PORTD, 7);
cbi(PORTD, 7);
}
}
int main(void) {
PORTB = 0b11111;//SW
DDRC = 0b111;//7セグ
DDRD = 0b11111100;//RELAY,MUTE_PTN
//DDRD = 0xff;
uint8_t relay;
uint16_t sw = 0xFFFF;
disp(7);
//unsigned char h_l_seg;
while (1) {
sw = sw << 8 | (PINB & 0xFF); //前回のPINBと今回のPINBの状態
if (bis(sw, 8) && bic(sw, 0)) { //前回1で今回0なら
mode = (mode + 1) % 14;
if (mute_state) {
mute_state = 0;
disp(7);
} else disp(3);
}
if (bis(sw, 9) && bic(sw, 1)) {
mode = (mode + 13) % 14;
if (mute_state) {
mute_state = 0;
disp(7);
} else disp(3);
}
if (bis(sw, 10) && bic(sw, 2)) {
if(mode==0)select[mode]=(select[mode] + 1) % 60;
else if(mode==1)select[mode]=(select[mode] + 1) % 21;
else if(mode==2)select[mode]=(select[mode] + 1) % 4;
if (mute_state) {
mute_state = 0;
disp(7);
} else disp(3);
}
if (bis(sw, 11) && bic(sw, 3)) {
if(mode==0)select[mode]=(select[mode] + 59) % 60;
else if(mode==1)select[mode]=(select[mode] + 20) % 21;
else if(mode==2)select[mode]=(select[mode] + 3) % 4;
if (mute_state) {
mute_state = 0;
disp(7);
} else disp(3);
}
if (bis(sw, 12) && bic(sw, 4)) {
mute_state = !mute_state;
disp(5);
}
_delay_ms(10);
}
}
MUTE CH SELECT ―
MUTE CH SELECT +
MUTE MODE ―
MUTE MODE +