Помогите разобраться. ATMEGA8A + AVRstudio.
Добавлено: Сб ноя 05, 2011 17:36:15
Привожу код программы. Контроллер намертво отказывается воспринемать кнопку на C0. На С0 - резистор 300 идет на +5в. Кнопка - на "землю". Опрос клавиши ведется в "KEYBOARD:"
.def Temp=R16
.def Temp1=R17;инфа на вывод
.def Temp2=R18
.def Temp3=R19
.def Temp4=R20
.def DDisp=R21
.dseg
Digit: .byte 10
.cseg
.org 0
rcall PORT_CONF
PORT_CONF:
ldi Temp, 0xff ;PB как выход
out DDRB,Temp
ldi Temp, 0xff ;PB как выход
out DDRD,Temp
ldi Temp, 0b0000000 ;PB как вход
out DDRC,Temp
ldi Temp, 0xff ;вкл подт. резисторы
out PORTC,Temp
////////////////////////////
ldi DDisp,125
////////////////////////////
START:
rcall KEYBOARD
rcall DISPLAY
rcall START
//******************************************************************************
KEYBOARD:
IN TEMP, PINC
nop
nop
SBIS $16,0//SBIS - пропустить если бит в регистре I/O установлен
//cpi Temp,0b1111110
breq N0
RET
N125:
ldi DDisp,125
RET
N0:
ldi DDisp,0
RET
/*
IN TEMP, PINC
SBRS TEMP,0
;sbrs TEMP,pc0 ;проп есл бит опущен
breq N0
N0:
ldi DDisp,0
RET
*/
RET
//*****************************************************************************
DISPLAY:
cpi DDisp,125 ;сравнение
breq T125 ;перейти, если =
cpi DDisp,0 ;сравнение
breq T0 ;перейти, если =
T0:
ldi Temp,0b00001000 ;вкл только 3 сегмента
out PortD,Temp
ldi Temp,0
rcall Decoder
out PortB,Temp
rcall Delay
ldi Temp,0b00000000 ;потушить все
out PortD,Temp
ret
T125:
ldi Temp,0b00001000 ;вкл 3 сегмента
out PortD,Temp
ldi Temp,5
rcall Decoder
out PortB,Temp
rcall Delay
ldi Temp,0b00000100
out PortD,Temp
ldi Temp,2
rcall Decoder
out PortB,Temp
rcall Delay
ldi Temp,0b00000010
out PortD,Temp
ldi Temp,1
rcall Decoder
out PortB,Temp
rcall Delay
ldi Temp,0b00000000
out PortD,Temp
ret
;rcall Decoder
;out PortB,Temp ;вывод на индикацию
;rcall Delay
ret
//******************************************************************************
Decoder:
cpi Temp,0
breq NUM0
cpi Temp,1
breq NUM1
cpi Temp,2
breq NUM2
cpi Temp,3
breq NUM3
cpi Temp,4
breq NUM4
cpi Temp,5
breq NUM5
cpi Temp,6
breq NUM6
cpi Temp,7
breq NUM7
cpi Temp,8
breq NUM8
cpi Temp,9
breq NUM9
NUM0:
ldi Temp,0b11000000 ;0
ret
NUM1:
ldi Temp,0b11111001 ;1
ret
NUM2:
ldi Temp,0b10100100 ;2
ret
NUM3:
ldi Temp,0b10110000 ;3
ret
NUM4:
ldi Temp,0b10011001 ;4
ret
NUM5:
ldi Temp,0b10010010 ;5
ret
NUM6:
ldi Temp,0b10100000 ;6
ret
NUM7:
ldi Temp,0b11111000 ;7
ret
NUM8:
ldi Temp,0b10000000 ;8
ret
NUM9:
ldi Temp,0b10010000 ;9
ret
ret
//********************************************************************************
Delay:
;цикл задержки
push Temp1
push Temp2
ldi Temp1,0
ldi Temp2,50
d11: dec Temp1
brne d11
dec Temp2
brne d11
pop Temp2
pop Temp1
ret
.def Temp=R16
.def Temp1=R17;инфа на вывод
.def Temp2=R18
.def Temp3=R19
.def Temp4=R20
.def DDisp=R21
.dseg
Digit: .byte 10
.cseg
.org 0
rcall PORT_CONF
PORT_CONF:
ldi Temp, 0xff ;PB как выход
out DDRB,Temp
ldi Temp, 0xff ;PB как выход
out DDRD,Temp
ldi Temp, 0b0000000 ;PB как вход
out DDRC,Temp
ldi Temp, 0xff ;вкл подт. резисторы
out PORTC,Temp
////////////////////////////
ldi DDisp,125
////////////////////////////
START:
rcall KEYBOARD
rcall DISPLAY
rcall START
//******************************************************************************
KEYBOARD:
IN TEMP, PINC
nop
nop
SBIS $16,0//SBIS - пропустить если бит в регистре I/O установлен
//cpi Temp,0b1111110
breq N0
RET
N125:
ldi DDisp,125
RET
N0:
ldi DDisp,0
RET
/*
IN TEMP, PINC
SBRS TEMP,0
;sbrs TEMP,pc0 ;проп есл бит опущен
breq N0
N0:
ldi DDisp,0
RET
*/
RET
//*****************************************************************************
DISPLAY:
cpi DDisp,125 ;сравнение
breq T125 ;перейти, если =
cpi DDisp,0 ;сравнение
breq T0 ;перейти, если =
T0:
ldi Temp,0b00001000 ;вкл только 3 сегмента
out PortD,Temp
ldi Temp,0
rcall Decoder
out PortB,Temp
rcall Delay
ldi Temp,0b00000000 ;потушить все
out PortD,Temp
ret
T125:
ldi Temp,0b00001000 ;вкл 3 сегмента
out PortD,Temp
ldi Temp,5
rcall Decoder
out PortB,Temp
rcall Delay
ldi Temp,0b00000100
out PortD,Temp
ldi Temp,2
rcall Decoder
out PortB,Temp
rcall Delay
ldi Temp,0b00000010
out PortD,Temp
ldi Temp,1
rcall Decoder
out PortB,Temp
rcall Delay
ldi Temp,0b00000000
out PortD,Temp
ret
;rcall Decoder
;out PortB,Temp ;вывод на индикацию
;rcall Delay
ret
//******************************************************************************
Decoder:
cpi Temp,0
breq NUM0
cpi Temp,1
breq NUM1
cpi Temp,2
breq NUM2
cpi Temp,3
breq NUM3
cpi Temp,4
breq NUM4
cpi Temp,5
breq NUM5
cpi Temp,6
breq NUM6
cpi Temp,7
breq NUM7
cpi Temp,8
breq NUM8
cpi Temp,9
breq NUM9
NUM0:
ldi Temp,0b11000000 ;0
ret
NUM1:
ldi Temp,0b11111001 ;1
ret
NUM2:
ldi Temp,0b10100100 ;2
ret
NUM3:
ldi Temp,0b10110000 ;3
ret
NUM4:
ldi Temp,0b10011001 ;4
ret
NUM5:
ldi Temp,0b10010010 ;5
ret
NUM6:
ldi Temp,0b10100000 ;6
ret
NUM7:
ldi Temp,0b11111000 ;7
ret
NUM8:
ldi Temp,0b10000000 ;8
ret
NUM9:
ldi Temp,0b10010000 ;9
ret
ret
//********************************************************************************
Delay:
;цикл задержки
push Temp1
push Temp2
ldi Temp1,0
ldi Temp2,50
d11: dec Temp1
brne d11
dec Temp2
brne d11
pop Temp2
pop Temp1
ret