
length := len(r)
if length <= 1 {
return r
}
num := length / 2
left := mergeSort(r[:num])
right := mergeSort(r[num:])
return merge(left, right)
}
func merge(left, right []int) (result []int) {
l, r := 0, 0
for l <len(left) &&r <len(right) {
if left[l] <right[r] {
result = append(result, left[l])
l++
} else {
result = append(result, right[r])
r++
}
}
result = append(result, left[l:]...)
result = append(result, right[r:]...)
return
}
----------------------------------------------------------文件名称:SZ03.ASM
程序功能:带定时闹铃及倒计时时钟
----------------------------------------------------------
--------――― 时钟程序部分 ---――――――――
----- ――― 程序初始化 ――――――――――
定义存放计时单元地址
....................
ALB EQU 20H.0闹铃行碧设置标志
....................
BUF EQU 30H 30~33H 连续4字节存放显示器数据
HOUR EQU 34H 存放小时变量
MIN EQU 35H 存放分钟变量
SEC EQU 36H 存放秒钟变量
DEDA EQU 37H 存放5 ms 计数值
....................
HHEQU 38H 闹铃设置小时变量
MMEQU 39H 闹铃设置分钟变量
....................
--------------------------------
SEC0 EQU 3AH 存放旧的秒数正链
MM_D EQU 3BH 倒数时间分钟数
SS_D EQU 3CH 倒数时间秒钟数
--------------------------------
按键输入引脚定义
K1EQU P2.4 按键1引脚定义
K2EQU P2.5 按键2引脚定义
K3EQU P2.6 按键3引脚定义
K4EQU P2.7 按键4引脚定义
压电喇叭和指示灯引脚定义
SPK EQU P3.4 压电喇叭控制信号
WLED EQU P1.0 工作指示灯引脚定义
程序开始执行地址
ORG 0H 程序代码由地址0开始执行
JMP MAIN
ORG 0BH 定时器 0 中断地址设置
JMP TO_SRV
--------- 主 程 序 --------――
MAIN:开始
...................
CLRALB清除闹铃标档清举志
...................
ACALL BZ 压电喇叭连续两次鸣响一声
ACALL BZ
ACALL LED_BL LED 闪动,表示程序开始执行
ACALL INIT初始变化量
ACALL INIT_TIMER 设置定时器
加载显示器初值数据
MOV A, #0C0H
MOV P0, A
无穷循环
LOOP: 无穷循环
ACALL CONV转换 时时 分分 数据
....................
ACALL TIME_PRO 检查闹铃时间
....................
ACALL DISP扫描显示
JBK1, M1 未按下K1键则继续扫描
ACALL LED_BL LED闪动
ACALL SET_TIME设置目前时间
JMPLOOP继续循环执行
设置闹铃时间
M1:JB K2,M2未按下K2键则继续扫描
.....................
ACALL LED_BL
ACALL SET_ATIME 设置闹铃时间
.....................
JMPLOOP继续循环执行
设置倒计时间
M2:JB K3, M3未按下K3键则继续扫描
---------------------------------
ACALL LED_BL
ACALL DOWN_ATIME 设置倒计时间
--------------------------------
JMP LOOP 继续循环执行
M3:JB K4,M4 未按下K4键则继续扫描
...................
CPL ALB
JNB ALB,M31
闹铃启动连续3次发出响声
ACALL BZ
ACALL BZ
ACALL BZ
...................
JMP LOOP 继续循环执行
....................
M31:
ACALL BZ 闹铃停止,发出一声响
JMP LOOP继续循环执行
...................
M4:
JMP LOOP 继续循环执行
----- 实现走时功能的子程序 ------――
使用定时器0模式0计时
INIT_TIMER: 初始化定时器,使用定时器0模式1计时
MOV TMOD,#00000000B设置定时器0工作模式为0
MOV IE, #10000010B启用定时器0中断产生
MOV TL0, #(8192-4900)MOD 32 加载低字节
MOV TH0, #(8192-4900)/32 加载高字节
SETB TR0 启动定时器0开始计时
RET
-----------―――
中断服务程序
TO_SRV:定时器0计时中断程序每隔5ms中断一次
PUSH ACC 将累加器放入堆栈
MOV TL0, #(8192-4900)MOD 32 加载低字节
MOV TH0, #(8192-4900)/32 加载高字节
INC DEDA5ms计数值加1
秒输出
MOV A, DEDA
CJNE A,#200,TT1 是否1s到了
MOV DEDA, #0计数值清除为0
CPL WLED LED灯亮灭变换
INC SEC 秒计数加1
MOV A, SEC
CJNE A, #60, TT1是否1min到了
分输出
INC MIN分计数加1
MOV SEC, #0 秒计数清除为0
MOV A, MIN
CJNE A, #60, TT1 是否1h到了
时输出
INC HOUR 小时计数加1
MOV MIN, #0 分计数清除为0
MOV A, HOUR
CJNE A,#24, TT1 是否24h到了
MOV SEC, #0秒钟变量清除为0
MOV MIN, #0分钟变量清除为0
MOV HOUR, #0 小时变量清除为0
TT1:
POP ACC 将累加器由堆栈取出
RETI
----―― 实现显示功能的子程序 ---――――
转换 时时:分分 数据
CONV:
转换小时数据
MOV A, HOUR
MOV B, #10
DIV AB
MOV DPTR,#TABLE 查表转换
MOVC A, @A+DPTR
MOV BUF, A
MOV A, B
MOVC A, @A+DPTR
MOV BUF+1, A
转换分钟数据
MOV A, MIN
MOV B, #10
DIV AB
MOV DPTR,#TABLE 查表转换
MOVC A, @A+DPTR
MOV BUF+2, A
MOV A, B
MOVC A, @A+DPTR
MOV BUF+3, A
RET
字型数据编码表
TABLE:
DB 0C0H,0F9H,0A4H,0B0H
DB 99H,92H,82H,0F8H
DB 80H,90H,88H,83H
DB 0C6H,0A1H,86H,8EH
---------――――
扫描显示
DISP:
MOV R0, #BUF 指向显示器显示缓冲区起始地址
MOV R2, #4 循环执行4次
MOV ACC, #11110111b加载扫描信号初值11110111B
S1:
PUSH ACC
MOV A, @R0 取出显示器数据
MOV P0, A 由P0送出一位显示器数据
POP ACC
MOV P2, ACC 由P2送出扫描输出信号
MOV R5, #2 延迟一会儿
ACALL DELAY
改变扫描码 EX:XXXX1011
RR A 累加器向右移动一位
INC R0 显示器显示缓冲区地址加1
DJNZ R2, S1 循环判断是否继续执行
RET
---―― 实现调整时间子程序 ――――――
设置目前时间
SET_TIME:
CLR TR0 定时器动作暂停
MOV SEC, #0 秒钟变量清除为0
L0:
ACALL DISP扫描显示
JB K2, L1 未按下K2键则继续扫描
JNB K2, $有按下则等待放开来
K2小时调整
INC HOUR 小时计数加1
MOV A, HOUR
CJNE A,#24, L11 是否24H到了
MOV HOUR, #0 小时变量清除为0
L11:
ACALL CONV转换显示数据
ACALL DISP扫描显示
JMPL0 继续程序执行
L1:JB K3, L2未按下K3键则继续扫描
JNB K3,$ 有按下则等待放开来
K3分钟调整.
INC MIN 分钟计数加1
MOV A, MIN
CJNE A,#60, L21 是否60 min到了
MOV MIN, #0 分钟变量清除为0
L21:
ACALL CONV转换显示数据
ACALL DISP扫描显示
JMPL0 继续程序执行
L2: JB K4,L0 未按下K4键则继续扫描
JNBK4, $ 有按下则等待放开来
ACALL BZ 压电喇叭鸣响一声
K4设置完成
ACALL LED_BL LED闪动
SETB TR0 启动定时器
RET
----―喇叭和指示灯等其它子程序 ----――
计时单元清零
INIT:
MOV DEDA, #0 5ms计数值清除为0
MOV SEC,#0 秒钟变量清除为0
MOV MIN,#0 分钟变量清除为0
MOV HOUR, #0 小时变量清除为0
RET
―――――――――――――
压电喇叭
BZ: 压电喇叭鸣响一声
MOV R6, #250
B1: ACALL DEX
CPL SPK
DJNZ R6,B1
MOV R5, #50 #10
ACALL DELAY
RET
----------―――
工作指示
LED_BL: 工作指示灯闪烁
MOV R4,#6
LE1:CPL WLED 位反向
MOV R5,#25 #5
ACALL DELAY
DJNZ R4, LE1 延迟50ms
RET
----------―――
延时子程序
DELAY: 总延迟时间 R5* 2ms
MOV R6,#10 #50
D1:MOV R7,#100
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,DELAY
RET
----------―――
压电喇叭短暂延时子程序
DEX: MOV R7,#180 短暂延时
DE1: NOP
DJNZ R7, DE1
RET
-------―― 增加定时闹铃程序部分 -------――
―――――――― 设置闹铃时间 ―――――――――
设置闹铃时间
SET_ATIME:
ACALL CONVA 加载闹铃时间数据
N0:
ACALL DISP
-----------
JB K2, N1 未按下K2键则继续扫描
JNB K2, $有按下则等待放开来
K2调整小时
INC HH 小时数加1
MOV A, HH
CJNE A, #24,N11 是否24h到了
MOV HH,#0小时请为0
N11:
ACALL CONVA 加载闹铃时间数据
ACALL DISP 扫描显示
JMPN0 继续按键扫描
------------
N1: JB K3, N2未按下K3键则继续扫描
JNB K3, $ 有按下则等待放开来
K3调整分钟
INC MM调整分钟数
MOV A,MM 分钟数加1
CJNE A, #60,N21是否60min到了
MOV MM, #0分钟数请为0
N21:
ACALL CONVA 加载闹铃时间数据
ACALL DISP扫描显示
JMPN0 继续按键扫描
------------
N2: JB K4, N0 未按下K4键则继续扫描
JNBK4, $ 等K4键放开
K4设置完成......
ACALL LED_BL LED闪动
ACALL CONV加载现在时间数据
RET
―――――――― 加载闹铃时间数据 ―――――――
转换 时时:分分 数据
CONVA:
转换小时数据
MOV A, HH
MOV B, #10
DIV AB
-----------
MOV DPTR,#TABLE 查表转换
MOVC A, @A+DPTR
MOV BUF, A
-----------
MOV A, B
MOVC A, @A+DPTR
MOV BUF+1, A
转换分钟数据
MOV A, MM
MOV B, #10
DIV AB
-----------
MOV DPTR,#TABLE 查表转换
MOVC A, @A+DPTR
MOV BUF+2, A
-----------
MOV A, B
MOVC A, @A+DPTR
MOV BUF+3, A
RET
―――――――― 检查闹铃时间处理 ――――――――
检查是否启动闹铃
TIME_PRO:
JB ALB, TI3
RET
――――――――――――――
检查闹铃时间是否到了
TI3:
MOV A, HOUR
MOV B,HH
CJNE A, B, BK 检查闹铃小时时间
-----------
MOV A, MIN
MOV B,MM
CJNE A, B, BK 检查闹铃分钟时间
-----------
ACALL TIME_OUT执行检查闹铃时间到了处理
BK:
RET
-------- 执行闹铃时间处理 ――――――――
TIME_OUT: 所设置的闹铃数据到了
X1: ACALL LED_BL LED闪动
ACALL BZ 压电喇叭发出哗的一声
按下K4键停止闹铃
JBK4, X1 等待是否按下K4键
JNB K4,$ 若有按下键则等待按键放开来
ACALL LED_BL LED闪动
CLR ALB 清除闹铃位
RET
************************ 增加倒计时程序部分 *********************
---------- 设置倒数时间 ----------
设置倒数时间
DOWN_ATIME:
CLR TR0 定时器动作暂停
MOV SS_D, #1 秒钟变量为1
S0:
ACALL DISP 扫描显示
-----------
按K2分钟数增加
JB K2, S12 未按下K2继续扫描
JNB K2, $有按下则等待放开来
INC MM_D 分钟数加1
MOV A, MM_D
CJNE A, #60,S11 是否60min到了
MOV MM_D,#0分钟变量请除为0
S11:
ACALL DOWN_CONV 显示倒数的时间
ACALL DISP 扫描显示
JMPS0 继续对按键扫描
------------
按K3分钟数减少
S12: JB K3, S2未按下K3继续扫描
JNB K3, $ 有按下则等待放开来
DEC MM_D分钟数减少1
MOV A,MM_D
CJNE A, #0,S21 是否为0?
MOV MM_D, #60分钟数赋值为60
S21:
ACALL DOWN_CONV 加载倒数时间数据
ACALL DISP扫描显示
JMPS0 循环执行
------------
S2: JB K4, S0 未按下K4继续扫描
JNBK4, $ 等K4键放开
K4设置完成......
ACALL BZ 响4声
ACALL BZ
ACALL BZ
ACALL BZ
ACALL LED_BL LED闪动
SETB TR0 启动定时器
S3:
ACALL DOWN_TIME检查倒计时
ACALL DOWN_CONV加载倒数时间数据
ACALL DISP 扫描显示
JMP S3
RET
---------------- 加载倒计时时间 -----------------------
显示倒数的分钟数
DOWN_CONV:
MOV A, MM_D
MOV B,#10 设置被除数
DIV AB 除法运算,结果A存商数,B存余数
MOV DPTR,#TABLE查表转换
MOVC A, @A+DPTR
MOV BUF+2, A 商数存入BUF+2
MOV A, B 余数暂存入A
MOVC A, @A+DPTR 查表转换
MOV BUF+3, A 余数存入BUF+3
RET
---------- 检查倒计时 ------------
检查倒计时
DOWN_TIME: 检查是否倒数终止
MOV A,SEC 加载现在秒数
MOV B,SEC0载入旧秒数
CJNE A,B,D01 是否过了1秒
RET
-----------------------------------
D01:
MOV SEC0,SEC 记录旧的秒数
DEC SS_D 秒数减1
MOV A,SS_D
CJNE A,#0, D11 秒钟数是否为0
MOV A,MM_D
CJNE A,#0,D12 分钟数是否为0
秒钟数=0 且 分钟数=0 则倒数终止
ACALL TIME_OUT 倒数终了处理程序
JMP LOOP
RET
-----------
D12:
MOV SS_D,#59秒钟数=59
DEC MM_D分钟数减1
D11:
ACALL DOWN_CONV 显示倒计时时间
RET
------------------------------
END
ASM文件是proE生成的组立图文件,要下个proE才能打开,还有最好是5.0的,低版的是打不开高版本的,所以下个高的保险,但文行枣瞎件比较大,你不介意的话,我打开岩基后,发档空个图给你欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)