您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>源码下载>汇编编程>

汇编语言 八路抢答器与99秒计数器

大小:0.1 MB 人气: 2017-09-06 需要积分:0

1、八路抢答器

     ORG 0000H
     SETB P3.7
     MOV R0, #00H
     MOV A , #0FFH
     MOV P2 , A
L1:  MOV A , P1
     XRL  A , #0FFH
     JZ L1
L2:  MOV B , #02H
     DIV AB
     INC R0
     JNZ L2
     MOV DPTR,#TABLE
     MOV A,R0
     MOVC A , @A+DPTR
     MOV P2 ,A
     MOV R3 , #0FFH
SS:  CLR P3.7
     ACALL DELAY
     SETB P3.7
     ACALL DELAY
     DJNZ R3,SS
     
L4:  SJMP   L4
DELAY: MOV R1, #249
L3:  NOP
     NOP
     DJNZ R1, L3
     RET
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;0-9
     END
 

 

2、99秒计数器
counter equ 30h;分配计数器内存 
timer   equ 31h;计数速度控制计数器 
speed   equ 50;计数速度调节(0到255) 
led7seg equ p0;数码管段位接口 
ledbit  equ p2;数码管位选接口
   org 0000h
   ljmp start
 
   org 0030h
start: mov sp,#60h;设置堆栈指针 
   mov counter,#0;计数器清零初始化 
loop:  mov timer,#speed;计数速度设定 
loop0: mov a,counter;取出计数值到累加器 
   mov b,#10;设定十进制模 
   div ab;除法,十六进制转十进制 
   da a;BCD码调整 
   anl a,#0fh;清除高位 
   mov dptr,#ledmap;取字符译码表头地址 
   movc a,@a+dptr;查表字符译码 
   mov ledbit,#0ffh;关闭数码管,修改数据前必须关闭 
   mov led7seg,a;送出字符段码 
   mov ledbit,#0feh;打开一位数码管 
   acall delay;延时一段时间
   mov dptr,#ledmap
   mov a,b;取出十位值 
   movc a,@a+dptr
   mov p2,#0ffh
   mov p0,a
   mov p2,#0fdh
   acall delay
   djnz timer,loop0;速度控制,多次显示后计数器+1  
   inc counter;计数器+1 
   mov a,counter
   cjne a,#100,loop;100溢出判断
   mov counter,#0;溢出后归零
   sjmp loop
;经典延时模块 
delay: mov r7,#100
dd:  mov r6,#10
   djnz r6,$
   djnz r7,dd
   ret
;共阴极数码管字符译码表 
ledmap: db 03FH,006H,05BH,04FH,066H
   db 06DH,07DH,007H,07FH,06FH
   end
 

3、8*8LED点阵电子屏字符显示程序

描述:                                                                                                                    
;*             8*8LED点阵电子屏字符显示程序
;*             四个显示字符数据表放在40H-7FH单元内,字符用8*8点阵,R4(30H)用于
;              控制显示静止字的时间,R5(31H)静止字显示跳转地址步距,B内放显示首址                                                       
;*             COL-(8--1)分别接 (P0.0---P0.7)  即J27-8脚接P0.0  J27-7脚接P0.1
;*             J27-6脚接P0.2  J27-5脚接P0.3    J27-4脚接P0.4  J27-3脚接P0.5
;*             J27-2脚接P0.6  J27-1脚接P0.7    
;*             S1逐字显示功能程序  S3控制左移显示功能程序                                                                                                                                           
;******************************************************************************
           S1      BIT    P3.3    ;
         S2      BIT    P3.4    ;
         S3      BIT    P3.5    ;
         S4      BIT    P3.6    ;
;******************************************************************************
                ORG     0000H         ;程序执行开始地址
                LJMP    START         ;跳至START执行
                ORG     0003H         ;外中断0中断入口地址
                RETI                  ;中断返回(不开中断)
                ORG     000BH         ;定时器T0中断入口地址
                RETI                  ;中断返回(不开中断)
                ORG     0013H         ;外中断1中断入口地址
                RETI                  ;中断返回(不开中断)
                ORG     001BH         ;定时器T1中断入口地址
                RETI                  ;中断返回(不开中断)
                ORG     0023H         ;串行口中断入口地址
                RETI                  ;中断返回(不开中断)
                ORG     002BH         ;定时器T2中断入口地址
                RETI                  ;中断返回(不开中断)
;******************************************************************************
;主体程序
START:  
                MOV      SP,#60H      ;堆栈在60H开始       
                MOV      20H,#00H     ;20H内存单元清0
                SETB     00H          ;20H.0位置1
START1:         LCALL    CLEARMEN     ;调用上电初始化子程序
                JB       00H,FUN0     ;20H.0位为1,执行FUN0
                JB       01H,FUN1     ;20H.1位为1,执行FUN1
                JB       02H,FUN2     ;20H.2位为1,执行FUN2
                AJMP     START1       ;跳回START1循环
