??? 12/05/06 02:45 Read: times |
#128945 - An Update Responding to: ???'s previous message |
Sorry for not getting back to you guys for a while. I have been very busy.
Here is my new source code. I was a bit confused as to whether or not it would be a good idea to use external interrupts to capture the switch input. A lot of posts on this forum talk about debouncing issues but I think that it would make the code a lot more elegant. Plus, the user could press the switch at any time and it would work, whereas the switch has to be held down until the code checks the input pin if I had done it without interrupts. Therefore, I decided to try it. #include "8051equ.inc" .org 00h ajmp start .org 03h push PSW ; set 30h to new number based on timer mov 30h, TL0 pop PSW reti .org 0bh reti .org 13h reti .org 1bh reti .org 23h reti .org 25h initialize: mov SP, #040h ; start timer 0 - 16 bit timer mode mov TMOD, #01h setb TR0 mov PSW, #00h ; interrupt when switch is hit clr IT0 setb EA setb EX0 ret ; delay for short while (not important exactly how long) delay_x: mov r7, #0ffh loop_1: dec r7 djnz r7, loop_1 ret ; 8-bit binary to bcd converter ; a - input value ; r2 - output digit 1 ; r3 - output digit 2 ; r4 - output digit 3 bin_to_bcd: mov B, #010d div ab mov r4, B mov B, #010d div ab mov r3, B mov B, #010d div ab mov r2, B ret segment_table: .db 00001001b, 11101011b, 01000101b, 01100001b, 10100011b, 00110001b, 00010001b, 01101011b, 00000001b, 00100011b ; display 3 digit BCD number in the A register display_bcd: mov dptr, #segment_table movc a, @a+dptr mov P1, a ret start: acall initialize display_loop: mov a, 30h acall bin_to_bcd mov a, r2 acall display_bcd setb P3.3 acall delay_x clr P3.3 mov a, r3 acall display_bcd setb P3.4 acall delay_x clr P3.4 mov a, r4 acall display_bcd setb P3.5 acall delay_x clr P3.5 ajmp display_loop .end It seems to me that this should work. However, it does not. The 3 7-segment displays usually all display 0's. If I reset the device sometimes they display "Y X Y" where X is a blank 7-segment display and Y is a random decimal digit. Also, sometimes all 3 7-segment displays are blank. P3.2 (INT0) is connected to a switch which is connected to GND. However, when the switch is hit, nothing happens. Nothing at all. Regardless of what (if any) digits are being displayed, they stay there and the switch is ignored. Any ideas? Thanks again to all. |