鱼C论坛

 找回密码
 立即注册
查看: 3092|回复: 3

[已解决]求助,要求用汇编语言设置一个电子钟。

[复制链接]
发表于 2021-11-15 08:24:15 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 AIML 于 2021-11-15 08:24 编辑

具体需要使用的硬件芯片包括,8253,8255,8259,8279,

具体要求如图 要求.png 所示:

目前手中已经可以用8253,8259,8279实现的电子钟表代码如下:

演示程序

1.png
        .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.png    8259电路图如上图所示。



下图是8255电路图
8255.png



有大佬能给出加入8255后的汇编语言代码吗?最好注释多一点,即使上面的功能无法全部实现也行,我感觉虽然在原有实验的基础上只加入了一个8255并行接口,但是加入的东西可不是一般的多,不熟悉汇编语言,真的是太难了,希望有大佬能在原有的汇编之上再加以改进,发代码让我拜读一下,不胜感激,谢谢!

最佳答案
2021-11-15 08:24:16
这类涉及到硬件的问题,基本上要靠你自己
因为我们没有这样的硬件,没办法调试程序
程序中的问题基本上是很难看出来的,要通过调试来发现问题
但是我们没有这样的硬件,没办法调试程序
这里可见基础知识的重要性,因为到了后面,遇到问题基本上要靠你自己
因为别人基本上没办法帮你
对于现在的你来说,最好的做法就是温故知新
返回到前面,去复习从前学的那些东西,从而学到新的东西
为的就是学到解决当前问题的能力,前提是你要有足够的时间

最佳答案

查看完整内容

这是8253和8279的电路图 萌新学汇编语言直接被干懵了, 烦请大佬优先解决汇编语言的代码问题, 谢谢大佬们了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-15 08:24:16 | 显示全部楼层
这是8253和8279的电路图
萌新学汇编语言直接被干懵了,
烦请大佬优先解决汇编语言的代码问题,
谢谢大佬们了!
8253.png
8279.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-15 08:24:16 | 显示全部楼层    本楼为最佳答案   
这类涉及到硬件的问题,基本上要靠你自己
因为我们没有这样的硬件,没办法调试程序
程序中的问题基本上是很难看出来的,要通过调试来发现问题
但是我们没有这样的硬件,没办法调试程序
这里可见基础知识的重要性,因为到了后面,遇到问题基本上要靠你自己
因为别人基本上没办法帮你
对于现在的你来说,最好的做法就是温故知新
返回到前面,去复习从前学的那些东西,从而学到新的东西
为的就是学到解决当前问题的能力,前提是你要有足够的时间

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-15 18:46:57 | 显示全部楼层
人造人 发表于 2021-11-15 11:56
这类涉及到硬件的问题,基本上要靠你自己
因为我们没有这样的硬件,没办法调试程序
程序中的问题基本上是 ...

谢谢您了,这个问题悬挂了将近一年,今年是属于上论坛求助,点错了把之前的草稿箱发出来了。
很感谢,谢谢了
很用心的回答,感谢鱼油~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 22:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表