BASIC4MCU | 질문게시판 | 방금 글쓴 사람입니다!
페이지 정보
작성자 범뚱 작성일2023-12-14 20:17 조회2,832회 댓글5건본문
댓글 5
조회수 2,832master님의 댓글
master 작성일세그먼트 예제 올려보세요
범뚱님의 댓글
범뚱 작성일
저번에 알려주셨던 코드입니다. 제가 이번에 수행하려는 목표는 0층부터 5층까지 있는 엘리베이터를 만들려는 것이고, KEY1번과 KEY3번을 누르면 층이 올라가고 KEY 2번과 KEY 4번을 누르면 내려가게 설정하고 싶습니다. 각 층은 7 세그먼트 디스플레이에 나타나게 하고 싶습니다.
#include <mega128a.h>
#include <delay.h>
#define FLOOR_1_BTN PINA.0 // 각 층의 버튼 핀 번호 설정
#define FLOOR_2_BTN PINA.1
#define FLOOR_3_BTN PINA.2
#define FLOOR_4_BTN PINA.3
unsigned char seg[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d}; // 0~5
unsigned char target_floor = 1, current_floor = 1;
void update_display() {
// 7세그먼트 디스플레이를 업데이트하는 코드를 작성하세요.
// 예를 들어, PORTC와 PORTD를 사용하여 디스플레이 값을 설정할 수 있습니다.
// 필요한 경우에는 delay_ms() 함수를 사용하여 디스플레이 간의 간격을 조절할 수 있습니다.
PORTC = 0x01; // digit 설정
PORTD = seg[current_floor]; // 현재 층에 해당하는 세그먼트 값 출력
delay_ms(500); // 디스플레이 간의 간격 설정
}
void elevator_move() {
if (target_floor > current_floor) {
while (target_floor > current_floor) {
current_floor++;
update_display(); // 층이 변경될 때마다 디스플레이 업데이트
delay_ms(500);
}
} else if (target_floor < current_floor) {
while (target_floor < current_floor) {
current_floor--;
update_display(); // 층이 변경될 때마다 디스플레이 업데이트
delay_ms(500);
}
}
}
void main(void) {
DDRD = 0xFF; // 7segment
DDRC = 0x01; // digit
PORTC = 0x01; // digit 초기값 설정
update_display(); // 초기 디스플레이 업데이트
while (1) {
if (FLOOR_1_BTN == 0) {
target_floor = 1;
delay_ms(200);
}
if (FLOOR_2_BTN == 0) {
target_floor = 2;
delay_ms(200);
}
if (FLOOR_3_BTN == 0) {
target_floor = 3;
delay_ms(200);
}
if (FLOOR_4_BTN == 0) {
target_floor = 4;
delay_ms(200);
}
if (target_floor != current_floor) {
elevator_move();
}
}
}
범뚱님의 댓글
범뚱 작성일
#include <mega128.h>
#include <delay.h>
flash unsigned char seg_pat[16]= xx;
void main(void)
{
int i;
DDRB = 0xF0; // 포트 B 상위 4비트 출력 설정
DDRD = 0xF0; // 포트 D 상위 4비트 출력 설정
DDRG = 0x0F; // 포트 G 하위 4비트 출력 설정
PORTG = 0b00001000; // 맨 우측 7-Segment DIG4 ON(PG3=1)
PORTB = 0x0; // E, F, G, DP off
PORTD = 0x0; // A, B, C, D off
while(1){ // 16진수 순차 표시
for(i = 0;i < 16;i++){
PORTD =yy;
PORTB = zz;
delay_ms(1000)
///////////////////////////////////////////////////////////////////////////
#include <mega128.h>
#include <delay.h>
void main(void)
{
DDRB = 0xF0; // 포트 B 상위 4비트 출력 설정
DDRD = 0xF0; // 포트 D 상위 4비트 출력 설정
DDRG = 0x0F; // 포트 G 하위 4비트 출력 설정
PORTB = 0b11110000; // E, F, G, DP on
PORTD = 0b11110000; // A, B, C, D on
while(1){
PORTG = 0b00001000; // DIG4 7-Segment ON (PG3=1)
delay_ms(500);
PORTG = 0b00000100; // DIG3 7-Segment ON (PG2=1)
delay_ms(500);
PORTG = 0b00000010; // DIG2 7-Segment ON (PG1=1)
delay_ms(500);
PORTG = 0b00000001; // DIG1 7-Segment ON (PG0=1)
delay_ms(500);
/////////////////////////////////////////////////////////////////////////////////////////////////////
#include <mega128.h>
#include <delay.h>
void main(void)
{
char i, val;
DDRB = 0xF0; // 포트 B 상위 4비트 출력 설정
DDRD = 0xF0; // 포트 D 상위 4비트 출력 설정
DDRG = 0x0F; // 포트 G 하위 4비트 출력 설정
PORTG = 0b00001000; // 맨 우측 7-Segment DIG4 ON(PG3=1)
PORTB = 0x0;
PORTD = 0x0;
while(1){
val = 0b00000001;
for(i = 0;i < 8;i++){
PORTD = (val & 0x0F) << 4; // PD4-PD7 : A-D
PORTB = (val & 0xF0); // PB4-PB7 : E,F,G,DP
delay_ms(500);
val = val << 1; // 출력할 값 1비트 왼쪽 쉬프트
이런 예제들 사용하고 있습니다.
범뚱님의 댓글
범뚱 작성일3개의 예제를 제시해드렸습니다.
master님의 댓글
master 작성일
#include <mega128a.h>
#include <delay.h>
//
char seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d}; // 0~5
char target_floor=1,current_floor=1;
//
void update_display(){
PORTB=seg[current_floor]&0xF0;
PORTD=seg[current_floor]<<4;
}
//
void elevator_move(){
if(target_floor>current_floor){
while(target_floor>current_floor){ current_floor++; update_display(); delay_ms(500); }
}
else if(target_floor<current_floor){
while(target_floor<current_floor){ current_floor--; update_display(); delay_ms(500); }
}
}
//
void main(void){
DDRB=0xF0; DDRD=0xF0; DDRG=0x0F; PORTG=8;
update_display();
while(1){
if(PINA.0==0){ target_floor=1; delay_ms(200); }
if(PINA.1==0){ target_floor=2; delay_ms(200); }
if(PINA.2==0){ target_floor=3; delay_ms(200); }
if(PINA.3==0){ target_floor=4; delay_ms(200); }
//
if(target_floor !=current_floor){ elevator_move(); }
}
}