본문 바로가기
코스웨어/15년 스마트컨트롤러

20150326-7번 김성현 pic를 이용한 count up &down ,UART

by 알 수 없는 사용자 2015. 3. 27.
728x90
반응형
<H/W>


<page 45>

<page 27>






/* 
 * File:   iamthebest.c
 * Author: it
 *
 * Created on 2015? 3? 25? (?), ?? 11:31
 */


#include <stdio.h>
#include <stdlib.h>
#include "pic16f917.h"
#define DELAY(X) for(uiCnt=0; uiCnt<(X); uiCnt++)
#define DNUM 10000 //개인상 10000이 적당한거 같음

/*
 * 
 */

int main(int argc, char** argv)
{
    unsigned char a=0, b=0;/*1byte= 8bit 이므로  8bit를 표기하기 위하여 unsigned char 지정,
                    a는 portA의 상태를 나타내기 위한것*/

    volatile unsigned int uiCnt;

    ANSEL = 0x00// analog disable
    TRISA  = 0x03//00000011 A0 & A1 as an input
  
    TRISB =  0x00;  //PORTB pin configured as an output

    while(1)//
    {
       a= (PORTA & 0x03) ;
       /*"pic16f917.h"에서 PORTA불러옴
        PORTA 는 회로상의 2개의 SWITCH누름에따라 D·C00,D·C01,D·C10,D·C11(D·C=Don't Care 즉 4가지 값을 가지는데 while문 동안 0x03 AND bit 연산에서
        * 00,01,10,11값 네가지 결과가 출력됨 우리가 원하는 값인 01,10(RA1=0과 RA0=1,RA1=0, RA0=1)임
        그러므로 switch문을 이용 */


      
        switch(a)
        {
            case 0x01:
                     b++;
                    
                     break;
            case 0x02:
                    b--;
                  
                     break;
           
        }
               PORTB =b;
               DELAY(DNUM);
    }
       return 0;
}

심심해서 만들어 봤습니다.
/*
 * File:   iamthebest2.c
 * Author: it
 *
 * Created on 2015? 3? 25? (?), ?? 11:31
 */


#include <stdio.h>
#include <stdlib.h>
#include "pic16f917.h"
#define DELAY(X) for(uiCnt=0; uiCnt<(X); uiCnt++)
#define DNUM   5000

/*
 *
 */

int main(int argc, char** argv)
{
    unsigned char a=0, b=0;/*1byte= 8bit 이므로  8bit를 표기하기 위하여 unsigned char 지정,
                    a는 portA의 상태를 나타내기 위한것*/

    volatile unsigned int uiCnt;
    ANSEL = 0x00// analog disable
    TRISA  = 0x03//00000011 A0 & A1 as an input
    TRISB =  0x00;  //PORTB pin configured as an output


    while(1)
    {

        if(RA1==0 && RA0==1)
        {
            b++;
        }
        else if(RA1==1 && RA0==0)
        {
            b--;
        }

        PORTB=b;
        DELAY(DNUM);
    }
       return 0;
}

<S/W>








<uart.c>
#include "usart.h"
#include "lcd.h"
#include "smart.h"

void UART0_Init(void)
{
  //UBRR 속도 조절 
  UBRR0H =  UBRR_H ;  //A B 두개중 A만 UBRR0H에 A만 저장
  UBRR0L =  UBRR_L; // A, B 두개중에 B만 UBRROL에 저장

  //A register에 대한 setting 
  UCSR0A = (0<<U2X) |(0<<MPCM);
       // (0<<1) | (0<<0)
  UCSR0B= (1<<RXEN) |(1<<TXEN)|(0<<UCSZ2); // RXEN의 초기값은 4, TXEN의 초기값은 3,UCSZ2의 초기값은 2
      // (1<<4)   | (1<<3) | (1<<2)
  UCSR0C= (0<<UMSEL) |(1<<UPM1)|(0<<UPM0)|(0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0)|(0<<UCPOL);
    //(0<<6) | (1<<5) |(0<<4) | (0<<3) |(1<<2) | (1<<1)

  
  return;

  
}

void UART1_Init(void)
{
  //UBRR 속도 조절 
  UBRR1H =  UBRR_H ;  //A B 두개중 A만 UBRR0H에 A만 저장
  UBRR1L =  UBRR_L; // A, B 두개중에 B만 UBRROL에 저장

  //A register에 대한 setting 
  UCSR1A = (0<<U2X) |(0<<MPCM);
       // (0<<1) | (0<<0)
  UCSR1B= (1<<RXEN) |(1<<TXEN)|(0<<UCSZ2); // RXEN의 초기값은 4, TXEN의 초기값은 3,UCSZ2의 초기값은 2
      // (1<<4)   | (1<<3) | (1<<2)
  UCSR1C= (0<<UMSEL) |(1<<UPM1)|(0<<UPM0)|(0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0)|(0<<UCPOL);
    //(0<<6) | (1<<5) |(0<<4) | (0<<3) |(1<<2) | (1<<1)

  
  return;

  
}
void UART0_Tx( unsigned char ucData ) //PAGE 174 example
{
  // Wait for empty transmit buffer //delay code 전송 버퍼가 비면 전송되고 차면 스톱 시킴
  while ( 0==( UCSR0A & (1<<UDRE)) ); //page184, 1을 UDRE자리(5번 BIT)로 이동 , 1s에 16000000로 
  // Put data into buffer, sends the data 
  UDR0= ucData;

  return;
  
}
void UART1_Tx( unsigned char ucData ) //PAGE 174 example
{
  // Wait for empty transmit buffer //delay code 전송 버퍼가 비면 전송되고 차면 스톱 시킴
  while ( 0==( UCSR1A & (1<<UDRE)) ); //page184, 1을 UDRE자리(5번 BIT)로 이동 , 1s에 16000000로 
  // Put data into buffer, sends the data 
  UDR1= ucData;

  return;
}
void UART_Print( const unsigned char * cString) //문자열을 주소로 받음 , 문자열을 수정 하지 않음 const
{

  while(0!= *cString)
  {
    UART1_Tx(*cString); //
    ++cString;
  }
  return;  
}



<UART.H>
#ifndef __USART_H__
#define __USART_H__

#include "smart.h"
#define F_OSC ((unsigned long)(F_CPU))// UL=unsigned long 1600000이 int를 초과하므로 을 붙여 확장 시킴
#define BAUD 115200
#define UBRR_H ((unsigned long)((F_OSC/(16.0*BAUD))-0.5)>>8)// ?
#define UBRR_L ((unsigned long)((F_OSC/(16.0*BAUD))-0.5))         

void UART0_Init(void);
void  UART1_Init(void);

void UART0_Tx( unsigned char );
void UART1_Tx( unsigned char  );
void UART_Print( const unsigned char * );

#endif //__USART_H__

<MAIN.C>
#include "smart.h"
#include "lcd.h"
#include "usart.h"


int main() //main 종료 하면 안된다
{
  Init();
   LCD_Print("smart control");  
  

  while(1); //종료 시키지 않게 하기 위하여 무한 반복 firmware에서는 종료 금지  
    
  return 0;
}
void Init(void)
{
  LCD_Init();
  
  UART1_Init();
  
  
  
  return;
}





두서 없이 올려서 죄송합니다.
오늘은 하나의 괄호조차 소중히 봐야 한다는 것을 느낀 좋고도 힘든 하루 였습니다. 학우님들은 어떠신지?


728x90