2012-01-22 2 views
1

저는 KS0108 GLCD 드라이버를위한 새롭고 특별한 라이브러리와 새로운 알고리즘 및 기능을 쓰고 있습니다. ATMega16을 사용하고 있습니다. 내 도트 매트릭스 GLCD 치수는 128x64입니다.Avr Studio 5 (ATmega16)에서 #define PORTX.x

어떻게 #define 코드를 사용하여 다른 포트 핀을 정의 할 수 있습니까? #DEFINE GLCD_CTRL_RESTART PORTC.0

IDE : AVR 스튜디오 5
언어 : C
모듈 : 128X64 도트 매트릭스 GLCD
드라이버 : KS0108

마이크로 컨트롤러 : ATMega16

어떤 헤더를 사용해야합니까? 또한 ATMEga16에 대한 완전하고 간단한 코드를 작성하십시오.

답변

0

ATmega에서 핀 값은 PORT 레지스터에 어셈블됩니다. 핀 값은 PORT의 비트 값입니다. ATmega에는 다른 프로세서와 같이 주소 지정이 가능한 IO 메모리가 없으므로 사용자가 제안한대로 #define과 같이 읽기 및 쓰기 용 핀을 참조 할 수는 없습니다.

도움이된다면 매크로를 정의하여 핀 값을 읽거나 쓸 수 있습니다. 필요에 맞게 매크로 이름을 변경할 수 있습니다.

#include <avr/io.h> 

#define PORTC_BIT0_READ() ((PORTC & _BV(PC0)) >> PC0) 
#define WRITE_PORTC_BIT0(x) (PORTC = (PORTC & ~_BV(PC0)) | ((x) << PC0)) 

uint8_t a = 1, b; 

/* Change bit 0 of PORTC to 1 */ 
WRITE_PORTC_BIT0(a); 

/* Read bit 0 of PORTC in b */ 
b = PORTC_BIT0_READ();  
1

덕분에 많은,하지만 난 here에서 AVR 괴물이 대답을 발견

BV = 비트 값입니다.

If you want to change the state of bit 6 in a byte you can use _BV(6) which is is equivalent to 0x40. But a lot us prefer the completely STANDARD method and simply write (1<<6) for the same thing or more specifically (1<<<some_bit_name_in_position_6) 

For example if I want to set bit 6 in PORTB I'd use: 
Code: 
PORTB |= (1 << PB6); 

though I guess I could use: 
Code: 
PORTB |= _BV(6); 

or 
Code: 
PORTB |= _BV(PB6); 

But, like I say, personally I'd steer clear of _BV() as it is non standard and non portable. After all it is simply: 
Code: 
#define _BV(n) (1 << n) 

anyway. 

Cliff