找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1494|回复: 2
打印 上一主题 下一主题
收起左侧

求助,帮忙看下哪里错了,程序运行不对 数码管乱码

[复制链接]
跳转到指定楼层
楼主
ID:940228 发表于 2021-6-19 01:19 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式


COM8255        EQU        8003HOUTA        EQU        8000HOUTB        EQU        8001HOUTC        EQU        8002HBUFFER        EQU        20H                ;显示缓冲区占用3个字节,20H-22HHOUR        EQU        23H                ;小时计数单元MIN        EQU        24H                ;分钟计数单元SEC        EQU        25H                ;秒计数单元S_27        BIT        P1.0                ;工作方式选择开关,“1”为正常计时方式S_28        BIT        P1.1                ;调整小时/分钟选择开关,“1”为调整小时S_29        BIT        P3.2                ;小时/分钟数加1按键        ORG        0        LJMP        START        ORG        03H        SETB        TR1                ;启动T1计数,用于20ms消抖动                RETI        ORG        0BH        LJMP        T0S                ;转计时处理        ORG        1BH        LJMP        T1S                ;转S29按键处理        ORG        30HSTART:        MOV        SP,#60H        MOV        DPTR,#COM8255        ;(8003>DPTR);指向8255命令口        MOV        A,#80H                ;(8000>A)         8255芯片PA、PB、PC设为基本输出模式        MOVX        @DPTR,A                ;(A>(DPTR))        MOV        TMOD,#11H        ;                 设T0、T1为定时器        MOV        TH0,#4CH        ;T0定时50ms,晶振频率11.0592MHz        MOV        TL0,#0        MOV        TH1,#0B8H        ;T1定时20ms,晶振频率11.0592MHz        MOV        TL1,#00H        SETB        PT0                ;T0为高级中断        SETB         ET0                ;允许T0中断        SETB        ET1                ;允许T1中断        SETB         IT0                ;设定INT0为边沿中断        SETB        EA                ;开中断        MOV        BUFFER,#0H        ;显缓区清零        MOV        BUFFER+1,#0H        MOV        BUFFER+2,#0H        MOV        HOUR,#0H        ;时分秒单元清零        MOV        MIN,#0H        MOV        SEC,#0H        MOV        0AH,#14H                ;1区R2,1秒中断计次MAIN:        SETB        S_27        JB        S_27,MM1        ;正常计时模式则转        SETB        EX0                ;允许INT0中断        CLR        TR0                ;停止T0计数        MOV        SEC,#0H                ;秒单元清零        SJMP        MM2MM1:        CLR        EX0                ;禁止INT0中断        SETB        TR0                ;启动T0计数MM2:        MOV        BUFFER,HOUR        ;将时分秒送显        MOV        BUFFER+1,MIN                MOV        BUFFER+2,SEC        LCALL        DISP                ;显示时分秒        SJMP        MAIN;-------主程序结束------------------------------------;;====================================================;T0中断服务程序;---------------------------------------------------T0S:        PUSH        PSW        PUSH        ACC        SETB        RS0                ;选择1区工作寄存器        CLR        RS1        MOV        TH0,#4CH        ;T0时50ms,晶振频率11.0592MHz        MOV        TL0,#0H        DJNZ        R2,T0S1        MOV        R2,#14H                ;50ms中断20次为1秒        MOV        A,SEC        ADD        A,#1        DA        A        MOV        SEC,A        CJNE        A,#60H,T0S1        ;不到60秒则转移        MOV        SEC,#0        MOV        A,MIN        ADD        A,#1        DA        A        MOV        MIN,A        CJNE        A,#60H,T0S1        ;不到60分则转移        MOV        MIN,#0        MOV        A,HOUR        ADD        A,#1        DA        A        MOV        HOUR,A        CJNE        A,#24H,T0S1        ;不到24小时则转移        MOV         HOUR,#0T0S1:        POP        ACC        POP        PSW        RETI;====================================================;T1中断服务程序;---------------------------------------------------T1S:        PUSH        PSW        PUSH        ACC        SETB        S_29        JB        S_29,T1S2        ;S29没有按下则转移        SETB        S_28        JB        S_28,T1S1        ;S28为高电平,调整小时则转        MOV        A,MIN        ADD        A,#1        DA        A        MOV        MIN,A        CJNE        A,#60H,T1S2        MOV        MIN,#0        SJMP        T1S2T1S1:        MOV        A,HOUR        ADD        A,#1        DA        A        MOV        HOUR,A        CJNE        A,#24H,T1S2        MOV        HOUR,#0T1S2:        MOV        TH1,#0B8H        ;T1定时20ms,晶振频率11.0592MHz        MOV        TL1,#00H        CLR        TR1        CLR        IE0        POP        ACC        POP        PSW        RETI;=====================================================;动态显示子程序;使用寄存器:R0,R2,R3,A,DPTR;-----------------------------------------------------DISP:        MOV        DPTR,#OUTB        ;消隐数码管,实际实验箱上不需要        MOV        A,#0FFH                ;消隐数码管,实际实验箱上不需要        MOVX        @DPTR,A                ;消隐数码管,实际实验箱上不需要        MOV        R0,#BUFFER+2        ;指向显缓区最后一个字节        MOV        R3,#3                ;显示字节数为3字节        MOV        R2,#0FEH        ;位码初值,点亮最右边的数码管LOOP:        MOV        A,@R0        ANL        A,#0FH                ;取出低4位        MOV        DPTR,#TAB        MOVC        A,@A+DPTR        CLR        ACC.7                ;点亮小数点        MOV        DPTR,#OUTA        MOVX        @DPTR,A                ;段码送8255的A口        MOV        A,R2        INC        DPTR                ;指向8255的B口        MOVX        @DPTR,A                ;位码送8255的B口        RL        A                ;位码左移        MOV        R2,A                ;存位码        LCALL        DELAY2MS        ;延时2ms        MOV        DPTR,#OUTB        ;消隐数码管,实际实验箱上不需要        MOV        A,#0FFH                ;消隐数码管,实际实验箱上不需要        MOVX        @DPTR,A                ;消隐数码管,实际实验箱上不需要        MOV        A,@R0        ANL        A,#0F0H                ;取出高4位        SWAP        A        MOV        DPTR,#TAB        MOVC        A,@A+DPTR        MOV        DPTR,#OUTA        MOVX        @DPTR,A                ;段码送8255的A口        MOV        A,R2        INC        DPTR                ;指向8255的B口        MOVX        @DPTR,A                ;位码送8255的B口        RL        A                ;位码左移        MOV        R2,A                ;存位码        LCALL        DELAY2MS        ;延时2ms                MOV        DPTR,#OUTB        ;消隐数码管,实际实验箱上不需要        MOV        A,#0FFH                ;消隐数码管,实际实验箱上不需要        MOVX        @DPTR,A                ;消隐数码管,实际实验箱上不需要                DEC        R0        DJNZ        R3,LOOP        MOV        A,#0FFH        MOVX        @DPTR,A                ;熄灭所有数码管        RETTAB:        DB        0C0H,0F9H,0A4H,0B0H,99H         DB        92H, 82H, 0F8H,80H, 90H;==============================================;2ms延时子程序;使用寄存器:R7;对于11.0592MHz晶振,实际延时2174微秒=2.174ms;----------------------------------------------DELAY2MS:        MOV        R7,#250DD1:        NOP        NOP        NOP        NOP        NOP        NOP        DJNZ        R7,DD1        RET        END
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:96682 发表于 2021-6-19 15:20 来自手机 | 只看该作者
显然是仿真用错数码管了
回复

使用道具 举报

板凳
ID:939710 发表于 2021-6-20 11:50 | 只看该作者
这个仿真不用这么麻烦,段选和单片机间加个锁存器就行,位选可以加或者不加
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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