Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; 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 ;массив
;(таблица истинности клавиатуры)


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 654:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru