2023. 6. 1. 00:11ㆍEmbedded/마이크로프로세서
- FND 1
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 16000000UL
unsigned char SEG[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
void Initial_set(){
DDRF = 0xFF;
PORTF = 0xFF;
DDRB = 0x0F;
PORTB = 0x08;
}
int main(){
Initial_set();
int i = 1;
while(1){
PORTB = 0x0E;
PORTF = SEG[i%100%10];
_delay_ms(5);
PORTB = 0x0D;
PORTF = SEG[i%100/10];
_delay_ms(5);
PORTB = 0x0B;
PORTF = SEG[i/100];
_delay_ms(5);
i++;
if (i>999) i=0;
}
return 0;
}
- 코드설명
각 포트의 입출력 상태 및 초기값
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
DDRF | DDF7 | DDF6 | DDF5 | DDF4 | DDF3 | DDF2 | DDF1 | DDF0 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | |
PORTF | PF7 | PF6 | PF5 | PF4 | PF3 | PF2 | PF1 | PF0 |
0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
DDRF | DDB7 | DDB6 | DDB5 | DDB4 | DDB3 | DDB2 | DDB1 | DDB0 |
0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | |
PORTF | PB7 | PB6 | PB5 | PB4 | PB3 | PB2 | PB1 | PB0 |
0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
while(1){
int i;
for (i = 0 ; i <= 999 ; i=i+1){
PORTB = 0xfe;
PORTF = SEG[i%100%10];
_delay_ms(5);
세그먼트 출력을 0xfe로 하여 S0만 출력하게 한다.
SEG[i%100%10]을 하여 숙자의 일의자리숫자를 출력 하게 한다.
PORTB = 0xfd;
PORTF = SEG[i%100/10];
_delay_ms(5);
세그먼트 출력을 0xfc로 하여 S1만 출력하게 한다.
SEG[i%100/10]을 하여 십의자리숫자를 출력 하게 한다.
PORTB = 0xfb;
PORTF = SEG[i/100];
_delay_ms(5);
세그먼트 출력을 0xfb로 하여 S2만 출력하게 한다.
SEG[i/100]을 사용하여 백의자리 숫자를 출력 하게 한다.
PORTB = 0xf7;
PORTF = SEG[0];
_delay_ms(50);
세그먼트 출력을 0xf7로 하여 S3만을 출력하게 한다.
SEG[0]을 사용하여 S3자리를 비워준다.
- FND 2
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 1000000UL
unsigned char SEG[16] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};
void Fnd_num(){
int i;
PORTB = 0x0E;
for (i = 0 ; i < 10 ; i++){
PORTF = SEG[i];
_delay_ms(2000);
}
}
void Fnd_char(){
int i;
PORTB = 0x0D;
for (i = 10 ; i < 16 ; i++){
PORTF = SEG[i];
_delay_ms(2000);
}
}
void Fnd_hexa(){
int i;
PORTB = 0x0B;
for (i = 0 ; i < 16 ; i++){
PORTF = SEG[i];
_delay_ms(2000);
}
}
void Fnd_3digit(){
int i;
for (i = 0 ; i <= 999 ; i=i+1){
PORTB = 0x0E;
PORTF = SEG[i%100%10];
_delay_ms(5);
PORTB = 0x0C;
PORTF = SEG[i%100/10];
_delay_ms(5);
PORTB = 0x0B;
PORTF = SEG[i/100];
_delay_ms(5);
}
}
void Fnd_2times(){
int i;
PORTB = 0x0E;
for (i = 0 ; i < 17 ; i=i+2){
PORTF = SEG[i];
_delay_ms(2000);
}
}
void Fnd_3times(){
int i;
PORTB = 0x0E;
for (i = 0 ; i < 16 ; i=i+3){
PORTF = SEG[i];
_delay_ms(2000);
}
}
void stop_Fnd(){
PORTB = 0x00;
PORTF = 0xFF;
}
int main(){
unsigned char keyin;
DDRF = 0xFF;
DDRB = 0x0F;
DDRC = DDRC & ~(1<<DDC0 | 1<<DDC1 | 1<<DDC2 | 1<<DDC3);
PORTB = 0x0F;
PORTC = PORTC | 1<<PC0 | 1<<PC1 | 1<<PC2 | 1<<PC3;
while(1){
keyin = PINC & 0x0F;
while(1){
switch(keyin){
case 0x0E :
Fnd_num();
break;
case 0x0D :
Fnd_char();
break;
case 0x0B :
Fnd_hexa();
break;
case 0x07 :
Fnd_3digit();
break;
case 0x0C :
Fnd_2times();
break;
case 0x09 :
Fnd_3times();
break;
case 0x03 :
stop_Fnd();
break;
default :
PORTB = 0X00;
PORTF = 0xC0;
break;
}
}
}
}
- 코드설명
각 포트의 입출력 상태 및 초기값
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
DDRF | DDF7 | DDF6 | DDF5 | DDF4 | DDF3 | DDF2 | DDF1 | DDF0 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | |
PORTF | PF7 | PF6 | PF5 | PF4 | PF3 | PF2 | PF1 | PF0 |
0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
DDRC | DDC7 | DDC6 | DDC5 | DDC4 | DDC3 | DDC2 | DDC1 | DDC0 |
DDC7 | DDC6 | DDC5 | DDC4 | 0 | 0 | 0 | 0 | |
PORTC | PC7 | PC6 | PC5 | PC4 | PC3 | PC2 | PC1 | PC0 |
PC7 | PC6 | PC5 | PC4 | 1 | 1 | 1 | 1 |
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
DDRB | DDB7 | DDB6 | DDB5 | DDB4 | DDB3 | DDB2 | DDB1 | DDB0 |
0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | |
PORTB | PB7 | PB6 | PB5 | PB4 | PB3 | PB2 | PB1 | PB0 |
0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
void Fnd_num(){
int i;
PORTB = 0x0E;
for (i = 0 ; i < 10 ; i++){
PORTF = SEG[i];
_delay_ms(2000);
}
}
스위치 C0번을 올릴시 세그먼트 S0번에 1~9까지의 10진수를 반복표시 하는 코드.
for문을 사용하여 1부터 9까지 나타나게 설정.
void Fnd_char(){
int i;
PORTB = 0x0D;
for (i = 10 ; i < 16 ; i++){
PORTF = SEG[i];
_delay_ms(2000);
}
}
스위치C1번을 올릴시 세그먼트 S1번에 A~F까지 문자만 반복표시 하는 코드.
16진수는 9까지는 숫자이고 10부턴 문자이므로 for문에 I의 값을 10으로 설정.
void Fnd_hexa(){
int i;
PORTB = 0x0B;
for (i = 0 ; i < 16 ; i++){
PORTF = SEG[i];
_delay_ms(2000);
}
}
스위치C2번을 올릴시 세그먼트 S2번에 0~F까지의 숫자와 문자를 반복표시 하는 코드.
16진수 전부를 세그먼트에 표시하므로 for문에 I값을 0으로 설정.
void Fnd_3digit(){
int i;
for (i = 0 ; i <= 999 ; i=i+1){
PORTB = 0x0E;
PORTF = SEG[i%100%10];
_delay_ms(5);
PORTB = 0x0C;
PORTF = SEG[i%100/10];
_delay_ms(5);
PORTB = 0x0B;
PORTF = SEG[i/100];
_delay_ms(5);
}
}
스위치C3번을 올릴시 세그먼트에 0~999까지의 숫자가 반복적으로 표시되는 코드.
for문을 사용하여 0~999까지 반복 할 수 있게 설정.
자리수 | 100의 자리 | 10의 자리 | 1의 자리 |
세그먼트 자리코드 |
PORTB=0x0B | PORTB=0x0C | PORTB=0x0E |
디스플레이 숫자 | SEG[i/100] | SEG[i%100/10] | SEG[i%100%10] |
void Fnd_2times(){
int i;
PORTB = 0x0E;
for (i = 0 ; i < 17 ; i=i+2){
PORTF = SEG[i];
_delay_ms(2000);
}
}
스위치 C0과 C1 ON시 세그먼트 S0자리에 2의 배수로 증가하는 코드.
for문의 i<17이유는 16진수는 16(F) 이후엔 없기 때문에 17미만으로 설정.
void Fnd_3times(){
int i;
PORTB = 0x0E;
for (i = 0 ; i < 16 ; i=i+3){
PORTF = SEG[i];
_delay_ms(2000);
}
}
스위치 C1과 C2 ON시 세그먼트 S0자리에 3의 배수로 증가하는 코드.
for문을 사용하여 반복 하고, 배열을 사용하여 숫자를 표시.
void stop_Fnd(){
PORTB = 0xf0;
PORTF = 0xff;
스위치 C1과 C2를 올리면 세그먼트의 동작을 정지하는 코드.(모든 FND를 OFF시킨다.)
'Embedded > 마이크로프로세서' 카테고리의 다른 글
ATMEGA128 포토인터럽트 제어 실험 (0) | 2023.06.01 |
---|---|
ATMEGA128 Roullette 모형 제어 (0) | 2023.06.01 |
ATMEGA128 Motor 제어 실험 (0) | 2023.06.01 |
ATMEGA128 RELAY 제어 실험 (0) | 2023.06.01 |
ATMEGA128 LED 제어 (0) | 2023.05.31 |