;******************************************************************************
;初始化程序        
CLEARMEN:  
                MOV     A,#0FFH       ;四端口置1
                MOV     P1,A          ;
                MOV     P2,A          ;
                MOV     P3,A          ;
                MOV     P0,A          ;
                MOV     DPTR,#TABLE   ;取"东哥单片机学习网"字符表首址值
                CLR     A             ;
                MOV     21H,A         ;21H-24H内存单元清0
                MOV     22H,A         ;
                MOV     23H,A         ;
                MOV     24H,A         ;
                MOV     R3,A          ;R3寄存器清0
                MOV     R1,#40H       ;设字符表移入内存单元首址
                MOV     R2,#20H       ;设查表次数(32次)
CLLOOP:         MOVC    A,@A+DPTR     ;查表将"东哥单片机学习网"字符数据移入内存单元
                MOV     @R1,A         ;
                MOV     A,R3          ;
                INC     A             ;
                MOV     R3,A          ;
                INC     R1            ;
                DJNZ    R2,CLLOOP     ;查表32次,不到转CLLOOP再查
                RET                   ;子程序返回
;******************************************************************************
;键扫描子程序
KEYWORK:        MOV      P3,#0FFH     ;置输入状态
                JNB      S1,KEY1      ;P3.3为0(键按下)转KEY1
;                JNB      S2,KEY2      ;P3.4为0(键按下)转KEY2
                JNB      S3,KEY3      ;P3.5为0(键按下)转KEY3
KEYRET:         RET                   ;无键按下,子程序返回
;******************************************************************************
;按键1功能处理
KEY1:           LCALL   DL10MS        ;延时10MS削抖动
                JB      S1,KEYRET     ;是干扰转KEYRET结束
                SETB    00H           ;置逐字显示方式标志(20H.0=1)
                CLR     01H           ;
                CLR     02H           ;
                RET                   ;子程序返回
;******************************************************************************
; 按键2功能处理
KEY2:           LCALL   DL10MS        ;
                JB      S2,KEYRET     ;
                SETB    01H           ;置上移显示方式标志(20H.1=1)
                CLR     00H           ;
                CLR     02H           ;
                RET                   ;
;******************************************************************************
; 按键3功能处理
KEY3:           LCALL   DL10MS        ;
                JB      S3,KEYRET     ;
                SETB    02H           ;置左移显示方式标志(20H.2=1)
                CLR     01H           ;
                CLR     00H           ;
                RET
;******************************************************************************
;逐字显示功能程序
FUN0:           MOV     30H,#80H     ;1帧显示时间控制(约1秒)
                MOV     31H,#08H     ;换帧跳转步距为8
                LJMP    DISP1        ;转显示子程序DISP1
; 上移显示功能程序
FUN1:           MOV     30H,#25H     ;1帧显示时间控制(约80毫秒)
                MOV     31H,#01H     ;换帧跳转步距为1
                LJMP    DISP1        ;转显示子程序DISP1
;左移显示功能程序
FUN2:           LJMP    DISP2        ;
;******************************************************************************
;显示控制程序
DISP1:          MOV     B,#40H       ;显示数据首址
                MOV     R4,30H       ;放入1帧显示时间控制数据
                MOV     R5,31H       ;放入跳转步距控制数据
LOOP:           LCALL   DISPLAY      ;调用显示子程序一次
                DJNZ    R4,LOOP      ;1帧显示时间未到再转LOOP循环
                MOV     R4,30H       ;1帧显示时间到,重装初值
                MOV     A,B          ;
                CJNE    A,#58H,CONT  ;不是末地址转CONT
                AJMP    START1       ;是末地址,一次显示结束跳回START1
CONT:           ADD     A,R5         ;次帧扫描首址调整
                MOV     B,A          ;
                AJMP    LOOP         ;转LOOP进行次帧扫描
;******************************************************************************
;显示子程序,字符数据从P0口输出,扫描控制字从P2口输出,显示1帧约需8MS
DISPLAY:        MOV     A,#0FFH      ;
                MOV     P0,A         ;关显示数据
                MOV     P2,A         ;关扫描
                MOV     R6,#0FEH     ;赋扫描字
                MOV     R0,B         ;赋显示数据首地址
                MOV     R7,#08H      ;一次扫描8行
DISLOOP:        MOV     A,@R0        ;取显示数据
                MOV     P0,A         ;放入P0口
                MOV     P2,R6        ;扫描输出(显示某一行)
                ACALL   DL1MS        ;亮1毫秒
                INC     R0           ;指向下一行数据地址
                MOV     A,R6         ;扫描字移入A
                RL      A            ;循环左移一位
                MOV     R6,A         ;放回R6
                DJNZ    R7,DISLOOP   ;8行扫描未完转DISLOOP继续
                RET                  ;8行扫描结束
;******************************************************************************
;左移显示控制程序
DISP2:          MOV     R5,#32       ; 左移32次
DISP22:         LCALL   DISPP        ;调用左移显示控制子程序
                LCALL   MOVH         ;调用高位移出处理子程序MOVH
                LCALL   MOVH1        ;调用高位移出处理子程序MOVH1
  DJNZ R5,DISP22    ;左移显示32次控制
                LJMP    START1       ;跳回主程序
;******************************************************************************
; 左移显示控制子程序
DISPP:          MOV     B,#40H       ;第一显示字符首址
                MOV     R4,#25H      ;1帧显示时间控制
DISPP1:         LCALL   DISPLAY      ;调用显示子程序一次
                DJNZ    R4,DISPP1    ;1帧显示时间不到转DISPP再循环
                RET
;******************************************************************************
; 高位移出处理子程序。将"东哥单片机学习网"6个字符数据的最高位移出至21H-24H单元内
MOVH:           MOV     R1,#21H      ;最高位移出存放单元首址
                MOV     R0,#40H      ;"东哥单片机学习网"字符数据首址
                MOV     R2,#08H      ;每"字"移8次
MOV1:           MOV     A,@R0        ;取"电子设计"字符数据
                CLR     C            ;清进位C
                RLC     A            ;带进位循左移
                MOV     @R0,A        ;放回原单元
                MOV     A,@R1        ;存放单元数据入A
                RRC     A            ;带进位循右移
                MOV     @R1,A        ;放回存放单元
                INC     R0           ;字符数据地址加1
                DJNZ    R2,MOV1      ;移8次未完转MOV1再移
                MOV     R2,#08H      ;8次移完赋初值
                INC     R1           ;存放单元地址加1
                MOV     A,R1         ;判断地址是否小于25H
                SUBB    A,#25H       ;
                JZ      OUT          ;等于25H退出
                AJMP    MOV1         ;小于25H转MOV1继续
OUT:            RET                  ;子程序结束
;******************************************************************************
;高位移出处理子程序。
MOVH1:          MOV     A,21H        ;21H与22H、23H、24H单元数据循交换
                XCH     A,24H        ;21H与24H全交换
                XCH     A,23H        ;23H与24H全交换
                XCH     A,22H        ;23H与22H全交换
                MOV     21H,A        ;22H与21H全交换
                MOV     R1,#21H      ;以下是重新组成显示字符数据表程序
                MOV     R0,#40H      ;将21H-24H的各位分别移入50H-6FH的低位
                MOV     R2,#08H      ;移位次数
MOV2:           MOV     A,@R0        ;取字符数据
                RR      A            ;右移
                MOV     @R0,A        ;放回原单元
                MOV     A,@R1        ;取原移出最高位存放单元数
                CLR     C            ;清C
                RRC     A            ;带进位循环右移
                MOV     @R1,A        ;放回原单元
                MOV     A,@R0        ;取字符数据
                RLC     A            ;带进位循环左移
                MOV     @R0,A        ;放回字符数据
                INC     R0           ;字符数据地址加1
                DJNZ    R2,MOV2      ;8次未完转MOV2再继续
                MOV     R2,#08H      ;8次完赋初值
                INC     R1           ;原移出最高位存放单元地址加1
                MOV     A,R1         ;判断地址是否小于25H
                SUBB    A,#25H       ;
                JZ      OUT          ;等于25H转OUT退出
                AJMP    MOV2         ;小于25H转MOV2继续
;******************************************************************************
;1毫秒延时子程序,采用调用扫键子程序延时,可快速读出按纽的状态
DL1MS:          MOV     R3,#64H  ;100*(10+2)us
LOOPK:          LCALL   KEYWORK
                DJNZ    R3,LOOPK
                RET
;******************************************************************************
;0.5毫秒延时子程序
DL512:          MOV     R2,#0FFH
LOOP1:          DJNZ    R2,LOOP1
                RET
;******************************************************************************
; 10毫秒延时子程序
DL10MS:         MOV     R3,#14H
LOOP2:          LCALL   DL512
                DJNZ    R3,LOOP2
                RET
;******************************************************************************
;"电子设计"显示用ROM数据表
TABLE:          DB      0DDH,88H,0DDH,88H,5DH,0D8H,0DDH,0D8H     ;   桂
                DB      0F7H,81H,0EFH,0D7H,81H,0E3H,0D5H,0B6H    ;   东
                DB      0B1H,0B5H,04H,0BFH,0B1H,0B5H,9BH,0A4H    ;   设
                DB      0BBH,0BBH,1BH,0A0H,0BBH,0BBH,9BH,0BBH    ;   计
                DB      00H,00H,00H,00H
                END                                              ;程序结束

非常好我支持^.^

(0) 0%

不好我反对

(0) 0%

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!