| 
 | 
 
20鱼币 
 本帖最后由 AIML 于 2021-11-15 08:24 编辑  
 
具体需要使用的硬件芯片包括,8253,8255,8259,8279, 
 
具体要求如图
 
所示: 
 
目前手中已经可以用8253,8259,8279实现的电子钟表代码如下: 
 
演示程序 
 
 
 
        .MODEL        TINY         
EXTRN        Display8:NEAR, GetKeyA:NEAR, GetKeyB:NEAR 
IO8259_0        EQU        0F000H         
IO8259_1                EQU                0F001H         
Con_8253        EQU        0E003H         
T0_8253        EQU        0E000H         
        .STACK        200         
        .DATA                 
halfsec        DB        0        ;0.5秒计数 
Sec                DB        0        ;秒 
Min                DB        0        ;分 
hour                DB        0        ;时 
buffer        DB        8 DUP(0)        ;显示缓冲区,8个字节 
buffer1        DB        8 DUP(0)                ;显示缓冲区,8个字节 
bNeedDisplay        DB        0        ;需要刷新显示 
number        DB        0        ;设置哪一位时间 
bFlash        DB        0        ;设置时是否需要刷新 
        .CODE                 
START:        MOV        AX,@DATA         
        MOV        DS,AX         
        MOV        ES,AX         
        NOP                 
        mov        sec,0                ;时分秒赋初值23:58:00 
        mov        min,58         
        mov        hour,23         
        MOV                bNeedDisplay,1        ;显示初始值 
        CALL                Init8253         
        CALL                Init8259         
        CALL                WriIntver         
        STI                 
MAIN:        CALL        GetKeyA        ;按键扫描 
        JNB        Main1         
        CMP        AL,0FH        ;设置时间 
        JNZ                Main1         
        CALL        SetTime         
Main1:        CMP                bNeedDisplay,0         
        JZ        MAIN         
        CALL        Display_LED        ;显示时分秒 
        MOV        bNeedDisplay,0        ;1s定时到刷新转速 
Main2:        JMP                MAIN                      ;循环进行实验内容介绍与测速功能测试 
SetTime        PROC        NEAR         
        LEA                SI,buffer1         
        CALL        TimeToBuffer         
        MOV        Number,0         
Key:                CMP        bFlash,0         
        JZ        Key2         
        LEA                SI,buffer1         
        LEA                DI,buffer         
        MOV        CX,8         
        REP        MOVSB         
        CMP        halfsec,0         
        JNZ        FLASH         
        MOV                BL,number         
        NOT        BL         
        AND        BX,07H         
        LEA                SI,buffer         
        MOV        BYTE PTR [SI+BX],10H        ;当前设置位置产生闪烁效果 
FLASH:        LEA        SI,buffer         
        CALL                Display8         
        MOV        bFlash,0         
Key2:        CALL        GetKeyA         
        JNB        Key         
        CMP                AL,0EH        ;放弃设置 
        JNZ        Key1         
        JMP                Exit         
Key1:        CMP        AL,0FH         
        JZ        SetTime8         
SetTime1:        CMP        AL,10         
        JNB        Key                ;无效按键 
        CMP        number,0         
        JNZ                SetTime2         
        CMP        AL,3                ;调整时的十位数 
        JNB        Key         
        MOV                buffer1 + 7,AL         
        JMP        SetTime7         
SetTime2:        CMP                number,1         
        JNZ                SetTime3         
        CMP        buffer1 + 7,1        ;调整时的个位数 
        JZ        SetTime2_1         
        CMP        AL,4         
        JNB        Key         
SetTime2_1:        MOV                buffer1 + 6,AL         
        INC        number         
        JMP        SetTime7         
SetTime3:        CMP        number,3         
        JNZ        SetTime4         
        CMP        AL,6                ;调整分的十位数 
        JNB        Key         
        MOV        buffer1 + 4,AL         
        JMP                SetTime7                 
SetTime4:        CMP                number,4         
        JNZ        SetTime5         
        MOV                buffer1 + 3,AL        ;调整分的个位数 
        INC        number         
        JMP                SetTime7         
SetTime5:        CMP        number,6         
        JNZ        SetTime6         
        CMP        AL,6                ;调整秒的十位数 
        JB        SetTime5_1         
        JMP        Key         
SetTime5_1:        MOV        buffer1 + 1,AL         
        JMP        SetTime7         
SetTime6:        MOV                buffer1,AL        ;调整秒的个位数 
SetTime7:        INC        number         
        CMP                number,8         
        JNB        SetTime8         
        MOV        bFlash,1        ;需要刷新 
        JMP                Key                 
