#define PORTX.x в Avr Studio 5 (ATmega16) - PullRequest
1 голос
/ 22 января 2012

Я пишу новую и специальную библиотеку с новыми алгоритмами и возможностями для драйвера KS0108 GLCD.Я использую ATMega16.Размер GLCD моей точечной матрицы составляет 128x64.

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

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

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

Ответы [ 2 ]

1 голос
/ 23 января 2012

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

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
1 голос
/ 22 января 2012

В ATmega значения выводов собираются в регистры PORT.Значение булавки - это значение бита в ПОРТУ.ATmega не имеет немного адресуемой памяти ввода-вывода, как у некоторых других процессоров, поэтому вы не можете обратиться к выводу для чтения и записи с одним #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();     
...