2012-01-22 8 views
1

私はKS0108 GLCD Driverのための新しいアルゴリズムと能力を備えた新しい特別なライブラリを作成しています。私はATMega16を使用しています。私のドットマトリックスGLCDの寸法は128x64です。Avr Studio 5(ATmega16)の#define PORTX.x

#defineコードを使用して異なるポートのピンを定義するにはどうすればよいですか? の#define GLCD_CTRL_RESTART PORTC.0

IDE:AVRスタジオ5
言語:C
モジュール:128×64ドットマトリクス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