Код: Выделить всё
LSR R17
ROR R16
LSR R17
ROR R16
LSL R16
ROL R17
LSL R16
ROL R17Код: Выделить всё
LSR R17
ROR R16
LSR R17
ROR R16
LSL R16
ROL R17
LSL R16
ROL R17Код: Выделить всё
| R17 | R16 | C
--------+----------+----------
| abcdefgh | ijklmnop | x
--------+----------+----------+---
LSR R17 | 0abcdefg | ijklmnop | h
ROR R16 | 0abcdefg | hijklmno | p
LSR R17 | 00abcdef | hijklmno | g
ROR R16 | 00abcdef | ghijklmn | o
| R17 | R16 | C
--------+----------+----------
| abcdefgh | ijklmnop | x
--------+----------+----------+---
LSL R16 | abcdefgh | jklmnop0 | i
ROL R17 | bcdefghi | jklmnop0 | p
LSL R16 | bcdefghi | klmnop00 | j
ROL R17 | cdefghij | klnmop00 | o
Код: Выделить всё
.equ DB4 = PORTC7
.equ DB5 = PORTВ6
.equ DB6 = PORTА0
.equ DB7 = PORTD3Код: Выделить всё
.equ DB7port = PORTC
.equ DB7pin = 3
.equ DB6port = PORTC
.equ DB6pin = 2
.equ DB5port = PORTC
.equ DB5pin = 1
.equ DB4port = PORTC
.equ DB4pin = 0
.equ RSport = PORTC
.equ RSpin = 5
.equ Eport = PORTC
.equ Epin = 4
.MACRO DATA ; Вызываем просто DATA TETRADA, предварительно положив в ТЕТРАДУ то, что нужно вывести.
lsr @0 ; Сдвигаем вправо, крайний вывалится в С
brcc Pusto1 ; Если С=0, то переходим по метке
sbi DB4port, DB4pin ; Иначе, выставляем бит в 1
rjmp Next1 ; Идем проверять следующий
Pusto1: cbi DB4port, DB4pin ; Выставляем бит в 0
Next1: lsr @0 ; Сдвигаем вправо, крайний вывалится в С
brcc Pusto2 ; Если С=0, то переходим по метке
sbi DB5port, DB5pin ; Иначе, выставляем бит в 1
rjmp Next2 ; Идем проверять следующий
Pusto2: cbi DB5port, DB5pin ; Выставляем бит в 0
Next2: lsr @0 ; Сдвигаем вправо, крайний вывалится в С
brcc Pusto3 ; Если С=0, то переходим по метке
sbi DB6port, DB6pin ; Иначе, выставляем бит в 1
rjmp Next3 ; Идем проверять следующий
Pusto3: cbi DB6port, DB6pin ; Выставляем бит в 0
Next3: lsr @0 ; Сдвигаем вправо, крайний вывалится в С
brcc Pusto4 ; Если С=0, то переходим по метке
sbi DB7port, DB7pin ; Иначе, выставляем бит в 1
rjmp Next1 ; Идем проверять следующий
Pusto4: cbi DB7port, DB7pin ; Выставляем бит в 0
.ENDMКод: Выделить всё
;Write nibble to LCD:
;Input: temp7..temp4 - data nibble
LCD_WN: bbrc temp,7,lwr7_0
Port_LCD_D7_1 ;D7 <- 1
rjmp lwr6
lwr7_0: Port_LCD_D7_0 ;D7 <- 0
lwr6: bbrc temp,6,lwr6_0
Port_LCD_D6_1 ;D6 <- 1
rjmp lwr5
lwr6_0: Port_LCD_D6_0 ;D6 <- 0
lwr5: bbrc temp,5,lwr5_0
Port_LCD_D5_1 ;D5 <- 1
rjmp lwr4
lwr5_0: Port_LCD_D5_0 ;D5 <- 0
lwr4: bbrc temp,4,lwr4_0
Port_LCD_D4_1 ;D4 <- 1
rjmp lwrend
lwr4_0: Port_LCD_D4_0 ;D4 <- 0
lwrend: Port_LCD_E_1 ;E <- 1
rcall Delay ;delay 2 uS
Port_LCD_E_0 ;E <- 0
ret
;***** Macros
.macro clbr ;clear bit in register
cbr @0,exp2(@1)
.endm
.macro stbr ;set bit in register
sbr @0,exp2(@1)
.endm
.macro bbrc ;branch if bit in register clear
sbrs @0,@1
rjmp @2
.endm
.macro bbrs ;branch if bit in register set
sbrc @0,@1
rjmp @2
.endm
.macro bbic ;branch if bit in I/O clear
sbis @0,@1
rjmp @2
.endm
.macro bbis ;branch if bit in I/O set
sbic @0,@1
rjmp @2
.endm
.macro addi ;add immediate
subi @0,-@1
.endm
.macro ldx ;load XL, XH with word
ldi XL,byte1(@0)
ldi XH,byte2(@0)
.endm
.macro ldy ;load YL, YH with word
ldi YL,byte1(@0)
ldi YH,byte2(@0)
.endm
.macro ldz ;load ZL, ZH with word
ldi ZL,byte1(@0)
ldi ZH,byte2(@0)
.endm
.macro table ;load Z pointer
ldi ZL,low (@0*2)
ldi ZH,high(@0*2)
.endm
.macro stdi ;store immediate indirect with displacement
ldi temp,@1
std @0,temp
.endm
.macro ldsx ;load XL, XH from memory
lds XL,@0+0
lds XH,@0+1
.endm
.macro ldsy ;load YL, YH from memory
lds YL,@0+0
lds YH,@0+1
.endm
.macro ldsz ;load ZL, ZH from memory
lds ZL,@0+0
lds ZH,@0+1
.endm
.macro stsx ;store XL, XH in memory
sts @0+0,XL
sts @0+1,XH
.endm
.macro stsy ;store YL, YH in memory
sts @0+0,YL
sts @0+1,YH
.endm
.macro stsz ;store ZL, ZH in memory
sts @0+0,ZL
sts @0+1,ZH
.endm
Код: Выделить всё
;
Port С:
.equ DIRC = 0b11111111 ;Port C direction
.equ PUPC = 0b11111111 ;Port C pull-ups
.equ LCD_D6 = PC1 ;LCD D6 data line
.equ LCD_D7 = PC3 ;LCD D7 data line
.macro Port_LCD_D6_0 ;LCD_D6 = 0
cbi PORTC,LCD_D6
.endm
.macro Port_LCD_D6_1 ;LCD_D6 = 1
sbi PORTC,LCD_D6
.endm
.macro Port_LCD_D7_0 ;LCD_D7 = 0
cbi PORTC,LCD_D7
.endm
.macro Port_LCD_D7_1 ;LCD_D7 = 1
sbi PORTC,LCD_D7
.endm
Port D:
.equ DIRD = 0b11111110 ;Port D direction
.equ PUPD = 0b11111111 ;Port D pull-ups
.equ LCD_W = PD2 ;LCD W line
.equ LCD_E = PD3 ;LCD E line
.equ LCD_D4 = PD4 ;LCD D4 data line
.equ LCD_D5 = PD5 ;LCD D5 data line
.macro Port_LCD_W_0 ;LCD_W = 0
cbi PORTD,LCD_W
.endm
.macro Port_LCD_W_1 ;LCD_W = 1
sbi PORTD,LCD_W
.endm
.macro Port_LCD_E_0 ;LCD_E = 0
cbi PORTD,LCD_E
.endm
.macro Port_LCD_E_1 ;LCD_E = 1
sbi PORTD,LCD_E
.endm
.macro Port_LCD_D4_0 ;LCD_D4 = 0
cbi PORTD,LCD_D4
.endm
.macro Port_LCD_D4_1 ;LCD_D4 = 1
sbi PORTD,LCD_D4
.endm
.macro Port_LCD_D5_0 ;LCD_D5 = 0
cbi PORTD,LCD_D5
.endm
.macro Port_LCD_D5_1 ;LCD_D5 = 1
sbi PORTD,LCD_D5
.endm
Леонид Иванович, я после каждого вашего поста себя таким тупым чувствую... Код: Выделить всё
.MACRO C_in_PORT
brcs _10
clt
rjmp _15
_10: set
; Перекинули бит С в бит Т, специально для этих целей придуманный
_15: in temp,@0
andi r16,~(1<<@1)
; Считали порт и очистили нужный разряд
bld r16,@1
out @0,temp
; заполнили разряд тем чем надо и закинули обратно в порт.
.ENDMACRO
Код: Выделить всё
DB_LINE:
lsr R17 ; Сдвигаем вправо, крайний вывалится в С
brcc Pusto1 ; Если С=0, то переходим по метке
sbi DB4port, DB4pin ; Иначе, выставляем бит в 1
rjmp Next1 ; Идем проверять следующий
Pusto1: cbi DB4port, DB4pin ; Выставляем бит в 0
Next1: lsr R17 ; Сдвигаем вправо, крайний вывалится в С
brcc Pusto2 ; Если С=0, то переходим по метке
sbi DB5port, DB5pin ; Иначе, выставляем бит в 1
rjmp Next2 ; Идем проверять следующий
Pusto2: cbi DB5port, DB5pin ; Выставляем бит в 0
Next2: lsr R17 ; Сдвигаем вправо, крайний вывалится в С
brcc Pusto3 ; Если С=0, то переходим по метке
sbi DB6port, DB6pin ; Иначе, выставляем бит в 1
rjmp Next3 ; Идем проверять следующий
Pusto3: cbi DB6port, DB6pin ; Выставляем бит в 0
Next3: lsr R17 ; Сдвигаем вправо, крайний вывалится в С
brcc Pusto4 ; Если С=0, то переходим по метке
sbi DB7port, DB7pin ; Иначе, выставляем бит в 1
ret ;
Pusto4: cbi DB7port, DB7pin ; Выставляем бит в 0
ret
Код: Выделить всё
DB_LINE: ; Выводим тетраду в линии дисплея
rcall CLR_PORT
sbrc R18, 4 ; Пропустить слудующую, еслли бит сброшен
sbi DB4port, DB4pin ; Ставим бит
sbrc R18, 5 ; Пропустить слудующую, еслли бит сброшен
sbi DB5port, DB5pin ; Ставим бит
sbrc R18, 6 ; Пропустить слудующую, еслли бит сброшен
sbi DB6port, DB6pin ; Ставим бит
sbrc R18, 7 ; Пропустить слудующую, еслли бит сброшен
sbi DB7port, DB7pin ; Ставим бит
retСКАЗОЧНИК писал(а):Коты...Может кому не лень будет, глянет в АВРстудии проект мой. Никак не могу понять, почему у меня руки из жопы...
Все туда кладет и берет компилятор.