汇编语言共阴极8位数码管计数 程序如下 ​

汇编语言共阴极8位数码管计数 程序如下 ​,第1张

你的仿真图中的两位数码的阴极同时接地了,就会同时显示11,22,33,44........

必须要采用两位动态扫描的方式来显示才行的。

所以,你的仿真图和程序都要修改。

仿真图如下:

程序如下:

DAT0 EQU 30H30H地址命名为DAT0

ORG  0000H

LJMP MAIN 主程序入口

ORG  0003H

LJMP EXINT0 中断0子程序

MAIN:

MOV  SP,#6FH设定堆栈地址

SETB IT0T0采用负缘触发信号

SETB EX0开中断0

SETB EA开中断总开关

MOV  DAT0,#0DAT0地址赋初始值0

LOOP:

CALL SEG7

SJMP LOOP循环等待

EXINT0:

MOV A,DAT0

ADD A,#1按十进制数加1

DA  A

MOV DAT0,A

RETI

SEG7: 显示子程序

MOV  DPTR,#DISPLAYTAB

MOV  A,DAT0

ANL  A,#0F0H取十位数

SWAP A

MOVC A,@A+DPTR

MOV  P0,#0FEH

MOV  P2,A   显示十位

ACALL DELAY 显示一位要延时

MOV  A,DAT0

ANL  A,#0FH

MOVC A,@A+DPTR

MOV  P0,#0FDH

MOV  P2,A   显示个位

ACALL DELAY 显示一位要延时

RET

DELAY: 延时子程序

MOV R7,#50

DER7:

MOV R6,#100

DJNZ R6,$

DJNZ R7,DER7

RET

DISPLAYTAB:

DB 3FH0 共阴

DB 06H 1

DB 5BH 2

DB 4FH 3

DB 66H 4

DB 6DH 5

DB 7DH 6

DB 07H 7

DB 7FH 8

DB 6FH 9

END

汇编语言程序设计步骤:1、 分析问题,抽象出描述问题的数据模型 2、 确定问题的算法思想 3、 画出流程图或结构图 4、 分配存储器和工作单元(寄存器) 5、 逐条编写程序 6、 静态检查,上机调试 例:编程查找考生的最高分,假设所有考生分数已存入计算机内存.1、 分析问题 根据条件、特点、规律 →数学模型 本例分数已给定为0~200之间的整数集合(考虑加试分) ,记为{S},找max{S}(注:简单问题不一定写数学模型) .2、 确定算法思想 最好利用现成算法和程序设计方法,若无,则需根据实践经验总结算法思想.如本例,从成绩单第一分数往下看,边看边比较,记住较高分,舍弃较低分,直至看完,最高分存于 脑中.归纳算法思想:建立数据指针并指向数据区首地址.将第一数取入寄存器(如AL) ,与下一数比较,若下一数大则将其取入寄存器,否则调整指针,再与下一数比较,重复上述 直至比较完毕,寄存器中即最高分.读分数用MOV指令,比较用CMP指令,分析判断用条件转移指令.3、 画流程图或结构图 有逻辑流程、算法流程、程序流程等,复杂问题需画模块结构.本例简单,只画出程序 流程图(用模块化结构的N-S流程图表示) :本例的N-S流程图 图中初始化包括:设一个计数器,将分数个数减一后送计数器,每比较一次减一,至 零查找结束;建立一个指针指向数据区.开始 初始化 取第一数到寄存器 与下一数比较 下一数大?是 否 取大数到寄存器 修改指针,计数次数减一 返回到循环体开始,直到计数次数为0退出循环 结束 4、 分配存储器空间和工作单元(寄存器) 定义数据段、堆栈段、代码段等.工作单元一般用寄存器.本例:分数放数据段,建100 字节堆栈空间,BX作数据指针,CX作计数器,AL放最高分.5、 逐条编写程序 DATA SEGMENT FEN DB 85,90,60,75,87,35,80,78,96,82…… ;存分数 MAX DB ;存最高分 DATA ENDS STACK SEGMENT PARA STACK ‘STACK’ DB 100 DUP(?) ;100字节堆栈 STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START PROC FAR PUSH DS MOV AX,0 PUSH AX ;为了返回DOS MOV AX,DATA MOV DS,AX ;置数据段寄存器 MOV BX,OFFSET FEN ;置数据指针 MOV CX,MAX-FEN ;置计数器初值 DEC CX ;N个分数比较N-1次 MOV AL,[BX] ;取第一个分数 LOP:INC BX ;调整指针 CMP AL,[BX] ;与下一数比较 JAE NEXT ;大于等于则转 MOV AL,[BX] ;否则取下一数 NEXT:LOOP LOP ;计数器减一,;不为零转LOP MOV MAX,AL ;存放最高分 RET ;返回DOS START ENDP CODE ENDS END START 6、 静态检查,上机调试 选用指令尽量字节少,使其执行速度快.易错处应重点查,如比较次数、转移条件等.确信无错后方可上机调试.

你的第二次修改,还有一处不足:

……

CLR C

MOV DPTR,#TABLE

LOOP:

CLR A 这里少了一句,下面每次读出的,

就不知道是什么了

MOVC A,@A+DPTR

JNZ CONT_P

INC R2

SJMP NEXT

……

可以正常计数的程序如下。

=========================================

ORG 0H

MOV A,#00H

MOV R2,A

MOV R3,A

MOV R4,A

MOV R6,A

MOV R5,#40

CLR C

MOV DPTR,#TABLE

LOOP:

CLR A

MOVC A,@A+DPTR

JNZ CONT_P

CJNE A,#00H,CONT_P

INC R2

SJMP NEXT

CONT_P:

JB ACC.7, CONT_N

INC R3

SJMP NEXT

CONT_N:

INC R4

NEXT:

INC DPTR

DJNZ R5, LOOP

MOV P0,R4

SJMP $

实际个数 保存单元 统计个数

零个数 14R2 21

正数个数19R3 19

负数个数:7R4 0

其实是零和负数没有分开统计,请高手指教一下,谢谢!

ORG 400H

TABLE:

DB 01H, 15H, 22H,0FFH, 00H, 02H, 09H,0F9H, 00H, 00H

DB 01H, 15H, 22H,0FFH, 00H, 02H, 09H,0F9H, 00H, 00H

DB 01H, 15H, 22H,0FFH, 00H, 02H, 09H,0F9H, 00H, 00H

DB 02H, 05H, 00H,0FFH, 26H, 34H, 00H, 00H, 00H, 00H

END


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11831080.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-19
下一篇2023-05-19

发表评论

登录后才能评论

评论列表(0条)

    保存