sonic 发表于 2005-8-29 00:05:37

请教马老师:扫描矩阵式键盘,实物不能通过?付汇编程序

马老师,这是一个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

sonic 发表于 2005-9-3 20:52:52

马老师这几天没有来嘛?

自已顶一下了

对了,我已经知道错误在哪里啊!

高兴!!!

armok 发表于 2005-9-4 14:40:57

sonic 发表于 2005-9-4 15:27:23

哦,谢谢阿莫的提醒,我现在就把原因告之。

上面程序之所以实物不能通过,是由于延时时间太短了。

其实这个错误也是我的一个朋友提醒了我,要不然的话,够我去揣摩的了

唉。。。。
页: [1]
查看完整版本: 请教马老师:扫描矩阵式键盘,实物不能通过?付汇编程序