📄 lighttalk2.h
字号:
#ifndef _LIGHT_TALK_2_H_
#define _LIGHT_TALK_2_H_
#include <avr/io.h>
/*******LEDs Ports*************************************/
# define LEDS0
# define LEDS1
#define LED_EVEN PORTB
#define LED_ODD PORTD
#define LEDS0VAL LED_EVEN
#define LEDS1VAL LED_ODD
#define LEDS0DDR DDRB
#define LEDS1DDR DDRD
//# define LEDS0ADDR 0x36
//# define LEDS1ADDR 0x30
enum addrPIN {LEDS1ADDR = 0x30,LEDS0ADDR = 0x36};
#define LEDS0PIN PINB
#define LEDS1PIN PIND
/* iom8.h PIND -> 0x16,PIND -> 0x 10 */
#define _onLeds(x) x=0x00;
#define _offLeds(x) x=0xff;
/*******Control Ports********************************/
#define CTRLPORT PORTC
#define CTRLDDR DDRC
#define CTRLPIN PINC
#define LEDS1CTRL PC5
#define LEDS0CTRL PC4
#define LOOPCTRL PC3
//# define SUART_TXD PC1
#define STARTKEY PC2
#define _select(x) CTRLPORT |= ( 1 << x ## CTRL )
#define _ledCtrl(x) CTRLPORT &= ~( 1 << x ## CTRL )
#define _rdKey(x) (CTRLPIN & (1 << x))
#define _ledsCathode_OutEN(x) x ## DDR = 0xff;
#define _ledsCathode_InEN(x) x ## DDR = 0x00;
#define _ledsCathode_Pulled(x) x ## VAL = 0xff;
#define _ledsCathode_High(x) x ## VAL = 0xff;
#define _ledsCathode_Low(x) x ## VAL = 0x00;
#define _ledsCathode_ReadIO_Hi_Z(x) x ## DDR = 0x00;x ## VAL = 0x00;
#define _ledsCathode_ChangeToOutputLow(x) x ## VAL = 0x00;x ## DDR = 0xff;
#define _ledsCathode_ChangeToOutputHig(x) x ## VAL = 0xff;x ## DDR = 0xff;
#define _ledsCathode_Read(x) (x ## PIN);
#define _ledsCathode_Pin(x) _SFR_IO8(x);
/* 保证输入输出切换时不输出错误电平,详见手册 */
#define _ledsAnode_High(x) CTRLPORT &= ~( 1 << x ## CTRL )
#define _ledsAnode_Low(x) CTRLPORT |= ( 1 << x ## CTRL )
#define _leftShift(x,y) (x << y)
#define _ledC
/******Timer 0 ***********************************/
#define _runTimer0_TimeUS(x) do{ \
TCNT0 = (256-x);/* 计时初始值 */\
TIMSK &= ~_BV(TOIE0);\
/* CS2:0=010 八分频,TCNT0 = 1 -> 1us*/\
/* 并开始计时 */\
TCCR0 |= _BV(CS01);\
}while(0)
#define _waitTimer0OV() do{loop_until_bit_is_set(TIFR,TOV0);\
/*写入逻辑1 清零TOV0 位*/\
TIFR|=_BV(TOV0);\
}while(0)
#define _whileTimer0OV(x) while( bit_is_clear(TIFR,TOV0)); \
TIFR |= (1 << TOV0)
#define _breakTimer0OV() { \
if( bit_is_set(TIFR,TOV0) ) \
{ TIFR |= (1 << TOV0); \
break; \
} \
}
#define _stopTimer0() TCCR0 &= ~(_BV(CS02)|_BV(CS01)|_BV(CS00))
/*******Timer1******************************************/
/* CS1(2:1)=011;64分频,TCNT基数125->1ms--->计时长度 524.228
*
*/
#define _runTimer1CTC(x) do{ \
unsigned char sreg; \
/* 保存全局中断标志 */ \
sreg = SREG; \
/* 禁用中断 */ \
cli(); \
/* 设置TCNT1,OCR1A; 64,125基,单位1ms*/\
TCNT1 = 0; \
OCR1A = x; \
TCCR1A = 0; \
TCCR1B = _BV(WGM12); \
/* 恢复全局中断标志*/ \
SREG = sreg; \
TIMSK = _BV(OCIE1A); \
TCCR1B |= _BV(CS11)|_BV(CS10);\
}while(0)
#define _rdTCNT1to(x) do{ \
unsigned char sreg; \
/* 保存全局中断标志*/ \
sreg = SREG; \
/* 禁用中断*/ \
cli(); \
/* 将TCNT1 读入i */ \
x = TCNT1; \
/* 恢复全局中断标志*/ \
SREG = sreg; \
}while(0)
#define _unTimer1CTC() TIMSK &= ~_BV(OCIE1A)
#define _runTimer1_TimeMS(x) do{ \
unsigned char sreg; \
/* 保存全局中断标志 */ \
sreg = SREG; \
/* 禁用中断 */ \
cli(); \
/* 设置TCNT1 到i 64,125基,单位1ms*/\
TCNT1 = 65536-(unsigned int)x * 125; \
/* 恢复全局中断标志*/ \
SREG = sreg; \
TIMSK &= ~_BV(TOIE1); \
TCCR1B |= _BV(CS11)|_BV(CS10);\
}while(0)
#define _waitTimer1OV() do{ \
loop_until_bit_is_set(TIFR,TOV1); \
/*写入逻辑1 清零TOV0 位*/ \
TIFR|=_BV(TOV1); \
}while(0)
#define _stopTimer1() TCCR1B &= ~(_BV(CS12)|_BV(CS11)|_BV(CS10))
/*
***************************************************************
* 软件发送硬件计时方式实现
*
*/
#define SUART_TXD PC1
#define SUART_PORT PORTC
/*
1bit=1/9600s=104us
*/
#define SUART_DPS 104
#define _suartBit0() (SUART_PORT &= ~(1<<SUART_TXD))
#define _suartBit1() (SUART_PORT |= (1<<SUART_TXD))
/******fuctions***********************************/
typedef struct{
char low;
char high;
}CHAR2INT;
typedef union{
unsigned char i8[2];
unsigned int i16;
}INT2CHAR;
void ledsTurnOn(INT2CHAR witch);
void iniLeds();
void ledsSelect(char sel);
INT2CHAR valUnPack(unsigned int val);
unsigned int valPack(INT2CHAR val);
void suart_Byte(unsigned char input);
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -