编程软件m2asm1.39

编程软件m2asm1.39,第1张

func mergeSort(r []int) []int {

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的,低版的是打不开高版本的,所以下个高的保险,但文行枣瞎件比较大,你不介意的话,我打开岩基后,发档空个图给你


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12343285.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存