Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; ColdFire; 40 тыс.
e-mail: jobsmp@pochta.ru
|
не выводиться 16 кнопка в Proteuse
Отправлено
Frensis 22 сентября 2008 г. 17:38
.include "m16def.inc"
.def Temp1=R16
.def Temp2=R17
.def Temp3=R18
.def Temp4=R19
.def Temp=R20
.def DecCount=R21
.def Scd=R22
.def Min=R23
.def Hour=R24
.def Status=R25
.dseg
Digit: .byte 4
Line: .byte 4
Key: .byte 1
;******************************************************************************
.macro stsi ;save_immediate <SRAM_cell>,<k>
ldi Temp,@1
sts @0,Temp
.endmacro
.macro outi
ldi Temp,@1
out @0,Temp
.endmacro
.macro rdm
ldi ZH,High(@0*2)
ldi ZL,Low(@0*2)
add ZL,Temp1
adc ZH,Temp2
lpm
mov Temp3,r0
.endmacro
;******************************************************************************
.cseg
.org 0
jmp RESET ; Reset Handler
jmp EXT_INT0 ; IRQ0 Handler
jmp EXT_INT1 ; IRQ1 Handler
jmp TIM2_COMP ; Timer2 Compare Handler
jmp TIM2_OVF ; Timer2 Overflow Handler
jmp TIM1_CAPT ; Timer1 Capture Handler
jmp TIM1_COMPA ; Timer1 CompareA Handler
jmp TIM1_COMPB ; Timer1 CompareB Handler
jmp TIM1_OVF ; Timer1 Overflow Handler
jmp TIM0_OVF ; Timer0 Overflow Handler
jmp SPI_STC ; SPI Transfer Complete Handler
jmp USART_RXC ; USART RX Complete Handler
jmp USART_UDRE ; UDR Empty Handler
jmp USART_TXC ; USART TX Complete Handler
jmp _ADC ; ADC Conversion Complete Handler
jmp EE_RDY ; EEPROM Ready Handler
jmp ANA_COMP ; Analog Comparator Handler
;Reset:
EXT_INT0:
EXT_INT1:
TIM2_COMP:
TIM2_OVF:
TIM1_CAPT:
TIM1_COMPA:
TIM1_COMPB:
TIM1_OVF:
TIM0_OVF:
SPI_STC:
USART_RXC:
USART_UDRE:
USART_TXC:
_ADC:
EE_RDY:
ANA_COMP:
reti
reset:
ldi Temp, high(RAMEND)
out SPH,Temp
ldi Temp, low(RAMEND)
out SPL,Temp
cli
ldi Temp,0b11111111
out ddrb,Temp
ldi Temp,0b00001111
out ddrd,Temp
stsi Digit ,0
stsi Digit+1,0
stsi Digit+2,0
stsi Digit+3,0
;*********************************************************
;MAIN CYCLE
;*********************************************************
IndicCycle: rcall Display
rcall KeyRead
rcall Keyboard
rjmp IndicCycle
;*********************************************************
;*********************************************************
Display:
lds Temp1,Digit
ldi Temp,0b00001110
out PortD,Temp
rcall Decoder
out PortB,Temp1
in Temp,PinD
sts Line,Temp
rcall Delay1
lds Temp1,Digit+1
ldi Temp,0b00001101
out PortD,Temp
rcall Decoder
out PortB,Temp1
in Temp,PinD
sts Line+1,Temp
rcall Delay1
lds Temp1,Digit+2
ldi Temp,0b00001011
out PortD,Temp
rcall Decoder
out PortB,Temp1
in Temp,PinD
sts Line+2,Temp
rcall Delay1
lds Temp1,Digit+3
ldi Temp,0b00000111
out PortD,Temp
rcall Decoder
out PortB,Temp1
in Temp,PinD
sts Line+3,Temp
rcall Delay1
ret
;*********************************************************
Decoder:
ldi ZL,Low(DcMatrix*2)
ldi ZH,High(DcMatrix*2)
ldi Temp2,0
add ZL,Temp1
adc ZH,Temp2
lpm
mov Temp1,r0
ret
DcMatrix:
; hgfedcba hgfedcba
.db 0b00111111,0b00000110 ;0,1
.db 0b01011011,0b01001111 ;2,3
.db 0b01100110,0b01101101 ;4,5
.db 0b01111101,0b00000111 ;6,7
.db 0b01111111,0b01101111 ;8,9
.db 0b01110111,0b01111100 ;A,B
.db 0b00111001,0b01011110 ;C,D
.db 0b01111001,0b01110001 ;E,F
.db 0b01111111,0b01111111
;*********************************************************
Delay1:
push Temp1
push Temp2
ldi Temp1,0
ldi Temp2,50
d11: dec Temp1
brne d11
dec Temp2
brne d11
pop Temp2
pop Temp1
ret
;*********************************************************
;*********************************************************
KeyRead:
;проверяет нажатие клавиши в клавиатуре
;возвращает номер клавиши в случае нажатия
;иначе возвращает -1 (255)
;также -1 возвращается в случае, если в прошлый раз была нажате та же
;кнопка
;возвращаемое значение - переменная Key
;блок проверки строки (всего их 4)
lds Temp,Line ;читаем состояние строки
rcall KeyTest ;вызываем программу проверки
;программа возвращает
;номер кнопки: 0..2
;или -1 - если нет нажатых кнопок
ldi Temp,0 ;загружаем код текущей строки
cpi Temp1,255 ;если ничего не нажато - идем дальше
brne SetKey ;иначе - переходим на обработку
;конец 0-го блока
lds Temp,Line+1
rcall KeyTest
ldi Temp,4
cpi Temp1,255
brne SetKey
lds Temp,Line+2
rcall KeyTest
ldi Temp,8
cpi Temp1,255
brne SetKey
lds Temp,Line+3
rcall KeyTest
ldi Temp,12
cpi Temp1,255
brne SetKey
ldi Temp,0
SetKey: add Temp,Temp1 ;прибавляем номер кнопки
;к коду строчки
lds Temp1,Key ;грузим код кнопки,
;прочитанный в прошлый раз
andi Temp1,0b00001111 ;"чистим" его по маске
cp Temp,Temp1 ;если в прошлый раз
brne EndKeyRead ;была нажата не та же кнопка
;выходим
ori Temp,0b10000000 ;иначе - пишем флажок "повтор"
EndKeyRead: sts Key,Temp ;сохраняем код кнопки в ОЗУ
ret ;выходим
;*********************************************************
KeyTest: andi Temp,0b11110000 ;обрезаем по маске
ldi Temp1,0b11110000
eor Temp,Temp1
;инвертируем биты по маске
breq NoButtons ;если все нули (нет нажатых)
;переходим по метке
ldi Temp1,0 ;инициализируем счетчик
cpi Temp,0b00010000 ;проверяем 0-ю кнопку
breq EndKeyTest ;нажато - выход
inc Temp1 ;иначе - инкремент счетчика
cpi Temp,0b00100000 ;проверка 2 кнопки
breq EndKeyTest
inc Temp1
cpi Temp,0b01000000 ;проверка 3 кнопки
breq EndKeyTest
inc Temp1
cpi Temp,0b10000000 ;проверка 3 кнопки
breq EndKeyTest
NoButtons: ldi Temp1,255 ;если ничего не нажато -
;возвращаем 255
EndKeyTest: ret
;*********************************************************
;*********************************************************
Keyboard:
;запускает выполнение операции, закрепленной за кнопкой
lds Temp,Key ;загружаем переменную Key
mov Temp1,Temp ;проверяем на наличие флажка
andi Temp1,0b10000000 ;"повтор" или -1
brne EndKeyboard ;если повтор или -1 - выходим
ldi ZH,High(KeysLUT*2);загружаем таблицу
ldi ZL,Low (KeysLUT*2);истинности
;(клавиша -> значение)
ldi Temp1,0 ;смещаемся на номер клавиши
add ZL,Temp
adc ZH,Temp1
lpm ;загружаем значение элемента
mov Temp,R0
lds Temp1,Digit+2 ;сдвигаем разряды индикатора
sts Digit+3,Temp1 ;на один влево
lds Temp1,Digit+1
sts Digit+2,Temp1
lds Temp1,Digit
sts Digit+1,Temp1
sts Digit,Temp ;пишем в млад. разряд
;индикатора текущее значение
EndKeyboard: ret
;*********************************************************
KeysLUT:
.db 15,1,2,3,14,4,5,6,13,7,8,9,12,13,0,11 ;массив
;(таблица истинности клавиатуры)
Составить ответ | Вернуться на конференцию
Ответы