找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1049|回复: 11
收起左侧

单片机使用汇编语言和定时器动态数码管显示00到99

[复制链接]
ID:1135835 发表于 2024-11-22 09:37 | 显示全部楼层 |阅读模式
要求是:采用汇编语言设计程序,用定时器中断方式,循环显示0-99。目前写的,但是只有十位能正确显示,后面都是乱码,新手小白求助各位大佬(接线图在下面)
ORG  0000H
LJMP MAIN
ORG  000BH
LJMP T0_INT
ORG  0100H
MAIN:                            ;初始化
    MOV  TMOD, #01H            ;定时器0模式1
    MOV  TL0, #0B0H            ;定时器0初值低8位
    MOV  TH0, #3CH             ;定时器0初值高8位
    SETB TR0                   ;启动定时器0
    SETB ET0                   ;使能定时器0中断
    SETB EA                    ;开启全局中断
    MOV  DPTR, #TAB            ;表首址送DPTR
    MOV  R0, #0                ;计数器初始化为0
    MOV  R1, #0                ;辅助计数器初始化为0
M_LOOP:
    CALL DIS                   ;调用显示程序
    SJMP M_LOOP                 ;无限循环

T0_INT:                         ;定时器0中断服务程序
    MOV  TL0, #0B0H            ;重新加载定时器0初值低8位
    MOV  TH0, #3CH             ;重新加载定时器0初值高8位
    INC  R1                    ;辅助计数器R1加1
    MOV  A, R1
    CJNE A, #20, T0_E           ;如果R1不等于20,则跳转到T0_E
    MOV  R1, #0                 ;R1清零
    INC  R0                    ;计数器R0加1
    MOV  A, R0
    CJNE A, #100, T0_E         ;如果R0不等于100,则跳转到T0_E
    MOV  R0, #0                 ;R0清零
T0_E:
    RETI                        ;从中断返回

DIS:                             ;显示程序
    MOV  A, R0                 ;取计数器R0的值
    MOV  B, #10                ;除以10,B寄存器为10
    DIV  AB                    ;A/B,商在A,余数在B
    MOV  R2, A                 ;商(十位)存储在R2
    MOV  R3, B                 ;余数(个位)存储在R3

    MOV  A, R2                 ;显示十位
    MOVC A, @A+DPTR
    CLR  P1.0
    MOV  P0, A
    SETB P0.0                 ;十位的位选
    CALL DLY

    MOV  A, R3                 ;显示个位
    MOVC A, @A+DPTR
    CLR  P0.0
    MOV  P1, A
    SETB  P1.0                 ;个位的位选
    CALL DLY
    RET

TAB:    DB  3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH ;数码管显示编码0-9
DLY:    MOV  R4, #20             ;10ms延时
D1:     MOV  R5, #248
        DJNZ R5, $
        DJNZ R4, D1
        RET
END

接线图

接线图
回复

使用道具 举报

ID:1109793 发表于 2024-11-22 15:18 | 显示全部楼层
这么复杂的板子,干嘛用汇编啊
回复

使用道具 举报

ID:123917 发表于 2024-11-22 21:03 | 显示全部楼层
计数到100了,清零,返回主程序加LJMAP MAIN
回复

使用道具 举报

ID:624769 发表于 2024-11-22 22:21 | 显示全部楼层
   MOV  A, R2                 ;显示十位
    MOVC A, @A+DPTR
    CLR  P1.0
    MOV  P0, A
    SETB P0.0                 ;十位的位选
    CALL DLY

    MOV  A, R3                 ;显示个位
    MOVC A, @A+DPTR
    CLR  P0.0
    MOV  P1, A
    SETB  P1.0                 ;个位的位选
    CALL DLY
    RET
你这板子什么情况? 个位,和十位 段选 用的不是 同一个总线? 那你 到了十万位,百万位,千万位, 还要用 P5,P6, P7 ? 你单片机有那么多口子么?
回复

使用道具 举报

ID:76044 发表于 2024-11-23 09:59 | 显示全部楼层
显示部分改了下,看看能不能用

DIS:                             ;显示程序
    MOV  A, R0                 ;取计数器R0的值

    MOV  B, #10                ;除以10,B寄存器为10
    DIV  AB                    ;A/B,商在A,余数在B
    MOVC A, @A+DPTR
    MOV  P1, A
    SETB P0.0                 ;十位的位选
    CALL DLY
    CLR  P0.0.

    MOV  A, B                 ;显示个位
    MOVC A, @A+DPTR   
    MOV  P1, A
    SETB  P0.1                 ;个位的位选
    CALL DLY
    CLR  P0.1

    RET
回复

使用道具 举报

ID:1072347 发表于 2024-11-24 16:13 | 显示全部楼层
5楼的似乎没问题,你的原本的显示部分写的有点臃肿
回复

使用道具 举报

ID:1136459 发表于 2024-11-24 17:05 | 显示全部楼层
A_Bit EQU 20H
B_Bit EQU  21h  ;十位数存放处
TEMP  EQU 22h

STAR:  MOV  TEMP, #0 ;初始化计数器

