⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.asm

📁 介绍用单片机实现时钟的程序,可共大家学习,交流.
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;*****************************************************
;
;     This programme is for study Ver1.0.0 beta
;            The main control programe
;This programme must be run in 12MHz standard settings
;               Designer: cqmcu.com
;           Copyright 2007 koiistudio
;
;*****************************************************

;*****************************************************
;参数定义
;*****************************************************

beep                    bit     p1.5                    ;蜂鸣器引脚
digital_bit             equ     08h                     ;显示位
keys_byte               equ     09h                     ;按键字节
digital_flash_time      equ     0ah                     ;闪烁计时
digital_flash_bit       equ     0bh                     ;闪烁位
aleart_data             equ     0ch                     ;时间报警字节(连续两字节)
aleart_byte             equ     0eh                     ;报警设置字节
digital_byte            equ     10h                     ;显存首址,连续8字节为显存
date_data               equ     20h                     ;时钟数据首地址

;*****************************************************
;主程序
;*****************************************************

                        org	0000h
                        jmp	start

                        org     000bh
                        jmp     time_int

                        org     0013h
                        jmp     keys_int

                        org	0030h
start:                  mov     p0,#0
                        mov     p1,#0fh
                        mov     p2,#0
                        mov     p3,#0ffh

                        mov	sp,#60h                 ;堆栈地址
                        mov     r0,#7fh                ;Clear the ram
                        clr     a
main_clear0:            mov     @r0,a
                        djnz    r0,main_clear0

                        mov     digital_bit,#1

                        mov     r0,#aleart_data             ;默认的报警时间
                        mov     @r0,#00h                    ;分
                        inc     r0
                        mov     @r0,#07h                    ;时

                        call    timer_set
                        call    iicread
                        setb    ex0
                        setb    ex1
                        setb    ea
                        call    beep1
main_wait:              call    digital
                        mov     a,keys_byte
                        cjne    a,#0,keysmanagement
                        jmp     main_wait

keysmanagement:         call    keys_management
                        mov     keys_byte,#0
                        jmp     main_wait

;*****************************************************
;子程序文件载入
;*****************************************************

;*****************************************************
;时间报警校验程序
;*****************************************************

aleart_check:           mov     a,#date_data
                        add     a,#3
                        mov     r0,a
                        mov     r1,#aleart_data
                        mov     a,@r0
                        mov     r3,a
                        mov     a,@r1
                        cjne    a,03h,aleart_check_ret
                        inc     r0
                        inc     r1
                        mov     a,@r0
                        mov     r3,a
                        mov     a,@r1
                        cjne    a,03h,aleart_check_ret
                        call    beep3
aleart_check_ret:       ret

;*****************************************************
;短鸣一声
;*****************************************************

beep1:                  mov     1fh,#04h
                        setb    beep
beep1_1:                lcall   digital
                        lcall   digital
                        lcall   digital
                        lcall   digital
                        lcall   digital
                        lcall   digital
                        djnz    1fh,beep1_1
                        clr     beep
                        ret

;*****************************************************
;长鸣一声
;*****************************************************

beep2:                  mov     1fh,#1eh
                        setb    beep
beep2_1:                lcall   digital
                        lcall   digital
                        lcall   digital
                        lcall   digital
                        lcall   digital
                        lcall   digital
                        djnz    1fh,beep2_1
                        clr     beep
                        ret

;*****************************************************
;短鸣两声
;*****************************************************

beep3:                  mov     1fh,#04h
                        setb    beep
beep3_1:                lcall   digital
                        lcall   digital
                        lcall   digital
                        lcall   digital
                        lcall   digital
                        lcall   digital
                        djnz    1fh,beep3_1
                        clr     beep
                        mov     1fh,#04h
beep3_2:                lcall   digital
                        lcall   digital
                        lcall   digital
                        lcall   digital
                        lcall   digital
                        lcall   digital
                        djnz    1fh,beep3_2
                        setb    beep
                        mov     1fh,#04h
beep3_3:                lcall   digital
                        lcall   digital
                        lcall   digital
                        lcall   digital
                        lcall   digital
                        lcall   digital
                        djnz    1fh,beep3_3
                        clr     beep
                        ret

;*****************************************************
;数码管显示
;*****************************************************

digital:	       mov     a,digital_bit                ;根据显示位置读取不同的显示内容
                       jb      acc.0,digital_check0
                       jb      acc.1,digital_check1
                       jb      acc.2,digital_check2
                       jb      acc.3,digital_check3
                       jb      acc.4,digital_check4
                       jb      acc.5,digital_check5
                       jb      acc.6,digital_check6
                       jb      acc.7,digital_check7
                       call    beep2
                       ret
digital_check0:        mov     r0,#digital_byte
                       mov     a,@r0                        ;秒
                       jmp     digital_display
digital_check1:        mov     r0,#digital_byte
                       inc     r0
                       mov     a,@r0
                       jmp     digital_display
digital_check2:        mov     r0,#digital_byte             ;分
                       inc     r0
                       inc     r0
                       mov     a,@r0
                       setb    acc.4                        ;加小数点
                       jmp     digital_display
digital_check3:        mov     a,#digital_byte
                       add     a,#3
                       mov     r0,a
                       mov     a,@r0
                       jmp     digital_display
