2012-01-22 10 views
1

Я пишу новую и специальную библиотеку с новыми алгоритмами и способностями для KS0108 GLCD Driver. Я использую ATMega16. Мое значение GLCD-матрицы составляет 128х64.#define PORTX.x в Avr Studio 5 (ATmega16)

Как я могу использовать #define код для определения разных контактов порта?
, например: #define GLCD_CTRL_RESTART PORTC.0

IDE: AVR Studio 5
Язык: C
Модуль: 128x64 матричный GLCD
Driver: KS0108
Микроконтроллер: ATMega16

Пожалуйста, объясните, какие заголовки я должен использовать? а также написать полный и очень простой код для ATMEga16.

ответ

0

В ATmega значения штырей собраны в регистры PORT. Значение pin - это значение бит в 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

Большое спасибо, но я нашел этот ответ в AVR Freaks на here:

BV = Bit Value.

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