请教马老师:扫描矩阵式键盘,实物不能通过?付汇编程序
马老师,这是一个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 马老师这几天没有来嘛?
自已顶一下了
对了,我已经知道错误在哪里啊!
高兴!!! 哦,谢谢阿莫的提醒,我现在就把原因告之。
上面程序之所以实物不能通过,是由于延时时间太短了。
其实这个错误也是我的一个朋友提醒了我,要不然的话,够我去揣摩的了
唉。。。。
页:
[1]