📄 main.asm
字号:
;*****************************************************
;
; 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 + -