|
马老师,这是一个4*4的键盘扫描程序,主要功能是如果是按下“0”号键盘,则红灯亮十次,如果是按其他按键,则是绿灯亮相应的次数;我将下面的程序下载到该芯片后,结果是不管按哪个按键,都是绿灯亮一次,再按连灯都不亮了。不知程序在哪里出错? include"1200def.inc"
.equ row1=3
.equ row2=2
.equ row3=1
.equ row4=0
.equ col1=7
.equ col2=6
.equ col3=5
.equ col4=4
.equ green=0
.equ red=1
.equ int=2
.def temp=r16
.def key=r17
.def status=r21
.def fine=r18
.def medium=r19
.def coarse=r20
;***************** EEPROM Code *********************************
.eseg
.org 0
.db 1,2,3,15,4,5,6,14,7,8,9,13,10,0,11,12
;***************** Progam Code *********************************
.cseg
.org 0
rjmp reset
rjmp scan_reti
reti
reti
reset:
ldi temp, 0xfb
out ddrd, temp
ldi temp, 0x30
out mcucr, temp
ldi temp, 0x40
out gimsk, temp
sbi acsr, ACD
main: cli
ldi temp, 0xf0
out ddrb, temp
ldi temp, 0x0f
out portb, temp
ldi temp, 0x07
out portd, temp
sei
sleep
rcall key_scan
rcall flash
ldi temp, 0x40
out gimsk, temp
rjmp main
;****************** interrupt Program **************************
scan_reti:
in status, sreg
clr temp
out gimsk, temp
out sreg, status
reti
;****************** Scan Program *******************************
key_scan:
sbis pinb, row1
rjmp row_1
sbis pinb, row2
rjmp row_2
sbis pinb, row3
rjmp row_3
sbis pinb, row4
rjmp row_4
rjmp no_key
row_1:
ldi key, 0
rjmp row_end
row_2:
ldi key, 4
rjmp row_end
row_3:
ldi key, 8
rjmp row_end
row_4:
ldi key, 12
row_end:
ldi temp, 0x0f
out ddrb, temp
ldi temp, 0xf0
out portb, temp
rcall settle
sbis pinb, col1
rjmp col_1
sbis pinb, col2
rjmp col_2
sbis pinb, col3
rjmp col_3
sbis pinb, col4
rjmp col_4
rjmp no_key
col_1:
ldi temp, 0
rjmp col_row_deal
col_2:
ldi temp, 1
rjmp col_row_deal
col_3:
ldi temp, 2
rjmp col_row_deal
col_4:
ldi temp, 3
rjmp col_row_deal
no_key:
rjmp key_scan
col_row_deal:
add key, temp
ldi temp, 0xf0
out ddrb, temp
ldi temp, 0x0f
out portb, temp
ret
;**********************************************************
flash:
out eear, key
sbi eecr, eere
in temp, eedr
tst temp
breq zero
grflash:
cbi portd, green
rcall delay
dec temp
brne grflash
ret
zero:
ldi temp, 10
zero1:
cbi portd, red
rcall delay
sbi portd, red
rcall delay
dec temp
brne zero1
ret
delay:
ldi coarse, 15
delay1:
clr medium
clr fine
delay2:
dec fine
brne delay2
delay3:
dec medium
brne delay3
dec coarse
brne delay1
ret
settle:
ldi temp, 255
settle1:
dec temp
brne settle1
ret |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|