STLOP:  
ACALL  DISPLAY
INC  TEMP
MOV  A,TEMP
CJNE  A,#100,NEXT ;=100重来
MOV  TEMP,#0

NEXT:
LJMP  STLOP

;显示子程序
DISPLAY:
      MOV A, TEMP ;将temp中 的数转换成10进制
      MOV B,#10;
      DIV AB;
      MOV B_Bit,A ;十位在A
      MOV A_Bit,B;个位在B
      MOV DPTR,#TAB;指定查表启始地址
      MOV R0,#2;4

DPL1:  MOV  R1,#100;250 ;显示1000次
DPLOP: MOV A,A_Bit;取个位数
      MOVC A,@A+DPTR;查个位数的7段代码
      ;CPL A;
      MOV  P1 ,A;送出个位的7段代码
      CLR  P2.7;
      ACALL D1MS;延时显示1ms
      SETB P2.7;
      MOV  A,B_Bit  ;取十位数
      MOVC A, @A+DPTR ;查十位数的7 段代码
      ;CPL A;
      MOV  P1 ,A;送出十位的7段代码
      CLR  P2.6;
      ACALL D1MS;
      SETB P2.6;
      DJNZ  R1,DPLOP  ;100次没完循环
      DJNZ  R0,DPL1  ;2个100次没完循环RET
      ;延时4毫秒即2微秒* R7*R6(按12MHZ算)


D1MS: MOV  R7 ,#5;10
      D1:  MOV  R6,#50;
           DJNZ R6,$;
           DJNZ R7,D1;
           RET;

;7段数码管各划的数字排列表,共阳的七段花数
TAB:
DB 3Fh,06h,5Bh,4Fh,66h,6Dh,7Dh,07h,7Fh,6Fh,77h,7Ch,39h,5Eh,79h,71h;
END;就不知道对不对,我们学校给的
回复

使用道具 举报

ID:1136459 发表于 2024-11-24 17:18 | 显示全部楼层
A_Bit EQU 20H
B_Bit EQU  21h  ;十位数存放处
TEMP  EQU 22h

STAR:  MOV  TEMP, #0 ;初始化计数器

STLOP:  
ACALL  DISPLAY
INC  TEMP
MOV  A,TEMP
CJNE  A,#100,NEXT ;=100重来
MOV  TEMP,#0

NEXT:
LJMP  STLOP

;显示子程序
DISPLAY:
      MOV A, TEMP ;将temp中 的数转换成10进制
      MOV B,#10;
      DIV AB;
      MOV B_Bit,A ;十位在A
      MOV A_Bit,B;个位在B
      MOV DPTR,#TAB;指定查表启始地址
      MOV R0,#2;4

DPL1:  MOV  R1,#100;250 ;显示1000次
DPLOP: MOV A,A_Bit;取个位数
      MOVC A,@A+DPTR;查个位数的7段代码
      ;CPL A;
      MOV  P1 ,A;送出个位的7段代码
      CLR  P2.7;
      ACALL D1MS;延时显示1ms
      SETB P2.7;
      MOV  A,B_Bit  ;取十位数
      MOVC A, @A+DPTR ;查十位数的7 段代码
      ;CPL A;
      MOV  P1 ,A;送出十位的7段代码
      CLR  P2.6;
      ACALL D1MS;
      SETB P2.6;
      DJNZ  R1,DPLOP  ;100次没完循环
      DJNZ  R0,DPL1  ;2个100次没完循环RET
      ;延时4毫秒即2微秒* R7*R6(按12MHZ算)


D1MS: MOV  R7 ,#5;10
      D1:  MOV  R6,#50;
           DJNZ R6,$;
           DJNZ R7,D1;
           RET;

;7段数码管各划的数字排列表,共阳的七段花数
TAB:
DB 3Fh,06h,5Bh,4Fh,66h,6Dh,7Dh,07h,7Fh,6Fh,77h,7Ch,39h,5Eh,79h,71h;
END;
回复

使用道具 举报

ID:1135835 发表于 2024-11-28 23:33 | 显示全部楼层
188610329 发表于 2024-11-22 22:21
MOV  A, R2                 ;显示十位
    MOVC A, @A+DPTR
    CLR  P1.0

感谢感谢,接线是老师规定好的
回复

使用道具 举报

ID:1135835 发表于 2024-11-28 23:33 | 显示全部楼层
lxm41577 发表于 2024-11-23 09:59
显示部分改了下,看看能不能用

DIS:                             ;显示程序

谢谢谢谢
回复

使用道具 举报

ID:1135835 发表于 2024-11-28 23:33 | 显示全部楼层
55236 发表于 2024-11-24 17:18
A_Bit EQU 20H
B_Bit EQU  21h  ;十位数存放处
TEMP  EQU 22h

感谢感谢
回复

使用道具 举报

ID:1135835 发表于 2024-11-28 23:33 | 显示全部楼层
55236 发表于 2024-11-24 17:05
A_Bit EQU 20H
B_Bit EQU  21h  ;十位数存放处
TEMP  EQU 22h

感谢感谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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