SetTime8:        MOV                AL,buffer1 + 1        ;确认 
        MOV                BL,10         
        MUL        BL         
        ADD        AL,buffer1         
        MOV                sec,AL                ;秒 
        MOV        AL,buffer1 + 4         
        MUL        BL         
        ADD        AL,buffer1 + 3         
        MOV        min,AL        ;分 
        MOV        AL,buffer1 + 7         
        MUL        BL         
        ADD        AL,buffer1 + 6         
        MOV        hour,AL        ;时 
        JMP                Exit         
Exit:        RET                 
SetTime                ENDP                 
;hour min sec转化成可显示格式 
TimeToBuffer        PROC        NEAR         
        MOV        AL,sec         
        XOR        AH,AH         
        MOV        BL,10         
        DIV        BL         
        MOV        [SI],AH         
        MOV        [SI + 1],AL        ;秒 
        MOV        BYTE PTR [SI + 2],10H        ;这位不显示 
        MOV        AL,min         
        XOR        AH,AH         
        DIV        BL         
        MOV        [SI + 3],AH         
        MOV                [SI + 4],AL                ;分 
        MOV        BYTE PTR [SI + 5],10H          ;这位不显示 
        MOV                AL,hour         
        XOR                AH,AH         
        DIV        BL         
        MOV                [SI + 6],AH                 
        MOV        [SI + 7],AL        ;时 
        RET                 
TimeToBuffer        ENDP                 
;显示时分秒 
Display_LED        PROC        NEAR         
        LEA                SI,buffer         
        CALL        TimeToBuffer         
        LEA                SI,buffer         
        CALL        Display8                ;显示 
        RET                 
Display_LED                ENDP                 
;0.5s产生一次中断 
Timer0Int:        PUSH                AX         
        PUSH                DX         
        MOV        bFlash,1         
        INC        halfsec         
        CMP        halfsec,2         
        JNZ                Timer0Int1         
        MOV        bNeedDisplay,1         
        MOV                halfsec,0         
        INC        sec         
        CMP        sec,60         
        JNZ        Timer0Int1         
        MOV        sec,0         
        INC        min         
        CMP                min,60         
        JNZ        Timer0Int1         
        MOV                min,0         
        INC        hour         
        CMP        hour,24         
        JNZ                Timer0Int1         
        MOV        hour,0         
Timer0Int1:        MOV        DX,IO8259_0         
        MOV        AL,20H         
        OUT        DX,AL         
        POP        DX         
        POP        AX         
        IRET                         
Init8253        PROC                NEAR         
        MOV        DX,Con_8253         
        MOV        AL,34H         
        OUT        DX,AL        ;计数器T0设置在模式2状态,HEX计数 
        MOV        DX,T0_8253         
        MOV        AL,12H         
        OUT        DX,AL         
        MOV        AL,7AH         
        OUT        DX,AL        ;CLK0=62.5kHz,0.5s定时 
        RET                 
Init8253                ENDP                 
Init8259        PROC        NEAR         
        MOV        DX,IO8259_0         
        MOV                AL,13H         
        OUT                DX,AL         
        MOV                DX,IO8259_1         
        MOV                AL,08H         
        OUT        DX,AL         
        MOV        AL,09H         
        OUT                DX,AL         
        MOV        AL,0FEH         
        OUT                DX,AL         
        RET                 
Init8259                ENDP                 
WriIntver        PROC        NEAR         
        PUSH                ES         
        MOV        AX,0         
        MOV                ES,AX         
        MOV                DI,20H         
        LEA        AX,Timer0Int         
        STOSW                 
        MOV        AX,CS         
        STOSW                 
        POP                ES         
        RET                 
WriIntver        ENDP                 
                         
        END        START         
 
   8259电路图如上图所示。 
 
 
 
下图是8255电路图 
 
 
 
 
 
有大佬能给出加入8255后的汇编语言代码吗?最好注释多一点,即使上面的功能无法全部实现也行,我感觉虽然在原有实验的基础上只加入了一个8255并行接口,但是加入的东西可不是一般的多,不熟悉汇编语言,真的是太难了,希望有大佬能在原有的汇编之上再加以改进,发代码让我拜读一下,不胜感激,谢谢! 
 
这类涉及到硬件的问题,基本上要靠你自己 
因为我们没有这样的硬件,没办法调试程序 
程序中的问题基本上是很难看出来的,要通过调试来发现问题 
但是我们没有这样的硬件,没办法调试程序 
这里可见基础知识的重要性,因为到了后面,遇到问题基本上要靠你自己 
因为别人基本上没办法帮你 
对于现在的你来说,最好的做法就是温故知新 
返回到前面,去复习从前学的那些东西,从而学到新的东西 
为的就是学到解决当前问题的能力,前提是你要有足够的时间 
 
 
 
 
 |   
 
 
最佳答案
查看完整内容 
这是8253和8279的电路图
萌新学汇编语言直接被干懵了,
烦请大佬优先解决汇编语言的代码问题,
谢谢大佬们了! 
 
 
 
 
 
 
 |