Cです。
「ダイナミック点灯」とはめちゃくちゃ早い速度で、
点灯する物を切り替える事によって、複数の物が点灯しているように見せること。
下の写真は3桁表示されているように見えるが、実際には
同時に表示されているのは1桁で人間どもには、確認できない速さで
切り替わって表示されている。
何でこんな事をするのかというと、
1個ずつちゃんと表示してたらマイコンの足がいくらあっても足りないから。
#include<avr/io.h>
#include<util/delay.h>
#include<avr/interrupt.h>
unsigned char cnt=0;
unsigned char seg[10] = {0b00111111, 0b00000110,
0b01011011, 0b01001111,
0b01100110, 0b01101101,
0b01111101, 0b00100111,
0b01111111, 0b01101111};
ISR ( TIMER0_COMPA_vect ){
static unsigned char sel=0;
unsigned char dig1, dig10, dig100;
static unsigned char i;
dig1 = seg[cnt % 10];
dig10 = seg[(cnt / 10) % 10];
dig100 = seg[(cnt / 100) % 10];
switch(sel){
case 0: PORTB = 0b00000001;
PORTD = dig1;
break;
case 1: PORTB = 0b00000010;
PORTD = dig10;
break;
case 2: PORTB = 0b00000100;
PORTD = dig100;
break;
}
sel++;
if(sel == 3){ sel = 0; }
i++;
if(i == 200){ cnt++; i = 0; }
}
int main(void) {
DDRB = 0b11101111; //PB4のみ入力
DDRD = 0b11111111; //すべて出力
PORTB = 0b00010000; //
PORTD = 0b00000000; //D初期化
TCCR0A = 0b00000010; //CTC
TCCR0B = 0b00000101; //約1kHz
OCR0A = 5; //5msで割り込む
TIMSK0 = 0b00000010; //COMPA割り込み
sei(); //全体割り込み許可
while(1) {
}
return 0;
}
2012年7月14日土曜日
AVR PORTDチェック関数
Cです。
PORTDの出力チェックを実施する。
PD0~7にLEDでもつないでおこう。
#include<util/delay.h>
void PORTD_test(char w_cnt){
char i;
for(i = 0; i < w_cnt; i++){
PORTD = 0b00000001;
_delay_ms(200);
PORTD = 0b00000010;
_delay_ms(200);
PORTD = 0b00000100;
_delay_ms(200);
PORTD = 0b00001000;
_delay_ms(200);
PORTD = 0b00010000;
_delay_ms(200);
PORTD = 0b00100000;
_delay_ms(200);
PORTD = 0b01000000;
_delay_ms(200);
PORTD = 0b10000000;
_delay_ms(200);
}
}
int main(void) {
DDRD = 0b11111111; //すべて出力
PORTD = 0b00000000; //D初期化
while(1) {
PORTD_test(1);
}
return 0;
}
PORTDの出力チェックを実施する。
PD0~7にLEDでもつないでおこう。
#include<util/delay.h>
void PORTD_test(char w_cnt){
char i;
for(i = 0; i < w_cnt; i++){
PORTD = 0b00000001;
_delay_ms(200);
PORTD = 0b00000010;
_delay_ms(200);
PORTD = 0b00000100;
_delay_ms(200);
PORTD = 0b00001000;
_delay_ms(200);
PORTD = 0b00010000;
_delay_ms(200);
PORTD = 0b00100000;
_delay_ms(200);
PORTD = 0b01000000;
_delay_ms(200);
PORTD = 0b10000000;
_delay_ms(200);
}
}
int main(void) {
DDRD = 0b11111111; //すべて出力
PORTD = 0b00000000; //D初期化
while(1) {
PORTD_test(1);
}
return 0;
}
登録:
投稿 (Atom)