회원가입 ID/PW 찾기
AA

/**********************************************************************
*
*                              main.c
*
*
*
***********************************************************************/

#include <iom2560.h>
#include <stdio.h>
#include <intrinsics.h>

unsigned char sec1;
unsigned char sec2;
unsigned char sec3;
unsigned char min1;
unsigned char min2;
unsigned char hour1;
unsigned char hour2;

void init_lcd(void)
{
  DDRL = 0xff;
  DDRC = 0xff;

  PORTC = 0x04;
  PORTL = 0x38;
  __delay_cycles (8000);
  PORTC = 0x03;

  PORTC = 0x04;
  PORTL = 0x38;
  __delay_cycles (8000);
  PORTC = 0x03;

  PORTC = 0x04;
  PORTL = 0x38;
  __delay_cycles (8000);
  PORTC = 0x03;

  PORTC = 0x04;
  PORTL = 0x0c;
  __delay_cycles (8000);
  PORTC = 0x03;

  PORTC = 0x04;
  PORTL = 0x06;
  __delay_cycles (8000);
  PORTC = 0x03;

  PORTC = 0x04;
  PORTL = 0x02;
  __delay_cycles (8000);
  PORTC = 0x03;

  PORTC = 0x04;
  PORTL = 0x01;
  __delay_cycles (8000);
  PORTC = 0x03;
}

void write(unsigned int addr, unsigned int str)
{
  PORTC = 0x04;
  PORTL = addr;
  __delay_cycles (8000);
  PORTC = 0x03;

  PORTC = 0x06;
  PORTL = str;
  __delay_cycles (8000);
  PORTC = 0x03;
}

void init_timer1(void)
{
 OCR1AH = 0x2C; 
 OCR1AL = 0xFF;
 TCCR1B = 0x0B; 
        TIMSK1 = 0x02;
}

#pragma vector = TIMER1_COMPA_vect
__interrupt void timer1_compa()
{
 sec1++;
}

void init_clock()
{
  sec1 = 0x30;
  sec2 = 0x30;
  sec3 = 0x30;
  min1 = 0x30;
  min2 = 0x30;
  hour1 = 0x30;
  hour2 = 0x30;
}

void main(void)
{
  init_clock();
  SREG|=0x80;
  init_timer1();
  init_lcd();

  while(1)
  {
    write(0x89, sec1); SET RAM CONTROL
    write(0x88, 0x2e); SET_RAM_ADDRESS_CONTROL     
    write(0x87, sec2);
    write(0x86, sec3); SET_PARTIAL_DISPLAY CONTROL 
    write(0x85, 0x3a);
    write(0x84, min1);
    write(0x83, min2);
    write(0x82, 0x3a);
    write(0x81, hour1);
    write(0x80, hour2);
    if (sec1>0x39){sec1 = 0x30; sec2++;}
    if (sec2>0x39){sec2 = 0x30; sec3++;}
    if (sec3>0x35){sec3 = 0x30; min1++;}
    if (min1>0x39){min1 = 0x30; min2++;}
    if (min2>0x35){min2 = 0x30; hour1++;}
    if (hour2 == 0x30 & hour1>0x39){hour1 = 0x30; hour2 = 0x31;}
    if (hour2 == 0x31 & hour1>0x39){hour1 = 0x30; hour2 = 0x32;}
    if (hour2 == 0x32 & hour1>0x33){hour1 = 0x30; hour2 = 0x30;}
  }

}

