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

📄 file10.asm

📁 单片机学习系统附的实验源代码
💻 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 + -