Thông báo

Collapse
No announcement yet.

Help code asemblly

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • 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
    Mail:

Về tác giả

Collapse

ah25.ah25 Tìm hiểu thêm về ah25.ah25

Bài viết mới nhất

Collapse

  • bqviet
    Trả lời cho Đấu tắt điện cho máy tính bảng
    bởi bqviet
    Bqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
    06-12-2025, 17:17
  • nguyendinhvan
    Trả lời cho Xin hỏi về mạch thu FM/AM trong catsette
    bởi nguyendinhvan
    Theo tôi, nó chỉ là cái Tuy- ê - nơ, hoặc là khối Trung Văn Tần, nó một phần trong cái Da đì ô thôi. Vì có thấy một chỗ có ba chân hàn, giiống như chân Cờ rít sờ tăng 455 ki nô hẹc. Còn khối Tuy ê nơ thì không nhìn thây cái Di ốt Va di cáp...
    05-12-2025, 19:59
  • afrendly
    Trả lời cho Đấu tắt điện cho máy tính bảng
    bởi afrendly
    Có vẻ ngoài hiểu biết của mình rồi. Cuối cùng mình quyết định tìm mua 2 pin trên Shopee, giá 200K thay vào. Tuy nhận pin được 1%, sạc mãi không vào nhưng cũng mở được máy lên. Vậy cũng tạm. Cảm ơn bạn đã hỗ trợ nhé....
    04-12-2025, 01:27
  • nick22
    Trả lời cho Máy điện châm ?
    bởi nick22
    Đúng như bạn nói, máy điện châm hiện nay trên thị trường đã khá đa dạng về mẫu mã, chức năng và giá thành.
    01-12-2025, 13:23
Đang tải...
X