Jerry @DOA&INPAC, SJTU

Working out everything from the first principles.

导航

AVR单片机教程——EasyElectronics Library v1.3手册

本文隶属于AVR单片机教程系列。

 

bit.h delay.h

pin.h wave.h pwm.h tone.h adc.h

button.h switch.h rotary.h pot.h ldr.h

led.h rgbw.h segment.h lcd.h buzzer.h

uart.h

 

主要更新:

  • 其实没有必要用新版本号,但我不想再用写v1.2的那个编辑器了;

  • 完成了所有板载器件的库(除OLED,并且不打算写);

  • 为所有头文件添加C++支持(#ifdef __cplusplus)。

下载

 

bit.h

<bit.h>定义了用于位操作的宏函数,适用于8或16位整数。

set_bit(r, b):将r的第b位置为1

reset_bit(r, b):将r的第b位置为0

read_bit(r, b):读取r的第b位,若为1则返回(1 << b),否则返回0

cond_bit(c, r, b):若c为真,则将r的第b位置为1,否则置为0

flip(r, b):将r的第b位翻转。

clock(r, b):将r的第b位翻转2次。

 

delay.h

<delay.h>定义了延时函数。

void delay(uint16_t _time):延时_time毫秒。

 

pin.h

<pin.h>定义了引脚操作的函数。

pin_t:枚举类型,表示引脚。

PIN_NULL:表示空引脚。所有接受pin_t参数的函数如果接受PIN_NULL参数,则不会执行任何动作,返回void0

PIN_x:宏常量,x0`9`或`A`F,表示开发板上引脚。

pin_mode_t:枚举类型,表示引脚工作模式。

  • INPUT:表示输入;

  • OUTPUT:表示输出。

void pin_mode(pin_t _pin, pin_mode_t _mode):将_pin引脚设为_mode模式。

3个表示引脚电平的宏:

  • LOW:宏常量,输入模式下表示高阻态,输出模式下表示低电平;

  • HIGH:宏常量,输出模式下表示高电平;

  • PULLUP:宏常量,输入模式下表示上拉。

void pin_write(pin_t _pin, bool _level)_level应为bool量或上述3个宏之一(推荐前者),将_pin引脚设为_level状态(根据先前调用pin_mode决定模式,默认为输入)。

void pin_flip(pin_t _pin):将_pin引脚电平翻转。

bool pin_read(pin_t _pin):返回_pin引脚电平是否为高。

 

wave.h

<wave.h>定义了波形输出相关函数。引脚4~7可用于波形输出。

WAVE_COUNT:宏常量,波形输出引脚个数。

wave_t:枚举类型,表示波形输出引脚。

  • WAVE_NULL:表示空引脚,当作为参数时,函数不进行任何操作;

  • WAVE_xx0~3,分别表示一个引脚。

void wave_init():初始化波形输出(实际上什么都没有做,可以不调用)。

wave_mode_t:枚举类型,表示波形输出模式。

  • WAVE_MODE_OFF:关闭波形输出;

  • WAVE_MODE_PWM:PWM输出;

  • WAVE_MODE_TONE:方波输出。

void wave_mode(wave_t _channel, wate_mode_t _mode):将_channel波形输出通道设置为_mode模式。

 

pwm.h

<pwm.h>定义了输出PWM波形的函数。

pwm_init():初始化PWM(实际上什么都没有做,可以不调用)。

pwm_set(wave_t _channel, uint8_t _value):将_channel通道的占空比设置为_value(必须先调用wave_mode)。

 

tone.h

<tone.h>定义了输出方波的函数。

void tone_init():初始化方波输出(实际上什么都没有做,可以不调用)。

void tone_set(wave_t _channel, uint16_t _freq):使_channel通道输出频率为_freq的方波;若_freq为零,不输出(必须先调用wave_mode)。

 

adc.h

<adc.h>提供了使用ADC组件的函数。

ADC_COUNT:ADC引脚个数。引脚0~3可用于ADC。

adc_t:表示ADC引脚。

  • ADC_NULL:表示无ADC输入,当作为参数时,函数返回0;

  • ADC_xx03,表示ADC引脚。

void adc_init():初始化ADC。

uint8_t adc_read(adc_t _channel):从_channel引脚读取8位ADC值。

uint16_t adc_read_10bit(adc_t _channel):从_channel引脚读取10位ADC值。

uint8_t adc_read_fast(adc_t _channel):从_channel引脚读取8位ADC值。只能连续读取单一通道,并且前几次的返回值不准。

adc_ref_t:表示ADC参考电压。

  • ADC_REF_AREF:AREF端口;

  • ADC_REF_AVCC:5V电源电压;

  • ADC_REF_1V1:内部1.1V参考电压;

  • ADC_REF_2V56:内部2.56V参考电压。

void adc_reference(adc_ref_t _ref):设定ADC参考电压。

 

button.h

<button.h>定义了读取板载按键状态的函数。

BUTTON_COUNT:宏常量,按键个数。

button_t:枚举类型,表示按键。

BUTTON_xx0~3,表示按键。

pin_t button_pin[BUTTON_COUNT]:存储按键所连接的引脚。

void button_init(pin_t _button2, pin_t _button3)_button2_button3分别为按键2和3连接的引脚,可以为PIN_NULL。初始化按键操作。

bool button_down(button_t _which):返回_which按键是否被按下(调用时状态)。

bool button_pressed(button_t _which):返回从上一次对_which调用开始,该按键是否被按下(只管两次调用时的状态,无法检测中间过程)。

 

switch.h

<switch.h>定义了读取板载拨动开关状态的函数。

SWITCH_COUNT:宏常量,开关个数。

switch_t:枚举类型,表示开关。

SWITCH_xx0~3,表示开关。

pin_t switch_pin[SWITCH_COUNT]:存储开关所连接的引脚。

void switch_init(pin_t _switch2, pin_t _switch3)_switch2_switch3分别为开关2和3连接的引脚,可以为PIN_NULL。初始化开关操作。

bool switch_status(switch_t _which):返回_which开关的状态。

bool switch_changed(switch_t _which):返回从上一次对_which调用开始,该开关状态是否被改变(只管两次调用时的状态,无法检测中间过程)。

 

rotary.h

<rotary.h>提供了使用板载旋转编码器所需的函数。

rotary_event_t:旋转编码器事件枚举类型。

  • ROTARY_NONE:未旋转;

  • ROTARY_CW:顺时针旋转;

  • ROTARY_ACW:逆时针旋转。

pin_t rotary_pin[]:旋转编码器A、B端的引脚。

void rotary_init(pin_t _pina, pin_t _pinb):初始化旋转编码器。

uint8_t rotary_status():最低位为A端电平,次低位为B端电平。

rotary_event_t rotary_rotated():两次调用之间编码器是否被旋转。

 

pot.h

<pot.h>提供了使用板载电位器所需的函数。

void pot_init(adc_t _pin):初始化电位器。

uint8_t pot_read():读取电位器位置(8位无符号整数)。

 

ldr.h

<ldr.h>提供了使用板载光敏电阻所需的函数。

void ldr_init(adc_t _pin):初始化光敏电阻。

uint8_t ldr_read():读取分压值(8位无符号整数,与光强正相关)。

 

led.h

<led.h>定义了板载LED操作的函数。

LED_COUNT:宏常量,LED的个数。

void led_init():初始化LED。

led_t:枚举类型,表示LED。

  • LED_RED:表示红色LED;

  • LED_YELLOW:表示黄色LED;

  • LED_GREEN:表示绿色LED;

  • LED_BLUE:表示蓝色LED。

2个表示LED状态的宏:

  • LED_OFF:宏常量,表示LED不亮;

  • LED_ON:宏常量,表示LED亮。

void led_set(led_t _which, bool _on)_on应为bool量或上述表示LED状态的宏(推荐前者),将_which设为_on的状态。

void led_flip(led_t _which):将_which的状态翻转。

void led_on():点亮所有LED。

void led_off():关闭所有LED。

 

rgbw.h

<rgbw.h>定义了驱动板载RGBW LED的函数。

RGBW_COUNT:宏常量,RGBW LED的独立颜色数。

rgbw_t:枚举类型,表示RGBW的颜色。

  • RGBW_RED:表示红色LED;

  • RGBW_GREEN:表示绿色LED;

  • RGBW_BLUE:表示蓝色LED;

  • RGBW_WHITE:表示白色LED。

rgbw_pinpin_t类型数组,存储RGBW LED的颜色对应的引脚。

void rgbw_init(pin_t _r, pin_t _g, pin_t _b, pin_t _w):初始化RGBW LED,4个参数分别为红、绿、蓝、白LED的引脚。

void rgbw_set(rgbw_t _which, uint8_t _value)_value为亮度值。对于4~7号引脚,_value为亮度;对于其他引脚,_value>=128则LED亮。

RGBW_COLOR(r, g, b, w):宏函数,接受4个0~3的数(取二进制最低两位),生成一个表示颜色的数。

void rgbw_color(uint8_t _color)_color应为RGBW_COLOR生成的数,使RGBW LED显示相应的颜色。

void rgbw_off():关闭RGBW LED。

 

segment.h

<segment.h>定义了设置数码管显示数据与控制显示的函数。

数码管与LCD屏不能同时使用。

SEGMENT_DIGIT_COUNT:宏常量,数码管位数

segment_t:枚举类型,表示数码管的位。

  • SEGMENT_DIGIT_L:左边的位

  • SEGMENT_DIGIT_R:右边的位

pin_t segment_pin[SEGMENT_DIGIT_COUNT]:存储数码管负极连接的引脚。

void segment_init(pin_t _digit0, pin_t _digit1)_digit0_digit1分别为数码管左右两位负极连接的引脚,可以为PIN_NULL。初始化数码管操作。

extern const uint8_t segment_digit[16]:09、AF的段码。

extern const uint8_t segment_dot:小数点的段码。与segment_digit中的元素位或的结果表示带小数点的数字段码。

以下函数只设置显示数据,不控制显示,返回值均为是否设置成功:

bool segment_raw(uint8_t _digit0, uint8_t _digit1):左位显示段码_digit0,右位显示段码_digit1

bool segment_hex(uint8_t _value):按十六进制显示_value

bool segment_dec(uint16_t _value):按十进制显示_value。如果是三位数,将四舍五入保留到十位,显示百位和十位,显示右位小数点。

bool segment_frac(uint16_t _int, uint8_t _dec)_int为整数部分,_dec为十分位。如果_dec大于等于10,返回false。如果_int是一位数,显示_int._dec;否则按segment_dec显示,未显示出的位会四舍五入。

以下函数根据数据控制显示:

void segment_display(segment_t _digit):根据当前的数据显示_digit位,可用于动态扫描。

void segment_off():关闭数码管,不显示任何位。

void segment_auto():使用定时器2中断,自动进行动态扫描。当使用自动动态扫描时,6和7两引脚不能用于输出方波。

 

lcd.h

<lcd.h>提供了控制LCD1602显示屏的函数。显示屏从第一行开始显示,一行满自动换行,超过显示区域自动将所有内容上移一行。

LCD屏与数码管不能同时使用。

void lcd_init(pin_t _exout7):初始化LCD,需要将Ext Out 7连接到一个引脚上。

void lcd_clear():清屏。

void lcd_set_status(bool _on, bool _cursor, bool _blink):设置LCD开关、光标开关、光标模式(默认LCD开,光标开,闪烁),可用宏:

  • LCD_OFF:LCD关;

  • LCD_ON:LCD开。

  • LCD_CURSOR_OFF:光标关;

  • LCD_CURSOR_ON:光标开。

  • LCD_CURSOR_STEADY:光标常亮;

  • LCD_CURSOR_BLINK:光标闪烁。

void lcd_print_char(char _c):打印一个字符。'\t'对齐到4格,'\n'换行(显示内容不上移,直到下次打印),'\r'回到行首。

void lcd_print_string(const char* _s):打印字符串。

void lcd_print_int(ptrdiff_t _i):以十进制打印数字,带符号。

void lcd_print_hex(size_t _i):以十六进制打印数字,不包含0x。

void lcd_print_line():换行(如果光标位于第二行,显示内容上移)。

lcd_align_t:LCD打印对齐方式类型

  • LCD_ALIGN_OFF:取消对齐;

  • LCD_ALIGN_LEFT:左对齐;

  • LCD_ALIGN_RIGHT:右对齐。

void lcd_set_align(lcd_align_t _dir, uint8_t _len, char _fill):设置对齐方式、对齐长度、填充字符。

 

buzzer.h

<buzzer.h>提供了控制板载蜂鸣器的函数。

BUZZER_COUNT:蜂鸣器引脚数量。

wave_t buzzer_pin[]:蜂鸣器连接引脚。

void buzzer_init(wave_t _pos, wave_t _neg):初始化蜂鸣器。

void buzzer_tone(uint16_t _freq0, uint16_t _freq1):播放两个频率的声音,0表示关闭。

void buzzer_off():蜂鸣器静音。

 

uart.h

<uart.h>提供了UART读写函数。发送与接受都没有缓冲区。

uart_mode_t:UART工作模式类型

  • UART_TX:发送;

  • UART_RX:接受;

  • UART_DUPLEX:双工。

void uart_init(uart_mode_t _mode):初始化UART,波特率38400,8数据位,偶校验,1停止位。

void uart_print_char(char _c):打印字符。

void uart_print_string(const char* _s):打印字符串。

void uart_print_int(ptrdiff_t _i):以十进制打印数字,带符号。

void uart_print_hex(size_t _i):以十六进制打印数字,不包含0x。

void uart_print_line():输出'\n'

uart_align_tUART_ALIGN_OFFUART_ALIGN_LEFTUART_ALIGN_RIGHTvoid uart_set_align(uart_align_t _dir, uint8_t _len, char _fill):与LCD中的对齐相同。

char uart_scan_char():读取字符。

uint8_t uart_scan_string(char* _dst):读取字符串,直至空白字符。
uint8_t uart_scan_string_n(char* _dst, uint8_t _count):读取字符串,至多_count字节(不包括终止符'\0')。

ptrdiff_t uart_scan_int():读取一个整数,可接受十进制数、0b开头的二进制数、0x开头的十六进制数(大小写均可)。

posted on 2019-12-18 20:13  Jerry_SJTU  阅读(912)  评论(1编辑  收藏  举报