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