댓글 1
  • No Profile

    #include <iom2560.h>
    #include <stdio.h>
    #include <intrinsics.h>

    위부분은 아실거라 생각합니다.명령어에 관한 함수를 호출한거고요.

    unsigned char sec1;
    unsigned char sec2;
    unsigned char sec3;
    unsigned char min1;
    unsigned char min2;
    unsigned char hour1;
    unsigned char hour2; 이부분은 메모리 크기 지정 한거구요 할당될수 있는 크기를 지정한겁니다. char정도면 문자 단위까지 지정이가능합니다.숫자만 쓰실거면 더 적은 bit단위의 표현방법도 있고요

    void init_lcd(void)
    {
    DDRL = 0xff;
    DDRC = 0xff;

    PORTC = 0x04;
    PORTL = 0x38;
    __delay_cycles (8000);
    PORTC = 0x03;

    PORTC = 0x04;
    PORTL = 0x38;
    __delay_cycles (8000);
    PORTC = 0x03;

    PORTC = 0x04;
    PORTL = 0x38;
    __delay_cycles (8000);
    PORTC = 0x03;

    PORTC = 0x04;
    PORTL = 0x0c;
    __delay_cycles (8000);
    PORTC = 0x03;

    PORTC = 0x04;
    PORTL = 0x06;
    __delay_cycles (8000);
    PORTC = 0x03;

    PORTC = 0x04;
    PORTL = 0x02;
    __delay_cycles (8000);
    PORTC = 0x03;

    PORTC = 0x04;
    PORTL = 0x01;
    __delay_cycles (8000);
    PORTC = 0x03;
    lcd사용할 어드레스 번지를 지정해 준겁니다.

    void write(unsigned int addr, unsigned int str)
    {
    PORTC = 0x04;
    PORTL = addr;
    __delay_cycles (8000);
    PORTC = 0x03;

    PORTC = 0x06;
    PORTL = str;
    __delay_cycles (8000);
    PORTC = 0x03;
    }

    쓰기관련 해서 각 포트별로 메모리에 어느 번지 부터 시작할건지 시작위치를 지정해 준겁니다. 

    void init_timer1(void)
    {
    OCR1AH = 0x2C;
    OCR1AL = 0xFF;
    TCCR1B = 0x0B;
    TIMSK1 = 0x02;
    타이머 관련해서 어느 번지를 쓰실건지 그분분 정의해 놓은거구요.

    #pragma vector = TIMER1_COMPA_vect
    __interrupt void timer1_compa()
    {
    sec1++;
    }

    void init_clock()
    {
    sec1 = 0x30;
    sec2 = 0x30;
    sec3 = 0x30;
    min1 = 0x30;
    min2 = 0x30;
    hour1 = 0x30;
    hour2 = 0x30;
    }

    이분분도

    sec1++ 이분분은 1씩 증가하라 이런식으로 타이머 동작과 클럭 번지 지정을 해 준겁니다.

    void main(void)
    {
    init_clock();
    SREG|=0x80;
    init_timer1();
    init_lcd();

    while(1)
    {
    write(0x89, sec1); SET RAM CONTROL
    write(0x88, 0x2e); SET_RAM_ADDRESS_CONTROL
    write(0x87, sec2);
    write(0x86, sec3); SET_PARTIAL_DISPLAY CONTROL
    write(0x85, 0x3a);
    write(0x84, min1);
    write(0x83, min2);
    write(0x82, 0x3a);
    write(0x81, hour1);
    write(0x80, hour2);
    if (sec1>0x39){sec1 = 0x30; sec2++;}
    if (sec2>0x39){sec2 = 0x30; sec3++;}
    if (sec3>0x35){sec3 = 0x30; min1++;}
    if (min1>0x39){min1 = 0x30; min2++;}
    if (min2>0x35){min2 = 0x30; hour1++;}
    if (hour2 == 0x30 & hour1>0x39){hour1 = 0x30; hour2 = 0x31;}
    if (hour2 == 0x31 & hour1>0x39){hour1 = 0x30; hour2 = 0x32;}
    if (hour2 == 0x32 & hour1>0x33){hour1 = 0x30; hour2 = 0x30;}
    }

    }
    이부분은 동작에 관련된 부분인데 우선 간단하게 이야기해서

    if (sec1>0x39){sec1 = 0x30; sec2++;}

    만약에 sec1 0x39번지가 0x30이면 sec2는 1증가하라 이런식으로 ... 동작에 관련된 내용입니다.

    write(0x89, sec1); 이부분은 쓰기 0x89번지가 sec1 을 저장하라 이런 문구입니다.

    정확하게는 1부터 9증가하다 0이되면 sec2를 1증가하고 다시 1씩 증가한다 이런식으로 동작이 되겠금 설계하신거 같습니다.

     

    도움이 많이 못되서 죄송합니다  c 배운지 오래되서 기본 적인 동작 이어떻게 되는지 만 감 잡으시라고 올렸습니다. .

하드웨어 설계 및 개발에 대하여 개발자들이 자유롭게 토론하는 공간입니다.
- Q&A, 자유주재 토론, 관련 정보 공유
- 분야 : 마이크로프로세서 응용, 전기/전자(아날로그/디지털) 회로 설계, C/C++ 프로그래밍, 펌웨어,
         PCB Artwork, 트러블슈팅 등 하드웨어 설계에 관한 전반인 내용
※ 게시글에 맞는 분류를 선택하여 글을 작성해 주시면 쾌적한 사이트 운영에 많은 도움이 됩니다.
※ 하드웨어 인사이트는 회원들간의 거래정보를 게재할 뿐이지, 그 어떤 책임과 의무도 가지지 않습니다.

search
번호 분류 제목 글쓴이 조회 수 날짜
3 머신러닝, AI & 알고리즘 HOT오목 게임 알고리즘3 새로운하늘 3469 2010.03.29
2 머신러닝, AI & 알고리즘 HOT지하철 최단거리 알고리즘은?2 지워나 2870 2008.06.20
1 머신러닝, AI & 알고리즘 HOT순차 프로그램에 대한 간단한 알고리즘과 재귀 알고리즘의 속도 테스트 - by 아크마7 아크마 3083 2007.08.08
  • 사랑이란 뿌리는, 땅 속 깊숙이 박았지만 가지는 하늘로 치뻗은 나무이어야 한다.
    - B.러 셀
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.