C #在Avr Studio 5(ATmega16)中定义PORTX.x

C #在Avr Studio 5(ATmega16)中定义PORTX.x,c,c-preprocessor,atmega16,avr-studio5,C,C Preprocessor,Atmega16,Avr Studio5,我正在为KS0108 GLCD驱动程序编写一个新的特殊库,其中包含新的算法和功能。我用的是ATMega16。我的点阵GLCD尺寸是128x64 如何使用#定义代码来定义不同的端口引脚? 例如:#定义GLCD\u CTRL\u重新启动端口C.0 IDE:AVR Studio 5 语言:C 模块:128x64点阵GLCD 驱动程序:KS0108 微控制器:ATMega16 请解释我应该使用哪些标题?还可以为ATMEga16编写一个完整且非常简单的代码。在ATmega中,管脚值组装在端口寄存器中。引脚

我正在为KS0108 GLCD驱动程序编写一个新的特殊库,其中包含新的算法和功能。我用的是ATMega16。我的点阵GLCD尺寸是128x64

如何使用#定义代码来定义不同的端口引脚?
例如:#定义GLCD\u CTRL\u重新启动端口C.0

IDE:AVR Studio 5
语言:C
模块:128x64点阵GLCD
驱动程序:KS0108
微控制器:ATMega16


请解释我应该使用哪些标题?还可以为ATMEga16编写一个完整且非常简单的代码。

在ATmega中,管脚值组装在端口寄存器中。引脚值是端口中的位值。ATmega没有像其他处理器那样的位可寻址IO内存,因此您不能像您建议的那样使用单个
#define
来引用pin进行读写

如果有帮助的话,您可以做的是定义宏来读取或写入pin值。您可以根据需要更改宏的名称

#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();     
#包括
#定义端口C_BIT0_READ()
#定义WRITE_PORTC_BIT0(x)(PORTC=(PORTC&~~_BV(PC0))|(x)非常感谢,但我在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
如果你想改变字节中第6位的状态,你可以使用_BV(6),它相当于0x40。但是我们很多人更喜欢完全标准的方法,只需写(1)