PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Trao đổi ngoài luồng (http://www.picvietnam.com/forum/forumdisplay.php?f=22)
-   -   Help code asemblly (http://www.picvietnam.com/forum/showthread.php?t=13351)

hanguyen92205 23-02-2012 11:51 PM

Help code asemblly
 
ai thạo về asemblly có thể xem giúp e cái code natf dc ko
ko có lỗi nhưng dịch file hex ko dc
Code:

;***********************************************************
;
;              Digital Clock with alarm using DS1307
;
;                  For Keil/ A51 Macro Assembler
;
;              Designed By: Ajay Bhargav
;
;              E-mail:      ajay_bhargav@hotmail.com
;
;              WWW:        www.rickeyworld.info
;
;  PS: Use only A51 Macro assembler for linking this file
;      else you can directly use the hex file provided.
;
;      And if in anycase you want to edit the code then
;      you have to use an alternative to write the macros
;      defined in the file. In my opinion you dont need to
;      edit it.
;
;***********************************************************

hold macro
        nop
        nop
        nop
        nop
        endm

disp_str macro string                                ;Macro for sending string to LCD
        irpc char, <string>
                if nul 'char'
                        exitm
                endif
                mov a,#'char'
                lcall data_in
        endm
        endm

build_char macro P1,P2,P3,P4,P5,P6,P7,P8        ;Macro for building a custom character
        irp arg, <P1,P2,P3,P4,P5,P6,P7,P8>
                mov a,#arg
                acall data_in
        endm
        endm
       
        sec equ 30h                                ;second register
        min equ 31h                                ;minutes register
        hour equ 32h                                ;hour register
        days equ 33h                                ;days register
        date equ 34h                                ;date register
        month equ 35h                                ;month register
        year equ 36h                                ;year register
        alarm equ 37h                                ;alarm register
        sig equ 38h                                ;signature for data checking in RTC RAM
        ahour equ 39h                                ;alarm hour register
        amin equ 3Ah                                ;alarm minute register
        sda equ P1.1                                ;Serial data pin
        scl equ P1.0                                ;Serial clock pin
        rw equ p3.6                                ;read write pin of LCD
        en equ p3.5                                ;enable pin of LCD
        rs equ p3.7                                ;register select pin of LCD
        alarm_key equ p3.3                        ;Alarm set key
        time_key equ p3.2                        ;Time ser key
        increment equ p1.3                        ;Increment value
        decrement equ p1.2                        ;Decrement Value
        alarm_port equ p1.4                        ;Alarm Buzzer port
        alarm_flag equ 20h                        ;flag for alarm
        time_flag equ 21h                        ;flag for time
        ampm_flag equ 22h                        ;am/pm flag
        alarm_on equ 23h                        ;Alarm on flag
        alarm_off equ 24h                        ;alarm off flag
        alarm_ring equ 25h                        ;alarm ring flag
        alarm_hrs equ 58h                        ;Alarm hour register
        alarm_min equ 59h                        ;Alarm Minutes register
        alarm_chk_hour equ 5Ah                        ;Alarm hour check register
        alarm_chk_min equ 5Bh                        ;Alarm min check register
        ampm equ 61h                                ;AM/PM register
        BELL equ 7h                                ;Bell icon
        SPEAKER_OFF equ 1h                        ;speaker off icon
        SPEAKER_ON equ 2h                        ;speaker on icon
        CLOCK equ 3h                                ;clock icon
        OK equ 4h                                ;ok icon
        HEART equ 5h                                ;heart icon
        MUSIC equ 6h                                ;music icon

        org 0000h                                ;Starting of main program
        ljmp start

        org 03h                                        ;interrupt for set time
        setb time_flag
        reti

        org 13h                                        ;Interrupt for set alarm
        setb alarm_flag                                ;and switch off the alarm if on
        jnb alarm_off,hmmm
        setb alarm_port
        mov a,#1h
        lcall command
        mov a,#81h
        lcall command
        mov a,#OK
        acall data_in
        mov r7,#35
        disp_str < Alarm Off!>
        setb tr0
loooop:        jnb tf0,$
        clr tf0
        djnz r7,loooop
        clr tr0
        mov a,#1h
        acall command
        acall disp_const
        setb alarm_off
        setb alarm_on
        clr alarm_flag
        clr alarm_flag
        clr alarm_on
        setb alarm_port
        clr alarm_off
        clr alarm_flag
        clr alarm_ring
hmmm:        reti

start:       
        ;clear RAM
        mov R0,#7FH
        clr A
clr_ram:
        mov @R0,A
        djnz R0, clr_ram

        ;Init I2C Port
        lcall i2cinit

        mov tmod,#1h                                ;start routine
        mov sp,#10h
        acall initial
        acall build
        mov a,#80h
        acall command
        mov a,#CLOCK
        acall data_in
        disp_str < Nguyen Ngoc Ha >                ;Name display
        mov r7,#50
        setb tr0
wloop:       
        jnb tf0,$
        clr tf0
        djnz r7,wloop
        clr time_flag
        clr alarm_flag
        clr alarm_on
        clr ampm_flag
        setb alarm_port

        lcall startc                                ;Reading invalid hour entry
        mov a,#0d0h                                        ;initialize the RTC if necessary
        lcall send
        lcall ack
        mov a,#02h
        lcall send
        lcall ack
        lcall rstart
        mov a,#0d1h
        acall send
        acall ack
        acall read
        acall nak
        acall stop
        anl a,#1fh
        cjne a,#12h,step
step:
        jnc done
        acall startc                                ;Reading signature byte if same then no need
        mov a,#0d0h                                        ;of initialization else initialize the RTC
        acall send
        acall ack
        mov a,#08h
        acall send
        acall ack
        acall rstart
        mov a,#0d1h
        acall send
        acall ack
        acall read
        acall nak
        acall stop
        cjne a,#'~',done
        sjmp run
done:
        ;acall initial
        ;acall disp_const
        mov sec,#00h                                ;For more information about the RTC DS1307
        mov min,#0h                                ;Please refer to the datasheet
        mov hour,#52h                                ;21h for 24 hour format
        mov days,#01h
        mov date,#1h
        mov month,#1h
        mov year,#06h
        mov alarm,#0
        mov sig,#'~'
        mov ahour,#0
        mov amin,#0
        mov r6,#0bh
        mov r0,#sec
        mov r1,#00h
        acall rtc_ini                                ;initializing RTC if required
run:
        mov ie,#85h
        acall initial
        acall disp_const
run1:
        acall startc                                ;Actual Starting
        mov a,#0d0h
        acall send
        acall ack
        mov a,#00h
        acall send
        acall ack
        mov r6,#0fh
        acall rstart                                ;Reading the RCT content
        mov a,#0d1h
        acall send
        acall ack
        mov r0,#40h
here:
        lcall read
        mov @r0,a
        inc r0
        cjne r6,#1,sendack
        acall nak
        sjmp naksent
sendack:
        acall ack
naksent:
        djnz r6,here
        acall stop

        acall display                                ;Display RTC
        jnb time_flag,noset                        ;check for time flag if set the set the clock
        clr time_flag
        clr ea
        acall time_set
        clr time_flag
        mov r6,#09h
        mov r0,#30h
        mov r1,#00h
        acall rtc_ini
        clr time_flag
        mov a,#1h
        acall command
        mov a,#81h
        acall command
        mov a,#OK
        acall data_in
        clr time_flag
        disp_str < Time Set!>
        mov r7,#35
        setb tr0
looooop:jnb tf0,$
        clr tf0
        djnz r7,looooop
        clr tr0
        mov a,#1h
        acall command
        acall disp_const
        setb ea
noset:
        jnb alarm_flag,noset1                        ;check for alarm flag if set then set alarm
        clr alarm_flag
        clr ea
        lcall alarm_set
        setb ea
        setb alarm_on
        clr alarm_flag
        setb alarm_on
noset1:
        jnb alarm_ring,noset2                        ;check if alarm ring flag is set
        lcall alarm_alarm                        ;if set then ring the alarm
noset2:        ljmp run1                                ;Do everything again

;***************************************
;Initializing I2C Bus Communication
;***************************************
i2cinit:
        setb sda
        setb scl
        ret

;****************************************
;ReStart Condition for I2C Communication
;****************************************
rstart:
        clr scl
        setb sda
        setb scl
        clr sda
        ret

;****************************************
;Start Condition for I2C Communication
;****************************************
startc:
        setb scl
        clr sda
        clr scl
        ret

;*****************************************
;Stop Condition For I2C Bus
;*****************************************
stop:
        clr scl
        clr sda
        setb scl
        setb sda
        ret

;*****************************************
;Sending Data to slave on I2C bus
;*****************************************
send:
        mov r7,#08
back:
        clr scl
        rlc a
        mov sda,c
        setb scl
        djnz r7,back
        clr scl
        setb sda
        ret

;*****************************************
;ACK and NAK for I2C Bus
;*****************************************
ack:
        clr sda
        setb scl
        clr scl
        setb sda
        ret

nak:
        setb sda
        setb scl
        clr scl
        setb scl
        ret

;*****************************************
;Receiving Data from slave on I2C bus
;*****************************************
read:
        mov r7,#08
back2:
        clr scl
        setb scl
        mov c,sda
        rlc a
        djnz r7,back2
        clr scl
        setb sda
        ret

recv:                                                ;Recieving data from I2C bus
        lcall read
        lcall ack
        mov @r0,a
        inc r0
        ret

rtc_ini:acall startc                                ;RTC initialization subroutine
        mov a,#0d0h
        acall send
        acall ack
        mov a,r1
        acall send
        acall ack
rtc_ini_loop:
        mov a,@r0
        acall send
        acall ack
        inc r0
        inc r1
        ;acall stop
        djnz r6,rtc_ini_loop
        acall stop
        ret

initial:mov a,#38h                                ;LCD initialization subroutine
        acall command
        mov a,#0ch
        acall command
        mov a,#01h
        acall command
        mov a,#06h
        acall command
        ret

build:        mov a,#40h                                ;Building custom character routine
        acall command
        build_char 0h,0h,0h,0h,0h,0h,0h,0h        ;BELL
        build_char 1h,3h,0fh,0fh,0fh,3h,1h,0h        ;SPEAKER OFF
        build_char 8h,10h,0h,18h,0h,10h,8h,0h        ;SPEAKER ON
        build_char 0h,0eh,15h,17h,11h,0eh,0h,0h        ;CLOCK
        build_char 0h,1h,3h,16h,1ch,8h,0h,0h        ;OK
        build_char 0ah,1fh,1fh,1fh,0eh,4h,0h,0h        ;HEART
        build_char 2h,3h,2h,0eh,1eh,0ch,0h,0h        ;MUSIC
        build_char 4h,0eh,0eh,0eh,1fh,0h,4h,0h        ;BELL
        ret

display:mov r1,#40h                                ;Displaying RTC content
        mov a,#0Cah
        acall command
        mov a,@r1
        mov 50h,@r1
        acall disp_val
PASS:        inc r1
        mov a,#0C7h
        acall command
        mov a,@r1
        mov 51h,@r1
        mov alarm_chk_min,@r1
        acall disp_val
PASS1:        inc r1
        mov a,#0c4h
        acall command
        mov a,@r1
        mov 52h,@r1
        mov alarm_chk_hour,@r1
        mov r4,a
        anl a,#1fh
        acall disp_val
        mov a,r4
        anl a,#20h
        cjne a,#00h,pm
        mov a,#0cdh
        acall command
        disp_str <am>
        sjmp pass2
pm:        mov a,#0cdh
        acall command
        disp_str <pm>
PASS2:        inc r1
        mov a,#80h
        acall command
        mov a,@r1
        mov 53h,@r1
        acall day
PASS3:        inc r1
        mov a,#88h
        acall command
        mov a,@r1
        mov 54h,@r1
        acall disp_val
PASS4:        inc r1
        mov a,#8bh
        acall command
        mov a,@r1
        mov 55h,@r1
        acall disp_val
PASS5:        inc r1
        mov a,#8eh
        acall command
        mov a,@r1
        mov 56h,@r1
        acall disp_val
        jnb alarm_on,PASS6
        inc r1
        inc r1
        inc r1
        mov a,@r1
        cjne a,52h,PASS6
        inc r1
        mov a,@r1
        cjne a,51h,PASS6
        setb alarm_ring
        setb alarm_ring
PASS6:        ret

disp_val:                                        ;Display 8-bit Decimal Value
        push acc
        mov r5,a
        anl a,#0f0h
        swap a
        mov dptr,#ascii
        movc a,@a+dptr
        acall data_in
        mov a,r5
        anl a,#0fh
        movc a,@a+dptr
        acall data_in
        pop acc
        ret

disp_const:                                        ;Display constant characters
        mov a,#8ah
        acall command
        mov a,#'/'
        acall data_in
        mov a,#8dh
        acall command
        mov a,#'/'
        acall data_in
        mov a,#0c6h
        acall command
        mov a,#':'
        acall data_in
        mov a,#0c9h
        acall command
        mov a,#':'
        acall data_in
        mov a,#0c0h
        acall command
        mov a,#BELL
        acall data_in
        mov a,#SPEAKER_OFF
        acall data_in
        ret

command:acall busy                                ;Sending command to LCD
        MOV P2,A
        CLR rs
        CLR rw
        SETB en
        CLR en
        RET

data_in:acall busy                                ;Sending data to LCD
        SETB rs
        MOV P2,A
        CLR rw
        SETB en
        CLR en
        RET

busy:        ;SETB P2.7                                ;Checking Busy flag
        mov P2, #0FFH
        CLR rs
        SETB rw
wait:        CLR en
        SETB en
        JB P2.7,wait
        RET

day:        push acc                                ;Displaying day subroutine for RTC
        cjne a,#01,skip
        disp_str < *Sun*>
        ljmp exit
skip:        cjne a,#02,skip2
        disp_str < *Mon*>
        ljmp exit
skip2:        cjne a,#03,skip3
        disp_str < *Tue*>
        ljmp exit
skip3:        cjne a,#04,skip4
        disp_str < *Wed*>
        sjmp exit
skip4:        cjne a,#05,skip5
        disp_str< *Thu*>
        sjmp exit
skip5:        cjne a,#06,skip6
        disp_str < *Fri*>
        sjmp exit
skip6:        disp_str < *Sat*>
exit:        pop acc
        ret

time_set:                                        ;Setting time subroutine
        jnb time_key,$
        mov a,#1
        acall command
        mov a,#80h
        acall command
        mov a,#CLOCK
        acall data_in
        disp_str < set minutes:>
        mov a,#0c5h
        acall command
        mov a,51h
        acall disp_val
        lcall hexdec
key:        push acc
        mov a,#0c5h
        acall command
        pop acc
        jb increment,chk1
        inc a
        cjne a,#60,ok1
        mov a,#0
ok1:        jnb increment,$
        lcall dechex
        acall disp_val
        lcall hexdec
        sjmp key
chk1:        jb decrement,chk2
        dec a
        cjne a,#0ffh,ok2
        mov a,#59
ok2:        jnb decrement,$
        lcall dechex
        acall disp_val
        lcall hexdec
        sjmp key
chk2:        jb time_key,key

        lcall dechex
        mov min,a
        jnb time_key,$

        mov a,#1
        acall command
        mov a,#80h
        acall command
        mov a,#CLOCK
        acall data_in
        disp_str < set hours:>
        mov a,#0c5h
        acall command
        mov a,52h
        anl a,#1fh
        acall disp_val
        lcall hexdec
key1:        push acc
        mov a,#0c5h
        acall command
        pop acc
        jb increment,chk3
        inc a
        cjne a,#13,ok3
        mov a,#1
ok3:        jnb increment,$
        lcall dechex
        acall disp_val
        lcall hexdec
        sjmp key1
chk3:        jb decrement,chk4
        dec a
        cjne a,#0,ok4
        mov a,#12
ok4:        jnb decrement,$
        lcall dechex
        acall disp_val
        lcall hexdec
        sjmp key1
chk4:        jb time_key,key1

        lcall dechex
        mov hour,a
        jnb time_key,$

        mov a,#1
        acall command
        mov a,#80h
        acall command
        mov a,#CLOCK
        acall data_in
        disp_str < set am/pm:>
        mov a,52h
        anl a,#20h
        cjne a,#00h,pm1
        mov a,#0c5h
        acall command
        disp_str <am>
        setb ampm_flag
        sjmp key2
pm1:        mov a,#0c5h
        acall command
        disp_str <pm>
        clr ampm_flag
       
key2:        mov a,#0c5h
        acall command
        jb increment,chk5
        jb ampm_flag,ok5
        setb ampm_flag
        disp_str <am>
        hold
        jnb increment,$
        sjmp key2
ok5:        clr ampm_flag
        disp_str <pm>
        hold
        jnb increment,$
        sjmp key2
chk5:        jb decrement,chk6
        jb ampm_flag,ok6
        setb ampm_flag
        disp_str <am>
        hold
        jnb decrement,$
        sjmp key2
ok6:        clr ampm_flag
        disp_str <pm>
        hold
        jnb decrement,$
        sjmp key2
chk6:        jb time_key,key2
       
        jnb ampm_flag,noam
        mov a,hour
        add a,#40h
        sjmp nopm
noam:        mov a,hour
        add a,#60h
nopm:        mov hour,a
        jnb time_key,$

        mov a,#1
        acall command
        mov a,#80h
        acall command
        mov a,#CLOCK
        acall data_in
        disp_str < set days:>
        mov a,#0c5h
        lcall command
        mov a,53h
        push acc
        lcall day
        pop acc
key3:        push acc
        mov a,#0c5h
        lcall command
        pop acc
        jb increment,chk7
        inc a
        cjne a,#8,ok7
        mov a,#1
ok7:        jnb increment,$
        push acc
        lcall day
        pop acc
        sjmp key3
chk7:        jb decrement,chk8
        dec a
        cjne a,#0,ok8
        mov a,#7
ok8:        jnb decrement,$
        push acc
        lcall day
        pop acc
        sjmp key3
chk8:        jb time_key,key3

        mov days,a
        jnb time_key,$

        mov a,#1
        lcall command
        mov a,#80h
        lcall command
        mov a,#CLOCK
        lcall data_in
        disp_str < set date:>
        mov a,#0c5h
        lcall command
        mov a,54h
        lcall disp_val
        lcall hexdec
key4:        push acc
        mov a,#0c5h
        lcall command
        pop acc
        jb increment,chk9
        inc a
        cjne a,#32,ok9
        mov a,#1
ok9:        jnb increment,$
        lcall dechex
        lcall disp_val
        lcall hexdec
        sjmp key4
chk9:        jb decrement,chk10
        dec a
        cjne a,#0,ok10
        mov a,#31
ok10:        jnb decrement,$
        lcall dechex
        lcall disp_val
        lcall hexdec
        sjmp key4
chk10:        jb time_key,key4
       
        lcall dechex
        mov date,a
        jnb time_key,$

        mov a,#1
        lcall command
        mov a,#80h
        lcall command
        mov a,#CLOCK
        lcall data_in
        disp_str < set month:>
        mov a,#0c5h
        lcall command
        mov a,55h
        lcall disp_val
        lcall hexdec
key5:        push acc
        mov a,#0c5h
        lcall command
        pop acc
        jb increment,chk11
        inc a
        cjne a,#13,ok11
        mov a,#1
ok11:        jnb increment,$
        lcall dechex
        lcall disp_val
        lcall hexdec
        sjmp key5
chk11:        jb decrement,chk12
        dec a
        cjne a,#0,ok12
        mov a,#12
ok12:        jnb decrement,$
        lcall dechex
        lcall disp_val
        lcall hexdec
        sjmp key5
chk12:        jb time_key,key5
       
        lcall dechex
        mov month,a
        jnb time_key,$

        mov a,#1
        lcall command
        mov a,#80h
        lcall command
        mov a,#CLOCK
        lcall data_in
        disp_str < set year:>
        mov a,#0c5h
        lcall command
        mov a,56h
        lcall disp_val
        lcall hexdec
key6:        push acc
        mov a,#0c5h
        lcall command
        pop acc
        jb increment,chk13
        inc a
        cjne a,#100,ok13
        mov a,#0
ok13:        jnb increment,$
        lcall dechex
        lcall disp_val
        lcall hexdec
        sjmp key6
chk13:        jb decrement,chk14
        dec a
        cjne a,#0ffh,ok14
        mov a,#99
ok14:        jnb decrement,$
        lcall dechex
        lcall disp_val
        lcall hexdec
        sjmp key6
chk14:        jb time_key,key6

        jnb time_key,$
        lcall dechex
        mov year,a
        mov alarm,#00
        mov sig,#'~'
        clr time_flag
        ret

alarm_set:                                        ;Setting Alarm Subroutine
        jnb alarm_key,$
        mov a,#1
        lcall command
        mov a,#80h
        lcall command
        mov a,#BELL
        lcall data_in
        disp_str < set minutes:>
        mov a,#0c5h
        lcall command
        mov a,#30h
        lcall disp_val
        lcall hexdec
akey:        push acc
        mov a,#0c5h
        lcall command
        pop acc
        jb increment,achk1
        inc a
        cjne a,#60,aok1
        mov a,#0
aok1:        jnb increment,$
        lcall dechex
        lcall disp_val
        lcall hexdec
        sjmp akey
achk1:        jb decrement,achk2
        dec a
        cjne a,#0ffh,aok2
        mov a,#59
aok2:        jnb decrement,$
        lcall dechex
        lcall disp_val
        lcall hexdec
        sjmp akey
achk2:        jb alarm_key,akey

        lcall dechex
        mov alarm_min,a
        jnb alarm_key,$

        mov a,#1
        lcall command
        mov a,#80h
        lcall command
        mov a,#BELL
        lcall data_in
        disp_str < set hours:>
        mov a,#0c5h
        lcall command
        mov a,#44h
        anl a,#1fh
        lcall disp_val
        lcall hexdec
akey1:        push acc
        mov a,#0c5h
        lcall command
        pop acc
        jb increment,achk3
        inc a
        cjne a,#13,aok3
        mov a,#1
aok3:        jnb increment,$
        lcall dechex
        lcall disp_val
        lcall hexdec
        sjmp akey1
achk3:        jb decrement,achk4
        dec a
        cjne a,#0,aok4
        mov a,#12
aok4:        jnb decrement,$
        lcall dechex
        lcall disp_val
        lcall hexdec
        sjmp akey1
achk4:        jb alarm_key,akey1

        lcall dechex
        mov alarm_hrs,a
        jnb alarm_key,$

        mov a,#1
        lcall command
        mov a,#80h
        lcall command
        mov a,#BELL
        lcall data_in
        disp_str < set am/pm:>
        mov a,#0c5h
        lcall command
        mov a,alarm_hrs
        anl a,#20h
        cjne a,#20h,its_pm
        disp_str <am>
        setb ampm_flag
        sjmp akey2
its_pm:        disp_str <pm>
        clr ampm_flag
akey2:        mov a,#0c5h
        lcall command
        jb increment,achk5
        jb ampm_flag,aok5
        setb ampm_flag
        disp_str <am>
        hold
        jnb increment,$
        sjmp akey2
aok5:        clr ampm_flag
        disp_str <pm>
        hold
        jnb increment,$
        sjmp akey2
achk5:        jb decrement,achk6
        jb ampm_flag,aok6
        setb ampm_flag
        disp_str <am>
        hold
        jnb decrement,$
        sjmp akey2
aok6:        clr ampm_flag
        disp_str <pm>
        hold
        jnb decrement,$
        sjmp akey2
achk6:        jb alarm_key,akey2
        jnb alarm_key,$
        mov a,alarm_hrs
        jb ampm_flag,anoam
        add a,#60h
        sjmp anopm
anoam:        mov a,alarm_hrs
        add a,#40h
anopm:        mov alarm_hrs,a
        mov ahour,alarm_hrs
        mov amin,alarm_min
        mov r6,#02h
        mov r0,#39h
        mov r1,#09h
        lcall rtc_ini
        mov a,#1h
        lcall command
        mov a,#81h
        lcall command
        mov a,#OK
        lcall data_in
        disp_str < Alarm On!>
        mov a,#0c4h
        lcall command
        mov a,alarm_hrs
        anl a,#1fh
        lcall disp_val
        mov a,#':'
        lcall data_in
        mov a,alarm_min
        lcall disp_val
        mov a,alarm_hrs
        anl a,#20h
        cjne a,#00h,ppm
        disp_str < am>
        sjmp ppass2
ppm:        disp_str < pm>
ppass2:        mov r7,#35
        setb tr0
looop:        jnb tf0,$
        clr tf0
        djnz r7,looop
        clr tr0
        mov a,#1h
        lcall command
        lcall disp_const
        mov a,#SPEAKER_ON
        lcall data_in
        setb alarm_off
        setb alarm_on
        clr alarm_flag
        clr alarm_flag
        ret

alarm_alarm:                                        ;Alarm Ring subroutine
        clr alarm_port
        mov r3,#0ffh
a_loop:        mov r4,#0ffh
        djnz r4,$
        djnz r3,a_loop
        setb alarm_port
        mov r3,#0ffh
a_loop1:mov r4,#0ffh
        djnz r4,$
        djnz r3,a_loop1
        clr alarm_port
        mov r3,#0ffh
a_loop2:mov r4,#0ffh
        djnz r4,$
        djnz r3,a_loop2
        setb alarm_port
        mov r3,#0ffh
a_loop3:mov r4,#0ffh
        djnz r4,$
        djnz r3,a_loop3
        clr alarm_port
        mov r3,#0ffh
a_loop4:mov r4,#0ffh
        djnz r4,$
        djnz r3,a_loop4
        setb alarm_port
        mov r3,#0ffh
a_loop5:mov r4,#0ffh
        djnz r4,$
        djnz r3,a_loop5
        clr alarm_port
        mov r3,#0ffh
a_loop6:mov r4,#0ffh
        djnz r4,$
        djnz r3,a_loop6
        setb alarm_port
        ret

dechex:        mov b,#0ah                                ;Decimal to Hexadecimal conversion
        div ab
        mov 60h,b
        mov b,#10h
        mul ab
        add a,60h
        ret

hexdec:        mov b,#10h                                ;Hexadecimal to deciaml conversion
        div ab
        mov 60h,b
        mov b,#0ah
        mul ab
        add a,60h
        ret

ascii:                                                ;ASCII lookup table
db        30h,31h,32h,33h,34h,35h,36h,37h,38h,39h

        end



Múi giờ GMT. Hiện tại là 04:04 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam