您的位置:控制工程论坛网论坛 » 嵌入式系统 » 自动显示乘法口决的实现程序

逸飞

逸飞   |   当前状态:离线

总积分:77  2025年可用积分:0

注册时间: 2008-01-17

最后登录时间: 2008-03-13

空间 发短消息加为好友

自动显示乘法口决的实现程序

逸飞  发表于 2008/1/18 23:13:00      1061 查看 0 回复  [上一主题]  [下一主题]

手机阅读




;**************************************************************
;             延时显示乘法口决程序         
;   每延时1S显示一句口决,中间间隔2S显示
;           Create by :逸飞   12MHZ晶振                         
;**************************************************************
;**************************************************************
;            伪定义            
;**************************************************************
                  DISPBUF  EQU    30H;定义显示缓冲区首址,
;                        从30H到35H都定义为显示缓冲区
                  JI_GE    EQU   36H
           JI_SHI   EQU   37H
           DENGYU   EQU   38H
           SHU2     EQU   39H
           DIAN     EQU   3AH
           SHU1     EQU   3BH
;**************************************************************
;            主 程 序             
;**************************************************************
                   ORG 0000H        ;程序执行开始地址
                   LJMP      START  ;跳到标号START执行
                   ORG 000BH        ;定时器T0中断程序入口
            LJMP      INTT0  ;跳至INTTO执行
                   ORG   0040H
            START:            
     MOV   R0,#30H       ;清30H-3BH共11个内存单元
                   MOV   R1,#0CH       ;
       CLEARDISP:  MOV   @R0,#00H       ;
                   INC   R0             ;
                   DJNZ  R1,CLEARDISP   ;
     MOV   DIAN,#10
     MOV   DENGYU,#11
                   MOV   SHU1,#1
                   MOV   SHU2,#1                      
     MOV   A,SHU1
     MOV   B,SHU2
     MUL   AB
     MOV   B,#10
     DIV   AB
     MOV   JI_SHI,A
     MOV   JI_GE,B
                   MOV   30H,36H        ;送显示缓冲区
     MOV   31H,37H  
                   MOV   32H,38H
     MOV   33H,39H
     MOV   34H,3AH  
                   MOV   35H,3BH
                   MOV   TMOD,#11H      ;设T016位定时器
                   MOV   TL0,#0B0H    ;50MS定时初值(T0计时用)
                   MOV   TH0,#3CH    ;50MS定时初值                 
                   SETB  EA             ;总中断开放
                   SETB  ET0            ;允许T0中断
                   SETB  TR0            ;开启T0定时器
                   MOV   R4,#14H        ;1秒定时用初值(50MS×20)
    START1: LCALL DISPLAY        ;调用显示子程序
                   SJMP  START1         ;P3.7口为1时跳回START1


;**************************************************************
;            延时1S显示下一句子程序            
;**************************************************************
;T0中断服务程序
            INTT0: PUSH  ACC           ;累加器入栈保护
                   PUSH  PSW           ;状态字入栈保护
                   CLR   ET0           ;关T0中断允许
                   CLR   TR0           ;关闭定时器T0
     MOV   TL0,#0B0H    ;50MS定时初值(T0计时用)
                   MOV   TH0,#3CH    ;50MS定时初值
                   DJNZ  R4, OUTT0         ;20次中断未到中断退出
           ADDSS:  MOV  R4,#14H           ;20次中断到(1秒)重赋初值
                   CALL  ADD_1
           OUTT0:
                   POP   PSW               ;恢复状态字(出栈)
                   POP   ACC               ;恢复累加器
                   SETB  ET0               ;开放T0中断
                   SETB  TR0               ;开启定时器T0
                   RETI                    ;中断返回


;**************************************************************
;            加1生成下一句子程序            
;**************************************************************
ADD_1:
                   CLR  CY
                   MOV  A,#1
                   ADD  A,SHU1
     MOV  SHU1,A
     CJNE  A,SHU2,PD
     AJMP  XD
PD:     JNC   SHU1_OUT
XD:                MOV   A,SHU1
     MOV   B,SHU2
     MUL   AB
     MOV   B,#10
     DIV   AB
     MOV   JI_SHI,A
     MOV   JI_GE,B
                   MOV   30H,36H        ;送显示缓冲区
     MOV   31H,37H  
                   MOV   32H,38H
     MOV   33H,39H
     MOV   34H,3AH  
                   MOV   35H,3BH
            AJMP  ADD_OUT
SHU1_OUT:          MOV   A,#1
                   ADD   A,SHU2
     MOV   SHU2,A
                   MOV   SHU1,#0
     CJNE  A,#10,ADD_OUT
     MOV   SHU2,#0
     MOV   SHU1,#0
ADD_OUT:
     RET    
;**************************************************************
;             显示程序                 
;**************************************************************
; 琍0口输出段码数据,P2口作扫描控制,每个LED数码管亮1MS时间再逐位循环。
          DISPLAY: MOV   R1,#DISPBUF       ;指向显示数据首址
                   MOV   R5,#0FEH      ;扫描控制字初值
             PLAY: MOV   A,R5          ;扫描字放入A
                   MOV   P2,A          ;从P2口输出
                   MOV   A,@R1         ;取显示数据到A
                   MOV   DPTR,#TAB     ;取段码表地址
                   MOVC  A,@A+DPTR     ;查显示数据对应段码
                   MOV   P0,A          ;段码放入P1口
                   LCALL  DELAY1MS        ;显示1MS
                   INC   R1            ;指向下一地址
                   MOV   A,R5            ;扫描控制字放入A
                   JNB   ACC.5,ENDOUT    ;扫到第六位时结束
                   RL   A               ;A中数据循环左移
                   MOV   R5,A            ;放回R5内
                   AJMP  PLAY            ;跳回PLAY循环
           ENDOUT: SETB  P2.5            ;一次显示结束,P2口复位
                   MOV    P0,#0FFH       ;P0口复位
                   RET                      ;子程序返回
             TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,7FH,0B7H,0FFH
;共阳段码表          "0""1""2" "3""4""5""6""7" "8""9"".""=""不亮"
;
;**************************************************************
;             延时程序            
;**************************************************************
;
;1MS延时程序,LED显示程序用
             DELAY1MS: MOV  R6,#2
             DL1:   MOV  R7,#248
             DL2:   DJNZ  R7,DL2
                    DJNZ  R6,DL1
                    RET
                    END                     ;程序结束



 

1楼 0 0 回复