digital_check4:        mov     a,#digital_byte              ;时
                       add     a,#4
                       mov     r0,a
                       mov     a,@r0
                       setb    acc.4                        ;加小数点
                       jmp     digital_display
digital_check5:        mov     a,#digital_byte
                       add     a,#5
                       mov     r0,a
                       mov     a,@r0
                       anl     a,#83h                       ;屏蔽无效位
                       jmp     digital_display
digital_check6:        mov     a,#digital_byte
                       add     a,#6
                       mov     r0,a
                       mov     a,#20h
                       jmp     digital_display
digital_check7:        mov     a,#digital_byte
                       add     a,#7
                       mov     r0,a
                       mov     a,#20h

digital_display:       push    acc
                       mov     a,digital_flash_time
                       anl     a,#7fh                       ;最高位表示显示状态:1为显示;0为不显示;其余位为记数值
                       cjne    a,#80,digital_display_00
                       mov     a,digital_flash_time
                       cpl     acc.7
                       anl     a,#80h
                       mov     digital_flash_time,a
                       jmp     digital_display_01
digital_display_00:    inc     digital_flash_time
digital_display_01:    pop     acc
                       jb      acc.7,digital_display_1      ;最高位表示现在是否选择了该位,若是则闪烁
digital_display_0:     mov     dptr,#data_tab_digital
                       movc    a,@a+dptr
                       cpl     a                            ;数据是共阴数码管的,用在共阳数码管上就需要取反
                       mov     p2,#0
                       mov     p0,a
                       mov     a,digital_bit
                       mov     p2,a
                       rl      a
                       mov     digital_bit,a
                       call    time2_5ms
                       ret

digital_display_1:      push    acc
                        mov     a,digital_flash_time
                        jb      acc.7,digital_display_2
                        pop     acc                           ;若最高位为零则消隐
                        mov     a,#20h
                        jmp     digital_display_0
digital_display_2:      pop     acc                           ;否则正常显示
                        clr     acc.7
                        jmp     digital_display_0

;*****************************************************
;共阴数码管显示数据
;排列为:0-F, 0.-F.
;端口排列:p07   p06  p05  p04  p03  p02  p01  p00
;段排列为: d    dp    e    c    g    b    f    a
;*****************************************************

data_tab_digital:      db     0b7h,014h,0adh,09dh,01eh,09bh,0bbh,015h
                       db     0bfh,09fh,03fh,0bah,0a8h,0bch,0abh,02bh
                       db     0f7h,054h,0edh,0ddh,05eh,0dbh,0fbh,055h
                       db     0ffh,0dfh,07fh,0fah,0e8h,0fch,0ebh,06bh
                       db     000h


;*****************************************************
;参数定义
;*****************************************************

scl                     bit     p1.6                    ;时钟引脚
sda                     bit     p1.7                    ;数据引脚

;*****************************************************
;时钟数据设置
;*****************************************************

timer_set:              mov     r0,#date_data           ;时钟相关设置
                        mov     @r0,#0                  ;Control status 1
                        inc     r0
                        mov     @r0,#11h                ;Control status 2
                        inc     r0
                        mov     @r0,#00h                ;Seconds
                        inc     r0
                        mov     @r0,#15h                ;Minutes
                        inc     r0
                        mov     @r0,#15h                ;Hours
                        inc     r0
                        mov     @r0,#30h                ;Days
                        inc     r0
                        mov     @r0,#07h                ;Weekdays
                        inc     r0
                        mov     @r0,#03h                ;Months
                        inc     r0
                        mov     @r0,#03h                ;Years
                        inc     r0
                        mov     @r0,#80h                ;Minute alarm
                        inc     r0
                        mov     @r0,#80h                ;Hour alarm
                        inc     r0
                        mov     @r0,#80h                ;Day alarm
                        inc     r0
                        mov     @r0,#80h                ;Weekday alarm
                        inc     r0
                        mov     @r0,#83h                ;CLKout control
                        inc     r0
                        mov     @r0,#82h                ;Timer control
                        inc     r0
                        mov     @r0,#01h                ;Timer
                        call    timer_write             ;设置时钟
                        ret

;*****************************************************
;PCF8563应用程序
;写PCF8563
;入口参数:发送缓冲@r1
;*****************************************************

timer_write:            call	iicstart
                        mov	a,#0a2h			;器件地址和写指令
                        call	iicwbyte
                        call	iiccack
                        jc	return_0
                        mov	a,#0		        ;字节子地址
                        call	iicwbyte
                        call	iiccack
                        jc	return_0
                        mov     r1,#date_data           ;数据
                        mov     r0,#16                  ;字节数
iicwrite0:              mov	a,@r1                   ;数据
                        call	iicwbyte
                        call	iiccack
                        jc	return_0
                        inc     r1
                        djnz    r0,iicwrite0
                        call    iicstop
                        ret
return_0:               call    beep3
                        call	iicstop
                        mov     a,#0e5h
                        ret

;*****************************************************
;读PCF8563
;出口参数:接收缓冲@r1
;*****************************************************

iicread:                call	iicstart
                        mov	a,#0a3h			;器件地址和读命令
                        call	iicwbyte
                        call	iiccack
                        jc	retrdn
                        mov     r1,#date_data
                        mov     r0,#15                  ;共读取16个字节数据
iicread0:               call	iicrbyte
                        call    iicack
                        inc     r1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -