找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1335|回复: 3
收起左侧

单片机数码管那一段汇编程序看不懂

[复制链接]
ID:928089 发表于 2021-6-7 17:12 | 显示全部楼层 |阅读模式
  1. DQ      EQU     P3.3            ;P3.3定义接口,参考STC89C51数据手册
  2. EX2     EQU     P3.2            ;外部中断0,参考STC89C51数据手册
  3. SEG1    EQU     0ffech          ;数码管1(最右)
  4. SEG2    EQU     0ffedh          ;数码管2
  5. SEG3    EQU     0ffeeh          ;数码管3
  6. SEG4    EQU     0ffefh          ;数码管4(最左)
  7. BYT_DLY EQU     5FH             ;延时函数参数变量
  8. DA_BUF  EQU     40H             ;解码出的数据缓冲区,包括41H


  9.                 ORG 0000h
  10.                 LJMP MAIN

  11.                 ORG 003H       ;外部中断0入口地址,参考STC89C51数据手册
  12.                 LJMP EINT3

  13.                 ORG 40H
  14. MAIN:           MOV SP,#60H
  15.                 SETB EA
  16.                 SETB EX0
  17.                 SJMP $;         ;原地踏步,等中断解码


  18. ;//中断接收解码模块

  19. EINT3:          CLR EA;//关闭
  20.                 MOV R6,#10
  21. SB:             MOV BYT_DLY,#13 ;834uS
  22.                 LCALL DELAY     ;调用834微秒延时子程序
  23.                 JB DQ,EXIT      ;延时834微秒后判断DQ脚是否出现高电平如果有就退出解码程序
  24.                 DJNZ R6, SB     ;重复 10 次,目的是检测在 9000 微秒内如果出现高电平就退出解码程序
  25. ;-------------------------------;以上完成对遥控信号 起始码 的 9000 微秒的初始低电平信号的识别!!!!!

  26.                 JNB DQ, $;      ;等待,避开 起始码 低电平
  27.                 JB DQ,$;        ;避开结果码


  28. ;/*;测试按键一次有多少位低电平,不同遥控器不一样*/
  29. ;/*;电工电子中心投影遥控器只有32位,这对后边程序参数设置关系重大
  30. ;                CLR A
  31. ;ADDLOOP:        JNB DQ,$
  32. ;               ADD A,#1
  33.   ;              MOV P1,A
  34.    ;             JB DQ,cADD
  35.    ;             sjmp $
  36. ;*/

  37.                 MOV R7,#16      ;忽略前16位系统识别码 (即地址码)
  38. AAQQ:           JNB DQ,$;       ;通过低电平段
  39.                 ;JB DQ,[        DISCUZ_CODE_1        ]nbsp;       ;以下6行代码可以用本行替换,但这样容易出现死机。
  40.                 MOV R6,#255
  41. CTN2:           JNB DQ,DER7     ;等待有效低电平到来,避开 结果码 高电平
  42.                 MOV BYT_DLY,#3  ;42uS
  43.                 ACALL DELAY     ;调用42微秒延时子程序,延时太短,计数器R6不够大,延时太长,会错过最佳检测点
  44.                 DJNZ R6,CTN2                     
  45.                 LJMP EXIT       ;防止死机
  46. DER7:           DJNZ R7,AAQQ

  47.                 MOV R1,#DA_BUF  ;设定1AH为起始RAM区
  48.                 MOV R2,#2       ;接收从DA_BUF到DA_BUF+1的2个内存,用于存放操作码 (即数据码) 和操作反码
  49. PP:             MOV R3,#8       ;每组数据为8位
  50. JJJJ:           JNB DQ,[        DISCUZ_CODE_0        ]nbsp;       ;等待通过数据码的低电平信号,等高电平到来后出去;
  51.                 MOV BYT_DLY,#13 ;834uS
  52.                 ACALL DELAY     ;高电平开始后用840(560<t<1125,)微秒的时间尺去判断信号此时的高低电平状态
  53.                 MOV C,DQ        ;将DQ引脚此时的电平状态0或1存入C中
  54.                 JNC UUU         ;如果为0就跳转到UUU
  55.                 ;JB DQ,[        DISCUZ_CODE_1        ]nbsp;       ;以下6行代码可以用本行替换,但这样容易出现死机。
  56.                 MOV R6,#255
  57. CTN3:           JNB DQ,UUU      ;等待有效低电平到来,避开 结果码 高电平
  58.                 MOV BYT_DLY,#3  ;42uS
  59.                 ACALL DELAY     ;调用840微秒延时子程序
  60.                 DJNZ R6,CTN3            
  61.                 LJMP EXIT       ;防止死机

  62. UUU:            MOV A,@R1       ;将R1中地址的给A
  63.                 RRC A           ;将C中的值0或1移入A中的最低位
  64.                 MOV @R1,A       ;将A中的数暂时存放在R1数值的内存中
  65.                 DJNZ R3,JJJJ    ;接收满8位换一个内存

  66.                 INC R1          ;对R1中的值加1,换下一个RAM
  67.                 DJNZ R2,PP      ;接收完8位数据码和8位数据反码,存放在1AH/1BH中                          

  68.                 MOV A,DA_BUF
  69.                 CPL A           ;对1AH取反后和1BH比较
  70.                 CJNE A,DA_BUF+1,EXIT    ;如果不等表示接收数据发生错误,放弃

  71.                 MOV R7,DA_BUF   ;将按键的键值通过数码管显示出来!
  72.                 ACALL DISP
  73. ;               CLR P1.0        ;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功               
  74.   ;              MOV BYT_DLY,#50
  75.   ;              ACALL DELAY
  76.   ;              SETB P1.0       ;蜂鸣器停止
  77. EXIT:           SETB EA
  78.                 RETI


  79. ;-------------------------延时子程序---------------------------------
  80. ;晶振22.1184M

  81. DELAY:   ;误差 0us
  82.     MOV R6,#03H
  83. DL0:
  84.     MOV R5,#89H
  85.     DJNZ R5,$
  86.     DJNZ R6,DL0
  87.     RET

  88. ;//数码管显示,数据由R7传入
  89. DISP:          MOV DPTR #LEDMAP
  90.                MOV A,R7
  91.                ANL A,#0FH
  92.                MOVC A,@A+DPTR
  93.                MOV DPTR,#SEG1
  94.                CPL A
  95.                MOVX @DPTR,A

  96.                MOV DPTR,#LEDMAP
  97.                 mov a,r7
  98.                 swap a                                 
  99.                 anl a,#0fh
  100.                 movc a,@a+dptr
  101.                 mov dptr,#SEG2
  102.                 cpl a
  103.                 movx @dptr,a

  104.                 mov dptr,#SEG3
  105.                 mov a,#0ffh
  106.                 movx @dptr,a
  107.                 mov dptr,#SEG4         
  108.                 movx @dptr,a  
  109.                 ret

  110. ledmap: db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,77h,7ch,39h,5eh,79h,71h,

  111.                 END
复制代码

回复

使用道具 举报

ID:94031 发表于 2021-6-7 19:26 | 显示全部楼层
要看懂,先要理解数码管显示原理。
回复

使用道具 举报

ID:155507 发表于 2021-6-7 20:24 | 显示全部楼层
软件都是基于硬件条件编写的,没有原理图 …不知道可不可以帮到你……

  1. ;//数码管显示,数据由R7传入     数码管静态显示电路 总线方式驱动
  2. DISP:          MOV DPTR #LEDMAP ;指针指向 数码管段码表
  3.                MOV A,R7         ;将数据由R7放入累加器
  4.                ANL A,#0FH       ;清除高 4 位
  5.                MOVC A,@A+DPTR   ;将数码管段码表 转换数据放入累加器
  6.                MOV DPTR,#SEG1   ;指针指向数码管1 0FFECH
  7.                CPL A            ;将 累加器 A中的值按位取反
  8.                MOVX @DPTR,A     ;输出段码

  9.                MOV DPTR,#LEDMAP ;指针指向 数码管段码表
  10.                 MOV A,R7        ;将数据由R7放入累加器
  11.                 SWAP A          ;累加器 A 中 低四位与高四位内容交换
  12.                 ANL A,#0FH      ;清除高 4 位
  13.                 MOVC A,@A+DPTR  ;将数码管段码表 转换数据放入累加器
  14.                 MOV DPTR,#SEG2  ;指针指向数码管2 0FFEDH
  15.                 CPL A           ;将 累加器 A中的值按位取反
  16.                 MOVX @DPTR,A    ;输出段码

  17.                 MOV DPTR,#SEG3  ;指针指向 数码管3 0FFEEH
  18.                 MOV A,#0FFH     ;将数据0FFH 放入累加器  消隐       
  19.                 MOVX @DPTR,A    ;输出段码
  20.                 MOV DPTR,#SEG4  ;指针指向 数码管4 0FFEFH        
  21.                 MOVX @DPTR,A    ;输出段码
  22.                 RET

  23. LEDMAP: db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,77h,7ch,39h,5eh,79h,71h, ;共阴极数码管段码表
复制代码
回复

使用道具 举报

ID:298123 发表于 2021-6-8 15:04 | 显示全部楼层
为什么还要汇编?如果纯粹学习,倒是可以研究一番
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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