📄 file10.asm
字号:
;多用途控制器
;用三个键来控制点输出
;KEY1/KEY2用来控制输出的左右移动,KEY3用来控制总的开关
;同时,用数码管来显示当前开关的多少
;比如我们按动KEY1,相应数码管会显示对应的数据(增加),然后按动KEY3用来切换全部关闭/或者受
;KEY1/2控制
;比如我们切换成数码管显示0,然后,按动KEY3就可以看到LED会在全亮/全灭之间切换
;如果切换成全亮,然后按动KEY1/KEY2 会发生LED改变,同时数码管也会发生改变
;这个主要用于弱电控制强电的场合,比如继电器/接触器控制等
beep bit p3.7
segdata equ p0 ;数据 输出
sege equ p2.7 ;显示 选中
segb equ p2.6 ;位 选
segd equ p2.5 ;段 选
start bit 00h
sout equ 40h
count equ 41h
key1 bit p3.3
key2 bit p3.4
key3 bit p3.5
key equ 46h
; ****************** 以上预定义部分
org 00h
jmp main
org 030h
main:mov sp,#30h
lcall rest
lp: lcall process
jmp lp
; ********* 初始化 ************
rest: mov a,#00h ;寄存器初始化
mov b,#00h
mov sout,#00h ;初始化输出状态
mov count,#00h ;输出总数
mov p0,#0 ;禁止数码管
mov p2,#255 ;
mov p1,0ffh ;禁止 LED
clr beep ;禁止蜂鸣器
clr start ;清除开始标志
ret ;返回
; ************ 工作协调子程序 **********************
process: mov key,#00h ;设置键值
lcall pro_key ;查询键盘
mov a,key ;得到键值
jnz s ;用户有按键,去进行处理
ret ;否则直接返回
s: cjne a,#1,pro1 ;用户按 1 键
mov key,#00h ;重新设置键值
inc count ;数量自增
mov a,count ;如果count > 8返回
cjne a,#9,lk ;比较
mov count,#01h ;大于8 清零
mov sout,#00h ;
lk:mov a,count ;显示
mov dptr,#tab_nu ;获得表头
movc a,@a+dptr ;查的数据
clr sege ;选中显示
mov segdata,a ;输出
setb segd ;在第一位显示
nop
clr segd
mov segdata,#1
setb segb
nop
clr segb
setb c ;设置输出状态
mov a,sout ;重新调整状态
rlc a ;带进位左移
mov sout,a ;输出
jnb start,pro_end ;如果没有启动标志位返回
mov p1,sout ;输出
ret ;返回
pro1: cjne a,#2,pro2 ;如果不是2转移
mov key,#00h ;重新设置键值
mov a,count ;如果count =1 返回
cjne a,#0,ppk ;比较
mov count,#00h ;小于1 置1
inc count
mov sout,#01h ;
ppk:dec count ;重复
mov a,count ;显示
mov dptr,#tab_nu ;获得表头
movc a,@a+dptr ;查的数据
mov segdata,a ;输出
setb segd
nop
clr segd
mov segdata,#1 ;在第一位显示
setb segb
nop
clr segb
clr c ;清除标志位
mov a,sout ;准备数据
rrc a ;向右移动
mov sout,a ;重新设置
jnb start,pro_end ;没有设置开始标志返回
mov p1,sout ;输出
ret ;返回
pro2: cjne a,#3,pro_end ;如果不是3返回
mov key,#00h
jb start,pro4 ;设置启动/停止状态
setb start ;如果没有设置启动状态,设置
mov p1,sout ;输出
ret ;如果设置了启动状态
pro4: clr start ;清除启动状态
mov p1,#0ffh
pro_end: ret
; ************ 键盘程序 *****************************
pro_key: ;键盘查询子程序
setb key1 ;首先输出高电平,检测低电平的到来
setb key2 ;不同电路,可能检测方式不一样
setb key3
jb key1,ke1 ;如果用户没有按第一个键,到第下个处理部分,
mov key,#1 ;表示用户按了第一个键
lcall delay20ms ;软件延时,防止干扰
jmp pro_key ;重新查询,直到用户释放按键
ke1:jb key2,ke2 ;处理第二个按键,如果没有到下一个处理部分
mov key,#2 ;以下和第一个处理单元相似。
lcall delay20ms
jmp pro_key
ke2:jb key3,ke3
mov key,#3
lcall delay20ms
jmp pro_key
ke3:ret
;************ 定时20 ms *************
delay20ms:
push psw ; 保存原来的寄存器单元
clr psw.3 ; 设置新的寄存器
clr psw.4 ;
mov r0,#2 ; 延时参数1
mov r1,#250 ; 延时参数2
mov r2,#1 ; 延时参数3
dl1:djnz r0,dl1 ; 延时循环1
mov r0,#250 ; 重新设置循环数据
dl2:djnz r1,dl1 ; 开始第二道循环
mov r0,#240 ;
mov r1,#248 ;
dl3:djnz r2,dl1 ; 第三道循环
nop ; 修正定时精度
pop psw ; 恢复原来的寄存器组
ret ; 返回
;*********** end *******************
;***************************************************************************8
;这是数字显示表格,其中 带小数点的数字比不带小数点的数字大16
; 比如 0 的显示代码为 0;那么 0.的显示代码为 16;如此类推
tab_nu:
db 0c0h, 0f9h, 0a4h, 0b0h, 99h , 92h , 82h, 0f8h ; 数字0-7 不带小数点代码
db 80h , 90h, 88h , 83h , 0c6h, 0a1h, 86h, 8eh ; 数字8-f 不带小数点代码
db 40h , 79h, 24h , 30h , 19h , 12h , 02h, 78h ; 数字0-7 带小数点代码
db 00h , 10h, 08h , 03h , 46h , 21h , 06h, 0eh ; 数字8-f 带小数点代码
end ;告诉编译器本程序到此结束,一定需要加上,否则编译通不过。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -