📄 globdefs.inc
字号:
;+--------------------------------------------------------------+---+
;| BY JO肙 DARTAGNAN ANTUNES OLIVEIRA |
;| |
;| ESTAS ROTINAS FORAM DESENVOLVIDAS A M蒁IDAS QUE FORAM SENDO |
;| NECESSITADAS DURANTE AO LONGO DE ALGUNS ANOS. ELAS S肙 DE USO |
;| LIVRE E QUAISQUER ALTERA钦ES SER肙 PERMITIDAS, DESDE QUE O NOME |
;| DO AUTOR FIGURE NO IN虲IO DE CADA PROGRAMA E QUE CASO, O USO DELAS|
;| PROVOQUE MAL FUNCIONAMENTO, OU PREJU蚙O A TERCEIROS O AUTOR FICA |
;| LIVRE DESTAS. TODAS AS ROTINAS FORAM TESTADAS E EST肙 EM USO EM |
;| SISTEMAS ONDE NENHUM PROBLEMA FOI RELATADO, TODAS FORAM FEITAS DA|
;| FORMA MAIS PR覺IMA DA PROGRAMA敲O ORIENTADA A OBJETO (OOP) SEM A |
;| IMPLEMENTA敲O DE INSTANCIAMENTO |
;| |
;| QUAISQUER D赩IDAS MEU EMAIL E: dartagnanmath@hotmail.com |
;| A MEDIDA DO POSS蚔EL RESPONDEREI A TODOS OS EMAILS. |
;+------------------------------------------------------------------+
;| |
;| THIS ROUTINES THEY WERE DEVELOPED AT SAME TIME THAT WERE |
;| NEEDED ALONG OF SOME YEARS. THEY ARE FOR USE FREE AND ANY |
;| ALTERATIONS WILL BE PERMITED SINCE THAT AUTHOR NAME APPEAR AT |
;| BEGINNER OF EACH PROGRAM, AND IF INCORRECT USE PRODUCE |
;| MALFUNCIONS OR DAMAGE TO THIRD PARTIES THE AUTHOR STAY FREE. |
;| ALL ROTINES WERE TESTED AND STILL IN USE AT MANY SYSTEM AND NO |
;| PROBLEM WERE RELATED. ALL ROTINES WERE MAKED AT CLOSED "ORIENTED |
;| OBJECT PROGRAMING" (OOP) WITHOUT INSTANCE IMPLEMENTATIONS: |
;| |
;| ANY QUESTIONS MY EMAIL IS dartagnanmath@hotmail.com |
;| SOON AS POSSIBLE AS ANSWER ALL EMAILS |
;+--------------------------------------------------------------+---+
;+------------------------------------------------------+
;| BY JO肙 DARTAGNAN ANTUNES OLIVEIRA |
;| DATA: 10/04/2000 |
;>------------------------------------------------------<
;| G L O B A L D E F I N I T I O N F I L E |
;+------------------------------------------------------+
#ifndef __GLOBAL_DEFINITIONS__
#define __GLOBAL_DEFINITIONS__
.message "+--------------------+"
.message "| |"
.message "| GLOBAL DEFINITIONS |"
.message "| |"
.message "+--------------------+"
;+------------------------------------------------------+
;| R E G I S T E R S D E F I N I T I O N S |
;+------------------------------------------------------+
.DEF Acc = r24 ;my Works registers
.DEF AccH = r25
.DEF AccT = r16
.DEF AccTH = r17
.DEF Temp = r18 ;My temp registers
.DEF TempH = r19
;+------------------------------------------------------+
;| C O N S T A N T S D E F I N I T I O N S |
;+------------------------------------------------------+
.EQU _ON = 0XFF
.EQU _OFF = 0X00
.EQU _EVEN = 0X00
.EQU _ODD = 0XFF
.EQU _NONE = 0X00
.EQU _LEFT = 0X01
.EQU _RIGHT = 0X02
.EQU _UP = 0X03
.EQU _DOWN = 0X04
.EQU _PRESSED = 0X05
.EQU _RELEASED = 0X06
.EQU _TIMEOUT = 0X07
.EQU _YES = 0XFF
.EQU _NO = 0X00
.EQU _OK = 0XFF
.EQU _NOTOK = 0X00
;+------------------------------------------------------+
;| ASCII CODES |
;+------------------------------------------------------+
.EQU _NULLCHAR = 0X00 ;Null Char
.EQU _BS = 0X08 ;Back space
.EQU _TAB = 0X09 ;Tab
.EQU _CR = 0X0D ;Carriage Return
.EQU _LF = 0X0A ;Line Feed
.EQU _NC = 0XFF ;null char(special use)
.EQU _ASCII_NUL = 0X00 ;Null
.EQU _ASCII_SOH = 0X01 ; (start of heading)
.EQU _ASCII_STX = 0X02 ; (start of text)
.EQU _ASCII_ETX = 0X03 ; (end of text)
.EQU _ASCII_EOT = 0X04 ; (end of transmission) - Not the same as ETB
.EQU _ASCII_ENQ = 0X05 ; (enquiry)
.EQU _ASCII_ACK = 0X06 ; (acknowledge)
.EQU _ASCII_BEL = 0X07 ; (bell) - Caused teletype machines to ring a bell. Causes a beep
.EQU _ASCII_BS = 0X08 ; (backspace) - Moves the cursor (or print head) move backwards (left)
.EQU _ASCII_TAB = 0X09 ; (horizontal tab) - Moves the cursor (or print head) right to the next
.EQU _ASCII_LF = 0X0A ; (NL line feed, new line) - Moves the cursor (or print head) to a new
.EQU _ASCII_VT = 0X0B ; (vertical tab)
.EQU _ASCII_FF = 0X0C ; (form feed) - Advances paper to the top of the next page (if the
.EQU _ASCII_CR = 0X0D ; (carriage return) - Moves the cursor all the way to the left, but does
.EQU _ASCII_SO = 0X0E ; (shift out) - Switches output device to alternate character set.
.EQU _ASCII_SI = 0X0F ; (shift in) - Switches output device back to default character set.
.EQU _ASCII_DLE = 0X10 ; (data link escape)
.EQU _ASCII_DC1 = 0X11 ; (device control 1)
.EQU _ASCII_DC2 = 0X12 ; (device control 2)
.EQU _ASCII_DC3 = 0X13 ; (device control 3)
.EQU _ASCII_DC4 = 0X14 ; (device control 4)
.EQU _ASCII_NAK = 0X15 ; (negative acknowledge)
.EQU _ASCII_SYN = 0X16 ; (synchronous idle)
.EQU _ASCII_ETB = 0X17 ; (end of transmission block) - Not the same as EOT
.EQU _ASCII_CAN = 0X18 ; (cancel)
.EQU _ASCII_EM = 0X19 ; (end of medium)
.EQU _ASCII_SUB = 0X1A ; (substitute)
.EQU _ASCII_ESC = 0X1B ; (escape)
.EQU _ASCII_FS = 0X1C ; (file separator)
.EQU _ASCII_GS = 0X1D ; (group separator)
.EQU _ASCII_RS = 0X1E ; (record separator)
.EQU _ASCII_US = 0X1F ; (unit separator)
.EQU _ASCII_SPACE = 0X20
.EQU _ASCII_SP = _ASCII_SPACE
.EQU _ASCII_DEL = 0X7F
;+------------------------------------------------------+
;| MATH DEFINITIONS |
;+------------------------------------------------------+
.EQU _LONG = 4 ;size of long
.EQU _INTEGER = 2 ;size of integer
.EQU _WORD = 2 ;size of word
.EQU _BYTE = 1 ;size of byte
;+------------------------------------------------------+
;| CHARACTER DISPLAY DEFINITIONS CHIP HD44780 |
;+------------------------------------------------------+
.EQU _DISP_LINE_1 = 0 ;1 LINE
.EQU _DISP_LINE_2 = 1 ;2 LINE
.EQU _DISP_FONT_5X8 = 0 ;5X8 FONT SIZE
.EQU _DISP_FONT_5X10 = 1 ;5X10 FONT SIZE
.EQU _DISP_4BITS = 0 ;4 bits interface definitions
.EQU _DISP_8BITS = 1 ;8 bits interface definitions
;+----------------------------------------
;| WAVE DEFINITIONS
;+----------------------------------------
.EQU _WAVE_DAC_8 = 8 ;8 bits wave dac
.EQU _WAVE_DAC_16 = 16 ;16 bits wave dac
.EQU _WAVE_DAC_24 = 24 ;24 bits wave dac
.EQU _WAVE_DAC_32 = 32 ;32 bits wave dac
.EQU _WAVE_FS_5500 = 5500 ;5500 sample/second
.EQU _WAVE_FS_6000 = 6000 ;6000 sample/second
.EQU _WAVE_FS_8000 = 8000 ;8000 sample/second
.EQU _WAVE_FS_11025 = 11050 ;11050 sample/second
.EQU _WAVE_FS_22050 = 22050 ;22050 sample/second
.EQU _WAVE_FS_32000 = 32000 ;32000 sample/second
.EQU _WAVE_FS_44100 = 44100 ;44100 sample/second
.EQU _WAVE_SOURCE_FLASH = 1 ;wave into avr flash
.EQU _WAVE_SOURCE_SRAM = 2 ;wave into avr sram
.EQU _WAVE_SOURCE_DEVICE = 3 ;wave into device
.EQU _WAVE_STATUS_PLAYING = 1 ;wave status playing
.EQU _WAVE_STATUS_STOPED = 2 ;wave status stoped
.EQU _WAVE_STATUS_END = 3 ;wave status end
;+------------------------------------------------------+
;| S R A M B O O T T Y P E |
;+------------------------------------------------------+
.EQU _SRAM_NOT_CLEAR = 0 ;NO CLEAR SRAM DURING BOOT
.EQU _SRAM_CLEAR = 1 ;CLEAR SRAM DURING BOOT
;+------------------------------------------------------+
;| T I M E R S D E F I N I T I O N S |
;+------------------------------------------------------+
.EQU _TIMER_STOP = 0B00000000 ;timer stop
.EQU _TIMER_DIV_1 = 0B00000001 ;timer divisor factor by 1
.EQU _TIMER_DIV_8 = 0B00000010 ;timer divisor factor by 8
.EQU _TIMER_DIV_64 = 0B00000011 ;timer divisor factor by 64
.EQU _TIMER_DIV_256 = 0B00000100 ;timer divisor factor by 256
.EQU _TIMER_DIV_1024 = 0B00000101 ;timer divisor factor by 1024
.EQU _TIMER_FALL = 0B00000110 ;timer Fall
.EQU _TIMER_RISE = 0B00000111 ;timer Rise
;+----------------------------------------
;| PRESCALER FACTOR FOR TIMER 0 ATMEGA128
;+----------------------------------------
.EQU _TIMERM0_STOP = 0B00000000 ;timer stop
.EQU _TIMERM0_DIV_1 = 0B00000001 ;timer divisor factor by 1
.EQU _TIMERM0_DIV_8 = 0B00000010 ;timer divisor factor by 8
.EQU _TIMERM0_DIV_32 = 0B00000011 ;timer divisor factor by 32
.EQU _TIMERM0_DIV_64 = 0B00000100 ;timer divisor factor by 64
.EQU _TIMERM0_DIV_128 = 0B00000101 ;timer divisor factor by 64
.EQU _TIMERM0_DIV_256 = 0B00000110 ;timer divisor factor by 256
.EQU _TIMERM0_DIV_1024= 0B00000111 ;timer divisor factor by 1024
;+----------------------------------------
;| PRESCALER FACTOR FOR TIMER 2 ATMEGA128
;+----------------------------------------
.EQU _TIMERM2_STOP = 0B00000000 ;timer stop
.EQU _TIMERM2_DIV_1 = 0B00000001 ;timer divisor factor by 1
.EQU _TIMERM2_DIV_8 = 0B00000010 ;timer divisor factor by 8
.EQU _TIMERM2_DIV_32 = 0B00000011 ;timer divisor factor by 32
.EQU _TIMERM2_DIV_256 = 0B00000100 ;timer divisor factor by 256
.EQU _TIMERM2_DIV_1024= 0B00000101 ;timer divisor factor by 1024
.EQU _TIMERM2_FALL = 0B00000110 ;timer fall
.EQU _TIMERM2_RISE = 0B00000111 ;timer rise
;+----------------------------------------
;| PRESCALER FACTOR FOR TIMER 13 ATMEGA128
;+----------------------------------------
.EQU _TIMERM13_STOP = 0B00000000 ;timer stop
.EQU _TIMERM13_DIV_1 = 0B00000001 ;timer divisor factor by 1
.EQU _TIMERM13_DIV_8 = 0B00000010 ;timer divisor factor by 8
.EQU _TIMERM13_DIV_64 = 0B00000011 ;timer divisor factor by 64
.EQU _TIMERM13_DIV_256 = 0B00000100 ;timer divisor factor by 256
.EQU _TIMERM13_DIV_1024= 0B00000101 ;timer divisor factor by 1024
.EQU _TIMERM13_FALL = 0B00000110 ;timer FALL
.EQU _TIMERM13_RISE = 0B00000111 ;timer RISE
;+----------------------------------------
;| PRESCALER FACTOR ADC ATMEGA128
;+----------------------------------------
.EQU _TIMERMADC_DIV_2 = 0B00000001 ;timer divisor factor by 2
.EQU _TIMERMADC_DIV_4 = 0B00000010 ;timer divisor factor by 4
.EQU _TIMERMADC_DIV_8 = 0B00000011 ;timer divisor factor by 8
.EQU _TIMERMADC_DIV_16 = 0B00000100 ;timer divisor factor by 16
.EQU _TIMERMADC_DIV_32 = 0B00000101 ;timer divisor factor by 32
.EQU _TIMERMADC_DIV_64 = 0B00000110 ;timer divisor factor by 64
.EQU _TIMERMADC_DIV_128 = 0B00000111 ;timer divisor factor by 128
;+----------------------------------------
;| INTERRUPT SENSING TYPE
;+----------------------------------------
.EQU _LOW_LEVEL = 0
.EQU _FALLING_EDGE = 2
.EQU _RISING_EDGE = 3
;+----------------------------------------
;| TIMERS
;+----------------------------------------
.EQU _TIMER_0 = 0
.EQU _TIMER_1 = 1
.EQU _TIMER_2 = 2
.EQU _TIMER_3 = 3
;+----------------------------------------
;| INTERRUPT SOURCE
;+----------------------------------------
.EQU _EXTERNAL_0 = 0
.EQU _EXTERNAL_1 = 1
.EQU _EXTERNAL_2 = 2
.EQU _EXTERNAL_3 = 3
.EQU _EXTERNAL_4 = 4
.EQU _EXTERNAL_5 = 5
.EQU _EXTERNAL_6 = 6
.EQU _EXTERNAL_7 = 7
;+----------------------------------------
;| COMM PORTS DEFINITIONS
;+----------------------------------------
.EQU COMM0 = 0
.EQU COMM1 = 1
.EQU COMM2 = 2
.EQU COMM3 = 3
;+------------------------------------------------------+
;| M A C R O D E F I N I T I O N S |
;+------------------------------------------------------+
; +---------------------+
; | P W M M A C R O S |
; +---------------------+
; /
;|
;| @0 - PWM Prescaler factor
;| Destroy - Acc
;| Obs:
;| _PWM_XB_INIT Function Always program PWM output in normal mode
;| call _PWM_OUT_INVERTED macro to invert it when needed
; ----------------
;| INIT 8 BIT PWM |
; ----------------
.MACRO _PWM_8B_INIT
in Acc,SREG ;Save SREG state
cli
push Acc
in Acc,TCCR1B ;Get actual value
andi Acc,0b11111000 ;Mask unused bits
ori Acc,@0 ;set prescaler factor
out TCCR1B,Acc
ldi Acc,(0<<PWM11) | (1<<PWM10) | (1<<COM1A1) | (0<<COM1A0) ;Normal PWM output 8 bits
out TCCR1A,Acc ;program
pop Acc
out SREG,Acc ;restore SREG state
.ENDMACRO
; ----------------
;| INIT 9 BIT PWM |
; ----------------
.MACRO _PWM_9B_INIT
in Acc,SREG ;Save SREG state
cli
push Acc
in Acc,TCCR1B ;Get actual value
andi Acc,0b11111000 ;Mask unused bits
ori Acc,@0 ;set prescaler factor
out TCCR1B,Acc
ldi Acc,(1<<PWM11) | (0<<PWM10) | (1<<COM1A1) | (0<<COM1A0) ;Normal PWM output 9 bits
out TCCR1A,Acc ;program
pop Acc
out SREG,Acc ;restore SREG state
.ENDMACRO
; -----------------
;| INIT 10 BIT PWM |
; -----------------
.MACRO _PWM_10B_INIT
in Acc,SREG ;Save SREG state
cli
push Acc
in Acc,TCCR1B ;Get actual value
andi Acc,0b11111000 ;Mask unused bits
ori Acc,@0 ;set prescaler factor
out TCCR1B,Acc
ldi Acc,(1<<PWM11) | (1<<PWM10) | (1<<COM1A1) | (0<<COM1A0) ;Normal PWM output 10 bits
out TCCR1A,Acc ;program
pop Acc
out SREG,Acc ;restore SREG state
.ENDMACRO
; --------------------------
;| SET PWM OUTPUT AS NORMAL |
; --------------------------
.MACRO _PWM_OUT_NORMAL
in Acc,SREG ;Save SREG state
cli
push Acc
in Acc,TCCR1A
andi Acc,0b00111111 ;Mask unused bits
ori Acc,(1<<COM1A1) | (0<<COM1A0) ;Normal output programed
out TCCR1A,Acc ;program
pop Acc
out SREG,Acc ;restore SREG state
.ENDMACRO
; ----------------------------
;| SET PWM OUTPUT AS INVERTED |
; ----------------------------
.MACRO _PWM_OUT_INVERTED
in Acc,SREG ;Save SREG state
cli
push Acc
in Acc,TCCR1A
andi Acc,0b00111111 ;Mask unused bits
ori Acc,(1<<COM1A1) | (1<<COM1A0) ;Normal output programed
out TCCR1A,Acc ;program
pop Acc
out SREG,Acc ;restore SREG state
.ENDMACRO
; ----------------------------------
;| SEND VALUES INTO ACC:ACCH TO PWM |
; ----------------------------------
.MACRO _PWM_OUT
out OCR1AH,AccH ;Define PWM output value
out OCR1AL,Acc
.ENDMACRO
; ------------------------------
;| SEND IMEDIATE VALUES TO PWM |
;| @0 - Imetiate value input |
; ------------------------------
.MACRO _PWM_OUT_IMMEDIATE
push Acc
ldi Acc,high(@0)
out OCR1AH,Acc ;Define PWM output value
ldi Acc,low(@0)
out OCR1AL,Acc
pop Acc
.ENDMACRO
; +----------------------------+
; | T I M E R S M A C R O S |
; +----------------------------+
; /
;|
; ------------------------------
;| TIMER 0 INITIALIZATION |
;| @0 - Prescaler division |
;| @1 - Timer division |
;| obs: Enable timer 0 interrupt|
; ------------------------------
.MACRO _TIMER0_INIT ;Init timer 0 to count mode and enable
ldi Acc,@0 ;TCCR0=with prescaler factor
out TCCR0,Acc
ldi Acc,@1 ;TCNT0=with division factor
out TCNT0,Acc
.ENDMACRO
; +-----------------------------+
; | H A N D D L E M A C R O S |
; +-----------------------------+
; /
;|
;+-----------------------------------
;|SET HANDDLE ADDRESS ROUTINE
;|
;|EXAMPLE OF USE
;|
;| _SET_HANDDLE _HDC_OVF0_VECT,ADDRESS_ROUTINE ;Set timer overflow 0 to jump ADDRESS_ROUTINE label
;|
;+-----------------------------------
.MACRO _SET_HANDDLE
push AccT ;save AccT
in AccT,SREG ;save SREG state
cli ;disable interrupts
ldi Acc,low(@1) ;get handdle address
ldi AccH,high(@1)
sts @0+0,Acc ;set handdle
sts @0+1,AccH
out SREG,AccT ;restore SREG
pop AccT ;restore AccT
.ENDMACRO
;+-----------------------------------
;|SAVE HANDDLE ADDRESS INTO SRAM OR REGISTER
;|
;|EXAMPLE OF USE
;|
;| _SAVE_HANDDLE _HDC_OVF0_VECT,SRAM_SAVE_ADDRESS ;Set timer overflow 0 address into SRAM_SAVE_ADDRESS
;|
;+-----------------------------------
.MACRO _SAVE_HANDDLE
push AccT ;save AccT
in AccT,SREG ;save SREG state
cli ;disable interrupts
lds Acc,@0+0 ;get handdle address
lds AccH,@0+1
sts @1+0,Acc ;save handdle
sts @1+1,AccH
out SREG,AccT ;restore SREG
pop AccT ;restore AccT
.ENDMACRO
;+-----------------------------------
;|CALL HANDDLE ADDRESS INTO SRAM OR REGISTER
;|
;|EXAMPLE OF USE
;|
;| _CALL_HANDDLE SRAM_HANDDLE_ADDRESS ;call routine address SRAM_HANDDLE_ADDRESS
;|
;+-----------------------------------
.MACRO _CALL_HANDDLE
lds ZL,@0+0 ;get handdle address into sram
lds ZH,@0+1
icall ;call
.ENDMACRO
;+-----------------------------------
;|LOAD IMEDIATE POINTER REGISTERS
;+-----------------------------------
.MACRO LDIAW ;load ACC register with imediate value word
ldi Acc,low(@0)
ldi AccH,high(@0)
.ENDMACRO
.MACRO LDIAWT ;load ACCT register with imediate value word
ldi AccT,low(@0)
ldi AccTH,high(@0)
.ENDMACRO
.MACRO LDIAL ;load ACCT register with imediate value long
ldi Acc,low(lwrd(@0))
ldi AccH,high(lwrd(@0))
ldi AccT,low(hwrd(@0))
ldi AccTH,high(hwrd(@0))
.ENDMACRO
.MACRO LDIX ;load X register with imediate value
ldi XL,low(@0)
ldi XH,high(@0)
.ENDMACRO
.MACRO LDIY ;load Y register with imediate value
ldi YL,low(@0)
ldi YH,high(@0)
.ENDMACRO
.MACRO LDIZ ;load Z register with imediate value
ldi ZL,low(@0)
ldi ZH,high(@0)
.ENDMACRO
;+-----------------------------------
;| CLEAR REGISTER WORD
;+-----------------------------------
;
; clrw valid registers X,Y,Z
.MACRO clrw
clr @0L
clr @0H
.ENDMACRO
;+-----------------------------------
;| LOAD IMEDIATE REGISTER WORD INTO REGISTER PAIR
;+-----------------------------------
;
; ldiw Z,var valid registers X,Y,Z
.MACRO ldiw
ldi @0L,low(@1)
ldi @0H,high(@1)
.ENDMACRO
;+-----------------------------------
;| LOAD MEMORY WORD INTO AccH:Acc
;+-----------------------------------
;
; ldsaw mem
.MACRO ldsaw
lds Acc,@0
lds AccH,@0+1
.ENDMACRO
;+-----------------------------------
;| LOAD MEMORY WORD INTO AccH:Acc with index
;+-----------------------------------
;
; lddaw [X,Y,Z],offset
.MACRO lddaw
ldd Acc,@0+@1
ldd AccH,@0+@1+1
.ENDMACRO
;+-----------------------------------
;| LOAD MEMORY WORD INTO ACCTH:AccT
;+-----------------------------------
;
; ldsawt mem
.MACRO ldsawt
lds AccT,@0
lds AccTH,@0+1
.ENDMACRO
;+-----------------------------------
;| LOAD MEMORY WORD INTO ACCTH:AccT with index
;+-----------------------------------
;
; lddawt [X,Y,Z],index
.MACRO lddawt
ldd AccT,@0+@1
ldd AccTH,@0+@1+1
.ENDMACRO
;+-----------------------------------
;| LOAD MEMORY WORD INTO REGISTER PAIR
;+-----------------------------------
;
; ldsw Z,mem valid registers X,Y,Z
.MACRO ldsw
lds @0L,@1
lds @0H,@1+1
.ENDMACRO
;+-----------------------------------
;| LOAD MEMORY WORD INTO REGISTER PAIR indexed
;+-----------------------------------
;
; lddw Z,mem valid registers X,Y,Z,index
.MACRO lddw
ldd @0L,@1+@2
ldd @0H,@1+@2+1
.ENDMACRO
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -