微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求此程序的仿真电路图

求此程序的仿真电路图

时间:10-02 整理:3721RD 点击:
;**********************************************************************:
;项目名称:数字式电子钟
;**********************************************************************;
;堆栈栈底80H;
;**********************************************************************;
;LED数码管显示器设定;
;P0.7---P0.0段控线,接LED的显示段dp,g,f,e,d,c,b,a
;P2.0---P2.7位控线,从左至右(LED7,LED6,LED5,LED4,LED3,LED2,LED1,LED0)
;显示缓冲区设定从左至右依次为78H,79H,7AH,7BH,7CH,7DH,7EH,7FH
;**********************************************************************;
;独立式键盘设定;
;8个按键S2至S9分别依次接在P1.0至P1.7口线;
;**********************************************************************;
;20H字节单元:十六进制,S2键键值01H,S3键键值02H,S4键键值04H,S5键键值08H,S6键键值10H,S7键键值20H,S8键键值40H,S9键键值80H
;**********************************************************************;
;定时器/计数器资源:
;T/C0:工作模式;功能;定时时间;查询或中断
;**********************************************************************;
;中断系统资源;
;T/C0
;**********************************************************************;
;键功能程序;
;KEYA  (S2键键功能程序)
;KEYB  (S3键键功能程序)
;KEYC  (S4键键功能程序)
;KEYD  (S5键键功能程序)
;**********************************************************************;
;中断服务程序;
;**********************************************************************;
;常数表格;
;DISBH(系统提示符P.字型代码序号表)
;DISBI(00-00-00字符的代码序号)
;TAB(共阳数码管字型代码表)
;**********************************************************************;  
;子程序;
;DL(2毫秒延时子程序)
;DISP(数码管显示子程序)
;KEY(键扫描子程序);
;KEYCHULI(P1口数据处理子程序)
;加1子程序
;**********************************************************************;
;伪指令定义   
                SEC                  EQU     30H
                MIN                        EQU     31H
                HOUR                EQU             32H
                SECGE                EQU             7FH
                SECSHI                EQU             7EH
                MINGE                EQU             7CH
                MINSHI                EQU             7BH
                HOURGE           EQU      79H
                HOURSHI        EQU             78H
;**********************************************************************;
;系统起始程序区         
                ORG     0000H
START: LJMP    MAIN
ORG             000BH
                LJMP         TC0
;**********************************************************************;
;系统监控程序区       
                ORG                0030H
MAIN:        MOV                SP,                #80H            ;初始化数据
                MOV                PSW,        #00H
                MOV                TMOD,        #01H            ;定时器0工作方式1
                MOV                TH0,        #0D8H           ;10MS
                MOV                TL0,        #0F0H
                SETB        EA
                SETB        ET0
                MOV    R0,    #20H            ;RAM区首地址
       MOV    R7,    #5FH            ;RAM区单元个数 95个
CHUSHI:MOV   @R0,    #00H
       INC    R0                                    ;将RAM全部清零,初始化
       DJNZ   R7,    CHUSHI        
TSF:   MOV    DPTR,  #DISBH          ;系统初始化 "P."字符代码表首地址
       MOV    R5,    #08H                       
       MOV    R0,    #78H
DISPTSF:CLR   A
        MOVC  A,     @A+DPTR
        MOV   @R0,    A
        INC   R0
        INC   DPTR
        DJNZ  R5,     DISPTSF
D:                LCALL  DISP                    ;调显示子程序显示提示符"P."
                LCALL        KEY
                JB                20H.0,        KEYA
                LJMP        D
;**********************************************************************;
;键功能程序区
;S2键功能程序
KEYA:        MOV                SEC,         #0                                   ;寄存器初始化,秒寄存器
                MOV                MIN,         #0                                   ;分寄存器
                MOV                HOUR,         #0                                   ;时寄存器
                MOV    DPTR,   #DISBI          ;"00-00-00"字符代码表首地址
       MOV    R5,     #08H
       MOV    R0,     #78H
DISPTSG:CLR   A
       MOVC  A,      @A+DPTR
       MOV   @R0,    A
       INC   R0
       INC   DPTR
       DJNZ  R5,     DISPTSG
KEYAS:        SETB  TR0                                                    ;开定时器
DI:                LCALL DISP
                LCALL KEY
                JB           20H.0,        CP                                  
                LJMP  DI
CP:                CLR          TR0                                                    ;S2键按下,进入调整状态
DD:                LCALL DISP
                LCALL KEY
                JB          20H.0,        KEYAS
                JB          20H.1,        KEYB
                JB          20H.2,        KEYC
                JB          20H.3,        KEYD
                LJMP  DD
;S3键功能程序
KEYB:        LCALL        HOUR_                                            ;调时
LC:                LCALL        DISP
                LCALL        KEY
                JB                20H.0,        KEYAS
                JB                20H.1,        KEYB
                JB                20H.2,        KEYC
                JB                20H.3,        KEYD
                LJMP        LC       
;S4键功能程序
KEYC:        LCALL        MIN_                                            ;调分
DIIS:        LCALL  DISP
                LCALL        KEY
                JB                20H.0,        KEYAS
                JB                20H.1,        KEYB
                JB                20H.2,        KEYC
                JB           20H.3,        KEYD
                LJMP        DIIS
;S5键功能程序
KEYD:        LCALL        SEC_                                            ;调秒
DISS:        LCALL        DISP
                LCALL        KEY
                JB                20H.0,        KEYAS
                JB                20H.1,        KEYB
                JB                20H.2,        KEYC
                JB                20H.3,        KEYD
                LJMP        DISS
;中断服务程序                               
TC0:        PUSH        ACC
                PUSH   B
                PUSH        PSW
                SETB        RS1
                CLR                RS0
                MOV                TH0,        #0D8H
                MOV                TL0,        #0F0H
                INC                33H
                MOV                A,                33H
                CJNE   A,                #100,                RE
                MOV                33H,        #0
                INC                SEC
                MOV                A,                SEC
                MOV                B,                #10
                div                AB
                MOV                SECSHI,A
                MOV                SECGE,         B
                MOV                A,                SEC
                CJNE        A,                #60,                RE
                INC                MIN
                MOV                SEC,        #00H
                MOV                SECGE,        #0
                MOV                SECSHI,#0
                MOV                A,                MIN
                MOV                B,                #10
                div                AB
                MOV                MINSHI, A
                MOV                MINGE,        B
                MOV                A,                MIN
                CJNE        A,                #60,                RE
                INC                HOUR
                MOV                MIN,        #00H
                MOV                MINGE,        #0
                MOV                MINSHI,#0
                MOV                A,                HOUR
                MOV                B,                #10
                div                AB
                MOV                HOURSHI,A
                MOV                HOURGE, B
                MOV                A,                HOUR
                CJNE   A,                #24,                RE
                MOV                HOUR,        #0
                MOV                HOURGE,#0
                MOV                HOURSHI,#0
RE:                POP                PSW
                POP                B
                POP                ACC
                RETI
;延时1毫秒子程序
DL:   PUSH   PSW
       SETB   RS1
       SETB   RS0
       MOV    R7,     #02H
DL1:        MOV                R6,     #0FFH
DL2:        DJNZ        R6,     DL2
                DJNZ        R7,     DL1
       POP    PSW
                RET
;显示子程序
;入口:        77H,78H,79H,7AH,7BH,7CH,7DH,7EH,7FH,
DISP:  PUSH        DPH
                PUSH        DPL
                PUSH        ACC
                PUSH        PSW
       CLR    RS1                      ;改变当前寄存器组为组1
       SETB   RS0
       MOV    R1,     #78H            ;显示缓冲存储单元首地址
       MOV    R2,     #0FEH           ;从右至左显示,共阳极
DISP1:MOV                A,      @R1
                MOV                DPTR,   #TAB
                MOVC         A,      @A+DPTR
                MOV                 P0,     A                                  ;送段控
       MOV                 P2,     R2            ;送位控
                LCALL         DL                    ;延时2毫秒 为什么这里要延时
                MOV                 A,      R2
                JNB                 ACC.7,  DISP2                  ;为0转移;
                RL                 A
                INC                 R1
                MOV                 R2,     A
                LJMP         DISP1
DISP2:        POP                 PSW                   ;恢复当前寄存器组的组号
                POP                 ACC
                POP                 DPL
                POP                 DPH
                RET
;键扫描子程序
KEY:        LCALL  KEYCHULI                                  ;调P1口数据处理子程序
        JZ     EXIT                                          ;没有键按下,转返回
                LCALL         DISP                                          ;调显示子程序去抖动
                LCALL         DISP
       LCALL   KEYCHULI                                  ;调P1口数据处理子程序
        JZ     EXIT                                          ;没有键按下,转返回
                MOV                 B,                20H                                  ;保存取反后的键值
KEYSF:        LCALL         KEYCHULI                                  ;调P1口数据处理子程序
                JZ                 KEY1                                          ;键释放,转恢复键值
                LCALL         DISP                                          ;调显示子程序延时
       LJMP    KEYSF                                          ;等待释放
KEY1:        MOV     20H,         B                                  ;键值送20H保存
EXIT:        RET                                                                  ;子程序返回
;P1口数据处理子程序
KEYCHULI:PUSH  PSW                                          ;保护现场
                CLR                 RS1                                     ;改变当前寄存器组为组1
                SETB    RS0
                MOV                 P1,                #0FFH                  ;先向P1口写1
                MOV                 A,                    P1                          ;读P1口数据
                CPL                 A                                                  ;P1口数据取反
                MOV                20H,            A                          ;保存取反后的键值
                CLR                RS1                                                  ;恢复当前寄存器组为组0
                CLR            RS0       
                POP                PSW                                                  ;恢复现场
                RET                                                                ;子程序返回
;加1子程序
SEC_:        INC                SEC
                MOV                  A,                SEC
                MOV                  B,                #10
                div                  AB
                MOV                  SECSHI,        A
                MOV                  SECGE,        B
                MOV                  A,                   SEC
                CJNE          A,                   #60,        EXI
                MOV                  SEC,           #0
                MOV                  SECGE,        #0
                MOV                  SECSHI,        #0
                LJMP          EXI
MIN_:        INC                  MIN
                MOV                  A,                MIN
                MOV                  B,                #10
                div                  AB
                MOV                  MINSHI,        A
                MOV                  MINGE,        B
                MOV                  A,                MIN
                CJNE          A,                #60,                EXI
                MOV                  MIN,           #0
                MOV                  MINGE,        #0
                MOV                  MINSHI,        #0
                LJMP          EXI
HOUR_:        INC                  HOUR
                MOV                  A,                HOUR
                MOV                  B,                #10
                div                  AB
                MOV                  HOURSHI, A
                MOV                  HOURGE,         B
                MOV                  A,                HOUR
                CJNE          A,                #24,                EXI
                MOV                  HOUR,         #0
                MOV                  HOURGE,         #0
                MOV                  HOURSHI, #0
EXI:        RET
;常数表格区------------------------------------------------------------
;系统初始化后提示符"P."字符代码表
DISBH:  DB 11H,10H,10H,10H,10H,10H,10H,10H            ;"P."字符序号
DISBI:         DB         00H,00H,12H,00H,00H,12H,00H,00H
;显示字符段选码表(共阳极代码)
TAB:   DB 0C0H, 0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H  ;0-8
        DB 90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,0BFH;9,A,B,C,D,E,F,灭,p.                 END

好好好好好好好好好好好

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top