?? smg.c
字號:
#include <avr/io.h>
#include <avr/interrupt.h>
static char scandata[32] =
{
0b10101111,//0
0b10100000,//1
0b11000111,//2
0b11100110,//3
0b11101000,//4
0b01101110,//5
0b01101111,//6
0b10100010,//7
0b11101111,//8
0b11101110,//9
0b11101011,//A
0b01101101,//b
0b00001111,//C
0b11100101,//d
0b01001111,//E
0b01001011,//F
0b10111111,//0
0b10110000,//1
0b11010111,//2
0b11110110,//3
0b11111000,//4
0b01111110,//5
0b01111111,//6
0b10110010,//7
0b11111111,//8
0b11111110,//9
0b11111011,//A
0b01111101,//b
0b00011111,//C
0b11110101,//d
0b01011111,//E
0b01011011,//F
};
void init_tc0(void)
{
TCNT0 = 0;
TIMSK |= (1 << TOIE0);//使能TC0溢出中斷
TCCR0 |= (1 << CS02);//256分頻
}
static void scan_smg(char num,char *data)
{
switch(num & 0x03)
{
case 0:
{
PORTC &= ~(1 << 6);
PORTB = scandata[data[0]];
PORTD |= (1 << 5);
break;
}
case 1:
{
PORTD &= ~(1 << 5);
PORTB = scandata[data[1]];
PORTD |= (1 << 4);
break;
}
case 2:
{
PORTD &= ~(1 << 4);
PORTB = scandata[data[2]];
PORTC |= (1 << 7);
break;
}
case 3:
{
PORTC &= ~(1 << 7);
PORTB = scandata[data[3]];
PORTC |= (1 << 6);
break;
}
default:
{
break;
}
}
}
volatile static char smg_num = 0,smg_dis_buf[4] = {0};
void write_smg(char * data)
{
char i = 0;
DDRD &= ~(1 << 6);
PORTD |= (1 << 6);
DDRD &= ~(1 << 7);
PORTD |= (1 << 7);
DDRD &= ~(1 << 2);
PORTD |= (1 << 2);
DDRD &= ~(1 << 3);
PORTD |= (1 << 3);
DDRB = 0xff;
DDRD |= 0x30;
DDRC |= 0xC0;
init_tc0();
for(i = 0;i < 4;i ++)
{
smg_dis_buf[i] = data[i];
}
}
void un_init_smg(void)
{
TCCR0 = 0;
PORTC &= ~(1 << 6);
PORTD &= ~(1 << 5);
PORTD &= ~(1 << 4);
PORTC &= ~(1 << 7);
}
SIGNAL(SIG_OVERFLOW0)
{
scan_smg(smg_num ++,smg_dis_buf);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -