×
单片机 > 单片机程序设计 > 详情

LED电子屏字符显示器程序

发布时间:2020-06-04 发布时间:
|

;         四个显示字符数据表放在50H-6FH单元内,字符用8*8点阵,R4(30H)用于 
;         控制显示静止字的时间,R5(31H)静止字显示跳转地址步距,B内放显示首址 

;************;

;中断入口程序; 
;************; 

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             ;中断返回(不开中断) 

;初始化程序 
CLEARMEN:       MOV     A,#0FFH      ;四端口置1 
                MOV     P1,A         ; 
                MOV     P2,A         ; 
                MOV     P3,A         ; 
                MOV     P0,A         ; 
                MOV     DPTR,#TAB    ;取"电子设计"字符表首址值 
                CLR     A            ; 
                MOV     21H,A        ;21H-24H内存单元清0 
                MOV     22H,A        ; 
                MOV     23H,A        ; 
                MOV     24H,A        ; 
                MOV     R3,A         ;R3寄存器清0 
                MOV     R1,#50H      ;设字符表移入内存单元首址 
                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                   ;子程序返回 

;主体程序 
START:          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循环 

;键扫描子程序 
KEYWORK:        MOV       P1,#0FFH    ;置输入状态 
                JNB       P1.0,KEY1   ;P1.0为0(键按下)转KEY1 
                JNB       P1.1,KEY2   ;P1.1为0(键按下)转KEY2 
                JNB       P1.2,KEY3   ;P1.2为0(键按下)转KEY3 
KEYRET:         RET                   ;无键按下,子程序返回 
;按键1功能处理 
KEY1:           LCALL   DL10MS        ;延时10MS削抖动 
                JB      P1.0,KEYRET   ;是干扰转KEYRET结束 
                SETB    00H           ;置逐字显示方式标志(20H.0=1) 
                CLR     01H           ; 
                CLR     02H           ; 
                RET                   ;子程序返回 
; 按键2功能处理 
KEY2:           LCALL   DL10MS        ; 
                JB      P1.1,KEYRET   ; 
                SETB    01H           ;置上移显示方式标志(20H.1=1) 
                CLR     00H           ; 
                CLR     02H           ; 
                RET                   ; 
; 按键3功能处理 
KEY3:           LCALL   DL10MS        ; 
                JB      P1.2,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,#0AH     ;1帧显示时间控制(约80毫秒) 
                MOV     31H,#01H     ;换帧跳转步距为1 
                LJMP    DISP1        ;转显示子程序DISP1 
;左移显示功能程序 
FUN2:           LJMP     DISP2       ; 

;显示控制程序 
DISP1:          MOV     B,#50H       ;显示数据首址 
                MOV     R4,30H       ;放入1帧显示时间控制数据 
                MOV     R5,31H       ;放入跳转步距控制数据 
LOOP:           LCALL   DISPLAY      ;调用显示子程序一次 
                DJNZ    R4,LOOP      ;1帧显示时间未到再转LOOP循环 
                MOV     R4,30H       ;1帧显示时间到,重装初值 
                MOV     A,B          ; 
                CJNE    A,#68H,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        ;扫描输出(显示某一行) 
                LCALL   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,#50H    ;第一显示字符首址 
                MOV     R4,#25H   ;1帧显示时间控制 
DISPP1:         LCALL   DISPLAY   ;调用显示子程序一次 
                DJNZ    R4,DISPP1  ;1帧显示时间不到转DISPP再循环 
                RET 

; 高位移出处理子程序。将"电子设计"四个字符数据的最高位移出至21H-24H单元内 
MOVH:           MOV     R1,#21H       ;最高位移出存放单元首址 
                MOV     R0,#50H       ;"电子设计"字符数据首址 
                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,#50H      ;将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数据表 
TAB:    DB      0EFH,83H,0ABH,83H,0ABH,83H,0EEH,0E0H     ;   电 
        DB      0FFH,0C7H,0EFH,83H,0EFH,0EFH,0CFH,0EFH   ;   子 
        DB      0B1H,0B5H,04H,0BFH,0B1H,0B5H,9BH,0A4H    ;   设 
        DB      0BBH,0BBH,1BH,0A0H,0BBH,0BBH,9BH,0BBH    ;   计 
        DB      00H,00H,00H,00H 
        END                                              ;程序结束 



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址