搜索
bottom↓
回复: 6

请教汇编高人,这段PT2272 模拟解码器的程序要怎么玩得起...

[复制链接]

出0入0汤圆

发表于 2013-10-3 11:52:26 | 显示全部楼层 |阅读模式
  1. ; =========================================================================================
  2. ; =========================================================================================
  3. ;   PT2272 模拟解码器(接收来自射频解码模块的2262格式串行数据流)
  4. ;   管理三位数码管显示器
  5. ;   利用AT24C32实现堆栈式掉电缓存保护,通过特殊的清除发射器清除堆栈
  6. ;   显示器具有两级亮度变化
  7. ;   具有蜂鸣器,新的编码收到后,蜂鸣器鸣响2/3次,显示器高亮,三秒后正常
  8. ;
  9. ;   CPU: AT89C2051@12MHz
  10. ;
  11. ;                                COPYRIGHT yanggt@163.net SEP 9, 2004
  12. ; =========================================================================================
  13. ; =========================================================================================

  14. EESIZE        EQU        16384                ;EEPROM容量(32768/16384/8192/4096/2048/1024/512);原值32768
  15. PWDF        EQU        50H                        ;EEPROM中用于标识历史记录有效
  16. MYA0_3        EQU        00000111B        ;有效识别码,不匹配则不响应;原值00010101
  17. MYCLRL        EQU        00H                        ;主控手机编码值(目前为 0000H)
  18. MYCLRH        EQU        00H                        ;根据A4-A11计算得到(00 D7 D6 D5 D4 D3 D2 D1)(D0)
  19. BELONT        EQU        40                        ;声音鸣响时间
  20. BELOFT        EQU        20                        ;静音时间


  21. SCL        BIT        P3.1                        ;AT24C32(4K字节);原值P3.0
  22. SDA        BIT        P3.0                        ;;原值P3.1

  23. SIGPIN        BIT        P3.3                ;接收信号入口;原值P3.2

  24. BELL        BIT        P3.7                ;蜂鸣器控制;原值P3.3

  25. VSEL        BIT        P3.4                ;LED亮度选择,H=高亮度;原值P1.0


  26. U0E        BIT        P2.5                        ;个位LED位选;原值P3.5
  27. U1E        BIT        P2.4                        ;十位LED位选;原值P3.4
  28. U2E        BIT        P2.3                        ;百位LED位选;原值P3.7

  29. BELLSW  BIT     78H                ;蜂鸣器运行期间=1
  30. EEEMPTY BIT     79H                ;EEPROM空标志
  31. BELLON        BIT        7AH                        ;通知蜂鸣器鸣响
  32. CODEOK        BIT        7BH                        ;收到的编码正确
  33. TMK250        BIT        7CH                        ;250us标志,每250us置位一次
  34. SIGING        BIT        7DH                        ;手机发射信号正在持续=1,无信号=0
  35. LEDHIGH BIT        7EH                        ;显示器亮度标志=0:正常;=1:高亮
  36. TOUTMK        BIT        7FH                        ;显示器降低亮度时间已到=1

  37. RBUF81        DATA        20H                        ;后8位第一次采样结果A4-A11
  38. RBUF82        DATA        21H                        ;后8位第二次采样结果A4-A11
  39. RBUF44        DATA        22H                        ;前4位第12次采样结果A0-A3

  40. SIGPOT        DATA        23H                        ;接收引脚上次电平,直接保存P3口全部内容
  41. SIGMSK        EQU                08H                        ;SIG----P3.3;原值P3.2,04H

  42. TCNTL        DATA        24H                        ;定时计数器(4ms时基)
  43. TCNTH        DATA        25H

  44. TMX16        DATA        26H                        ;16*250=4000us=4ms
  45. BELLTM        DATA        27H                        ;鸣响时间

  46. DBUF0        DATA        28H                        ;个位显示缓冲区
  47. DBUF1        DATA        29H                        ;十位
  48. DBUF2        DATA        2AH                        ;百位


  49. EEPTRL        DATA        2BH                        ;EEPROM当前位置指针
  50. EEPTRH        DATA        2CH
  51. EEPOL        DATA        2DH                        ;保存清除指针
  52. EEPOH        DATA        2EH                        ;

  53. RES2F        DATA        2FH                        ;使用其中的标志位

  54. EEBUF        DATA        30H                        ;30-37H, I2C缓冲区

  55. BELLCNT        DATA        38H                        ;鸣响次数计数器(3/2/1)
  56. BELLTMK        DATA        39H

  57. CODEL        DATA        40H                        ;接收到编码低位
  58. CODEH        DATA        41H                        ;高位
  59. CODELK  DATA    42H         ;保存上一个编码
  60. CODEHK  DATA    43H         ;
  61. CODE1L        DATA        44H
  62. CODE1H        DATA        45H

  63. ; =========================================================================================

  64. ; =========================================================================================
  65.         ORG        0000H
  66.         LJMP        START

  67. ; =========================================================================================
  68. ;   250us进入一次,每16次(4ms)切换一次显示位
  69. ; =========================================================================================
  70.         ORG        000BH                        ;定时器0中断入口,独占 R7
  71. TM0SUB: SETB        TMK250
  72. TM0_4MS:DJNZ        TMX16, TM0_E
  73.         MOV        TMX16, #10H

  74.         JNB        BELLSW, TM0_CLY
  75.         DJNZ        BELLTM, TM0_CLY
  76.         SETB        BELLON

  77. TM0_CLY:JB        TOUTMK, TM0_0                ;每4ms执行一次
  78.         DJNZ        TCNTL, TM0_0
  79.         DJNZ        TCNTH, TM0_0
  80.         SETB        TOUTMK

  81. TM0_0:        CJNE        R7, #0, TM0_1                ;当前显示位
  82.         CLR        U2E
  83.         MOV        P0, DBUF0
  84.         INC        R7
  85.         SETB        U0E
  86.         RETI

  87. TM0_1:        CJNE        R7, #1, TM0_2
  88.         CLR        U0E
  89.         MOV        P0, DBUF1
  90.         INC        R7
  91.         SETB        U1E
  92.         RETI

  93. TM0_2:        CLR        U1E
  94.         MOV        P0, DBUF2
  95.         MOV        R7, #0
  96.         SETB        U2E
  97.         RETI
  98. TM0_E:        RETI


  99. ; =========================================================================================

  100. ; =========================================================================================
  101. START:        MOV        P0, #0FFH                ;关闭显示器,正常亮度
  102. CLR P2.0
  103. CLR P2.1
  104. CLR P2.2
  105.         CLR        BELLON
  106.         CLR     BELL

  107.         ACALL        EECHK                        ;检查EEPROM,确定指针,提取其中最后一个历史记录号码
  108.         ACALL        TOBUF

  109.         MOV        TMX16, #10H                ;中断计数寄存器置初始值16
  110.         SETB        TOUTMK                        ;延迟定时器处于停止状态
  111.         CLR        U0E
  112.         CLR        U1E
  113.         CLR        U2E
  114.         MOV        R7, #00H                ;从第一位开始显示

  115.         MOV        TMOD, #12H                ;TIMER0, MODE 2, TIMER1, MODE 1
  116.         MOV        TL0, #06H
  117.         MOV        TH0, #06H                ;时间=250us
  118.         SETB        TR0
  119.         SETB        ET0
  120.         SETB        EA

  121.         MOV        A, #6-1                 ;开机时蜂鸣器自动鸣响
  122.         ACALL        BELL_S
  123.         MOV        BELLTM, #BELONT-20

  124.         ACALL        LEDOFF
  125.         CLR        LEDHIGH                 ;关闭高亮度
  126.         MOV        SIGPOT, #00H                ;假设开始时接收引脚=0
  127.         CLR        SIGING
  128.         SETB        F0
  129. ;=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--
  130. MAIN:   JNB     BELLSW, MAIN_S0
  131.         ACALL        BELL_M

  132. MAIN_S0:JNB        LEDHIGH, MAIN_00         ;显示器普通亮度,不检查标志
  133.         JNB        TOUTMK, MAIN_0
  134.         ACALL        LEDOFF                        ;显示器回到正常亮度
  135.         CLR        LEDHIGH
  136.         JB        EEEMPTY, MAIN_0                ;没有尚未确认的编码
  137.         AJMP        MAIN_01

  138. MAIN_00:JB        EEEMPTY, MAIN_0                ;没有尚未确认的编码
  139.         JNB        TOUTMK, MAIN_0
  140.         MOV     A, #2-1
  141.         ACALL        BELL_S                        ;鸣响
  142. MAIN_01:MOV        TCNTL, #LOW(5000/4)        ;高亮度持续3000ms=3s后恢复
  143.         MOV        TCNTH, #HIGH(5000/4)
  144.         CLR        TOUTMK
  145.         MOV        BELLTM, #30

  146. MAIN_0: MOV        A, P3                        ;监视SIG引脚电平变化
  147.         XCH        A, SIGPOT
  148.         XRL        A, SIGPOT
  149.         ANL        A, #SIGMSK
  150.         JZ        MAIN                        ;A=0表示引脚电平无变化

  151.         SETB        F0
  152.         ACALL        GETCOD                        ;开始接收,出错后直接返回
  153.         JC        MAIN                        ;接收代码无效,舍弃。
  154.         ACALL        FIND
  155.         JC        MAIN                        ;C=1,表示代码无效,什么也不发生
  156.         MOV        CODE1L, CODEL
  157.         MOV        CODE1H, CODEH

  158.         CLR        F0
  159.         ACALL        GETCOD                        ;开始接收,出错后直接返回
  160.         SETB        F0
  161.         JC        MAIN                        ;接收代码无效,舍弃。
  162.         ACALL        FIND
  163.         JC        MAIN                        ;C=1,表示代码无效,什么也不发生
  164.         MOV        B, A
  165.         MOV        A, CODE1L
  166.         XRL        A, CODEL
  167.         JNZ        MAIN_0D
  168.         MOV        A, CODE1H
  169.         XRL        A, CODEH
  170.         JZ        MAIN_0C

  171. MAIN_0D:MOV        CODE1L, CODEL
  172.         MOV        CODE1H, CODEH
  173.         CLR        F0
  174.         ACALL        GETCOD                        ;开始接收,出错后直接返回
  175.         SETB        F0
  176.         JC        MAIN                        ;接收代码无效,舍弃。
  177.         ACALL        FIND
  178.         JC        MAIN                        ;C=1,表示代码无效,什么也不发生
  179.         MOV        B, A
  180.         MOV        A, CODE1L
  181.         XRL        A, CODEL
  182.         JNZ        MAIN_E
  183.         MOV        A, CODE1H
  184.         XRL        A, CODEH
  185.         JNZ        MAIN_E

  186. MAIN_0C:MOV        A, B
  187.         JNZ        MAIN_1                        ;A=1:主控手机,转去退栈
  188.         MOV        BELLCNT, #4-1
  189.         MOV     A, CODEL
  190.         XRL     A, CODELK
  191.         JNZ     MAIN_0A
  192.         MOV     A, CODEH
  193.         XRL     A, CODEHK
  194.         JZ      MAIN_0B

  195. ;这里可以进行编码过滤=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

  196. MAIN_0A:MOV        BELLCNT, #6-1
  197.         ACALL        EEPUSH                        ;其他手机,转去保存、显示
  198.         ACALL        TOBUF
  199. MAIN_0B:SETB        TOUTMK
  200.         MOV        TCNTL, #LOW(3000/4)        ;高亮度持续3000ms=3s后恢复
  201.         MOV        TCNTH, #HIGH(3000/4)
  202.         CLR        TOUTMK
  203.         SETB        LEDHIGH                 ;显示器进入高亮状态
  204.         MOV     A, BELLCNT
  205.         ACALL        BELL_S                        ;鸣响
  206.         MOV        BELLTM, #BELONT
  207.         AJMP        MAIN

  208. MAIN_1: MOV        A, CODEL                ;核对手机号码
  209.         XRL        A, #MYCLRL
  210.         JNZ        MAIN_E
  211.         MOV        A, CODEH
  212.         XRL        A, #MYCLRH
  213.         JNZ        MAIN_E
  214.         ACALL        EEPOP                        ;执行退栈操作

  215. MAIN_E:        AJMP        MAIN


  216. ; =========================================================================================
  217. ;        主程序结束



  218. ; =========================================================================================
  219. BELL_S: MOV     BELLCNT, A
  220.         SETB        BELLSW
  221.         CLR        BELL ;SETB
  222.         RET


  223. ; =========================================================================================
  224. BELL_M: JBC        BELLON, BELLM
  225.         RET
  226. BELLM:        MOV        A, BELLCNT
  227. BELLM0:        JNB        ACC.0, BELLM1
  228.         MOV        BELLTM, #BELOFT                ;A.0=1,正在鸣响,应该关闭
  229.         CLR        BELL
  230.         AJMP        BELLM9
  231. BELLM1:        MOV        BELLTM, #BELONT                ;静音状态,应该打开
  232.         SETB        BELL
  233. BELLM9:        DJNZ        BELLCNT, BELLME
  234.         CLR        BELLSW
  235.         CLR        BELL
  236. BELLME:        RET


  237. ; =========================================================================================
  238. LEDOFF: ANL        DBUF0, #0FFH
  239.         ANL        DBUF1, #0FFH
  240.         ANL        DBUF2, #0FFH
  241.         RET

  242. ; =========================================================================================

  243. ; =========================================================================================
  244. TM1SET: CLR        TR1                        ;1,ACALL=2
  245.         CLR        TF1                        ;1
  246.         MOV        TL1, DPL                ;2
  247.         MOV        TH1, DPH                ;2
  248.         SETB        TR1                        ;1
  249.         RET                                ;2, TOTAL=2+1+1+2+2+1+2=11us

  250. ; =========================================================================================
  251. ;  接收代码,收到两个相同的编码即认可。
  252. ;  发射结束后接收下一个。
  253. ; =========================================================================================
  254. GETCOD: NOP

  255. GETC_S: MOV        DPTR, #65535-50000        ;在50ms内搜索至少持续4ms的低电平        [***]
  256.         ACALL        TM1SET
  257. GETC_S0:MOV        R6, #16                 ;16*250us=4000us=4ms
  258. GETC_S1:CLR        TMK250
  259. GETC_S2:JB        TF1, GETC_E                ;这里超时认为目前无发射器工作,或上次发射已结束。
  260.         JB        SIGPIN, GETC_S0
  261.         JNB        TMK250, GETC_S2
  262.         DJNZ        R6, GETC_S1

  263.         MOV        R5, #4*2                ;首先接收A0-A3,共4位,8个采样点

  264.         MOV        DPTR, #65535-8000        ;在接下来的8ms内必须出现上升沿                [***]
  265.         ACALL        TM1SET
  266. GETC_0: JB        TF1, GETC_E                ;这里超时认为目前无发射器工作,或上次发射已结束。
  267.         JNB        SIGPIN, GETC_0
  268. ;        JB        SIGING, GETC_F                ;上次发射尚未结束,直接返回,不接收编码。
  269. ;        AJMP        GETC_20
  270.         JNB        SIGING, GETC_20                ;上次发射尚未结束,直接返回,不接收编码。
  271.         JNB        F0, GETC_20
  272.         AJMP        GETC_F

  273. GETC_1P:MOV        DPTR, #65535-1250+11+2        ;在接下来的1250us内必须出现低电平        [***]
  274.         ACALL        TM1SET
  275. GETC_1: JB        TF1, GETC_F                ;超时
  276.         JB        SIGPIN, GETC_1

  277.         MOV        DPTR, #65535-1250+11+2        ;在接下来的1250us内必须出现上升沿        [***]
  278.         ACALL        TM1SET
  279. GETC_2: JB        TF1, GETC_F                ;超时
  280.         JNB        SIGPIN, GETC_2
  281. GETC_20:MOV        DPTR, #65535-500+11+2        ;固定延迟500us后采样
  282.         ACALL        TM1SET
  283.         JNB        TF1, $

  284.         MOV        C, SIGPIN                ;采样接收信号
  285.         MOV        A, RBUF44
  286.         RLC        A
  287.         MOV        RBUF44, A

  288.         DJNZ        R5, GETC_1P                ;循环接收4个数据位,进行8次采样


  289.         MOV        R5, #8*2                ;接收A4-A11,共8个数据位,16个采样点
  290.         MOV        R0, #RBUF81                ;RBUF81存放第一次采样值
  291. GETC_3P:MOV        DPTR, #65535-1250+11+2        ;在接下来的1250us内必须出现低电平        [***]
  292.         ACALL        TM1SET
  293. GETC_3: JB        TF1, GETC_F                ;超时
  294.         JB        SIGPIN, GETC_3

  295.         MOV        DPTR, #65535-1250+11+2        ;在接下来的1250us内必须出现上升沿        [***]
  296.         ACALL        TM1SET
  297. GETC_4: JB        TF1, GETC_F                ;超时
  298.         JNB        SIGPIN, GETC_4
  299. GETC_40:MOV        DPTR, #65535-500+11+2        ;固定延迟500us后采样
  300.         ACALL        TM1SET
  301.         JNB        TF1, $

  302.         MOV        C, SIGPIN                ;采样接收信号
  303.         MOV        A, @R0
  304.         RLC        A
  305.         MOV        @R0, A
  306.         XRL        00H, #RBUF81                ;在RBUF81和RBUF82之间切换
  307.         XRL        00H, #RBUF82

  308.         DJNZ        R5, GETC_3P                ;循环接收8个数据位,进行16次采样
  309.         SETB        SIGING
  310.         CLR        C
  311.         RET

  312. GETC_E: CLR        SIGING
  313. GETC_F: SETB        C
  314.         RET

  315. ; =========================================================================================

  316. ; =========================================================================================
  317. FIND:        MOV        A, RBUF44                ;分析代码
  318.         CJNE        A, #MYA0_3, FIND_E

  319.         MOV        R4, RBUF81
  320.         MOV        R5, RBUF82

  321.         MOV        R6, #7
  322.         MOV        R0, #00H
  323.         MOV        R1, #00H
  324. FIND_L: MOV        A, R0                        ;结果乘以 3
  325.         CLR        C
  326.         RLC        A
  327.         MOV        B, A
  328.         MOV        A, R1
  329.         RLC        A
  330.         XCH        A, B
  331.         ADD        A, R0
  332.         MOV        R0, A
  333.         MOV        A, B
  334.         ADDC        A, R1
  335.         MOV        R1, A                        ;结果乘以 3 结束

  336.         MOV        A, R4
  337.         RLC        A
  338.         MOV        R4, A                        ;D7-->C
  339.         MOV        A, R5
  340.         RL        A
  341.         MOV        R5, A
  342.         ANL        A, #01H                 ;D7-->A.0
  343.         ADDC        A, R0                        ;A.0+C+R0
  344.         MOV        R0, A
  345.         MOV        A, R1
  346.         ADDC        A, #00H
  347.         MOV        R1, A
  348.         DJNZ        R6, FIND_L                ;确定A4-A10的编码结果

  349.         CLR        A
  350.         MOV        C, RBUF81.0                ;分析代码,确定是否主控手机
  351.         MOV        ACC.0, C
  352.         MOV        C, RBUF82.0
  353.         ADDC        A, #00H                 ;A=(0,1,2)。A=0:非主控手机;A=1:主控手机;A=2:无效手机
  354.         JB        ACC.1, FIND_E                ;A=2!
  355.         MOV        CODEL, R0
  356.         MOV        CODEH, R1
  357.         CLR        C
  358.         RET                                ;A=0/1

  359. FIND_E: SETB        C
  360.         RET

  361. ; =========================================================================================

  362. ; =========================================================================================
  363. EECHK:        MOV        EEPTRL, #00H                ;0000H记录不用,因为0000H用于判断EEPROM是否空
  364.         MOV        EEPTRH, #00H
  365.         MOV        EEBUF, #00H
  366.         MOV        EEBUF+1, #00H

  367. EECHK0:        MOV        CODEL, EEBUF                ;放到编码缓冲区
  368.         MOV        CODEH, EEBUF+1
  369.         ANL        CODEH, #0FH
  370.         MOV        DPL, EEPTRL                ;读取栈底的两个字节
  371.         MOV        DPH, EEPTRH
  372.         INC        DPTR
  373.         INC        DPTR                        ;指向下一个记录,但是暂时不修改指针
  374.         MOV        A, DPH
  375.         ADD        A, #HIGH(65536-EESIZE)        ;???
  376.         JC        EECHK9                        ;已经检查完所有记录空间。
  377.         MOV        EEPOL, DPL
  378.         MOV        EEPOH, DPH                ;暂时保存在这里
  379.         MOV        R0, #EEBUF
  380.         MOV        B, #02H
  381.         ACALL        I2CD_R
  382.         MOV        A, EEBUF+1
  383.         ANL        A, #0F0H
  384.         XRL        A, #PWDF
  385.         JNZ        EECHK9
  386.         MOV        EEPTRL, EEPOL
  387.         MOV        EEPTRH, EEPOH
  388.         AJMP        EECHK0

  389. EECHK9:        CLR        EEEMPTY                        ;假设非空
  390.         MOV        A, EEPTRL
  391.         ORL        A, EEPTRH
  392.         JNZ        EECHKE
  393.         SETB        EEEMPTY                        ;声明EEPROM空
  394. EECHKE:        RET


  395. ; =========================================================================================

  396. ; =========================================================================================
  397. EEPUSH: MOV        EEBUF, CODEL                ;写入EEPROM栈,采用实栈顶
  398.         MOV        EEBUF+1, CODEH
  399.         ORL        EEBUF+1, #PWDF                ;标志,50H
  400.         MOV        DPL, EEPTRL
  401.         MOV        DPH, EEPTRH
  402.         INC        DPTR                        ;每个记录进入,指针加 2
  403.         INC        DPTR
  404.         MOV        A, DPH                        ;进行堆栈溢出检查
  405.         ADD        A, #HIGH(65536-EESIZE)
  406.         JC        EEPUSHE
  407.         ANL        DPL, #0FEH
  408.         MOV        EEPTRL, DPL
  409.         MOV        EEPTRH, DPH
  410.         MOV        R0, #EEBUF
  411.         MOV        B, #02H
  412.         ACALL        I2CD_W
  413.         CLR        EEEMPTY                        ;声明EEPROM非空
  414. EEPUSHE:RET


  415. ; =========================================================================================

  416. ; =========================================================================================
  417. EEPOP:        MOV        A, EEPTRL                ;EEPROM退出操作
  418.         ORL        A, EEPTRH
  419.         JZ        EEPOPB

  420. EEPOP0: MOV        EEPOL, EEPTRL
  421.         MOV        EEPOH, EEPTRH

  422.         CLR        C                        ;指针减 2,指向上一个数据
  423.         MOV        A, EEPTRL
  424.         SUBB        A, #02H
  425.         MOV        EEPTRL, A
  426.         MOV        A, EEPTRH
  427.         SUBB        A, #00H
  428.         MOV        EEPTRH, A                ;指针已经更新

  429.         MOV        A, EEPTRL                ;检查退出一个记录后,堆栈是否变空?
  430.         ORL        A, EEPTRH
  431.         JNZ        EEPOP1
  432.         MOV        CODEL, A
  433.         MOV        CODEH, A
  434.         SETB        EEEMPTY                        ;声明EEPROM空
  435.         AJMP        EEPOP9

  436. EEPOP1: MOV        DPL, EEPTRL                ;读取栈顶记录
  437.         MOV        DPH, EEPTRH
  438.         MOV        R0, #EEBUF
  439.         MOV        B, #02H
  440.         ACALL        I2CD_R
  441.         MOV        CODEL, EEBUF                ;放到编码缓冲区
  442.         MOV        CODEH, EEBUF+1
  443.         ANL        CODEH, #0FH                ;屏蔽掉标志

  444. EEPOP9: MOV        EEBUF, #00H                ;清除刚才已经退栈的记录
  445.         MOV        EEBUF+1, #00H
  446.         MOV        DPL, EEPOL
  447.         MOV        DPH, EEPOH
  448.         MOV        R0, #EEBUF
  449.         MOV        B, #02H
  450.         ACALL        I2CD_W

  451.         ACALL        TOBUF                        ;送到显示缓冲区
  452.         ACALL        LEDOFF
  453. EEPOPB: MOV     A, #2-1
  454.         ACALL        BELL_S                        ;鸣响
  455. ;        MOV        BELLTM, #30
  456. EEPOPE: RET


  457. ; =========================================================================================

  458. ; =========================================================================================
  459. TOBUF:        MOV        A, CODEL                ;填写显示缓冲区
  460.         MOV        B, CODEH                ;/100
  461.         MOV        R2, #00H
  462. TOBUF_0:CLR        C
  463.         SUBB        A, #100
  464.         XCH        A, B
  465.         SUBB        A, #00H
  466.         XCH        A, B
  467.         JC        TOBUF_8
  468.         INC        R2
  469.         AJMP        TOBUF_0
  470. TOBUF_8:ADD        A, #100
  471.         MOV        B, #10
  472.         DIV        AB
  473.         MOV        DPTR, #FONT
  474.         MOVC        A, @A+DPTR
  475.         MOV        DBUF1, A
  476.         MOV        A, B
  477.         MOVC        A, @A+DPTR
  478.         MOV        DBUF0, A
  479.         MOV        A, R2
  480.         MOVC        A, @A+DPTR
  481.         MOV        DBUF2, A
  482.         MOV     CODELK, CODEL
  483.         MOV     CODEHK, CODEH
  484.         RET


  485. ; =========================================================================================

  486. ; =========================================================================================
  487. DELAY:        PUSH        ACC                        ;延迟时间=A*10ms
  488.         MOV        A, #20
  489. DLY1:        PUSH        ACC
  490.         MOV        A, #250
  491.         DJNZ        ACC, $                        ;500us
  492.         POP        ACC
  493.         DJNZ        ACC, DLY1
  494.         POP        ACC
  495.         DJNZ        ACC, DELAY
  496.         RET


  497. ;======= I2C 子程序        =================================================================
  498. ;        I2CD_W, I2CD_R                ;LAYER 1
  499. ;        I2C_O,        I2C_I                ;LAYER 2
  500. ;        I2C_BG, I2C_ED                ;LAYER 3
  501. ;========================================================================================
  502. ;        向存储器写入几个字节,最多8个字节。
  503. ;        入口:DPTR 要写的EEPROM存储单元地址。
  504. ;              R0   指向要写入字节在RAM的首地址。
  505. ;              B    写入字节个数。
  506. ;        出口:如果 C=1,说明写出错。

  507. I2CD_W: ACALL        I2C_BG
  508.         MOV        A, #10100000B        ;写命令
  509.         ACALL        I2C_O
  510.         JC        I2CD_WE         ;C=1, 未收到 ACK 位,出错,不再继续处理,直接返回

  511.         MOV        A, DPH
  512.         ACALL        I2C_O
  513.         JC        I2CD_WE

  514.         MOV        A, DPL
  515.         ACALL        I2C_O
  516.         JC        I2CD_WE

  517. I2CD_WL:MOV        A, @R0
  518.         ACALL        I2C_O
  519.         JC        I2CD_WE
  520.         INC        R0
  521.         DJNZ        B, I2CD_WL

  522.         ACALL        I2C_ED
  523.         CLR        C
  524.         RET
  525. I2CD_WE:ACALL        I2C_ED
  526.         SETB        C
  527.         RET


  528. ; =========================================================================================
  529. ;        从 EEPROM 读入几个字节
  530. ;        入口:DPTR 要读的存储单元地址。
  531. ;              R0   指向要读缓冲区在RAM的首地址。
  532. ;              B    读入字节个数。
  533. ;        出口:读到的内容在缓冲区中,如果 C=1,说明读出错。
  534. I2CD_R: ACALL        I2C_BG
  535.         MOV        A, #10100000B        ;先发送[写]命令
  536.         ACALL        I2C_O
  537.         JC        I2CD_RE         ;C=1, 未收到 ACK 位,出错,不再继续处理,直接返回

  538.         MOV        A, DPH                ;发送地址低位
  539.         ACALL        I2C_O
  540.         JC        I2CD_RE

  541.         MOV        A, DPL                ;发送地址低位
  542.         ACALL        I2C_O
  543.         JC        I2CD_RE

  544.         ACALL        I2C_BG
  545.         MOV        A, #10100001B        ;发送读命令
  546.         ACALL        I2C_O
  547.         JC        I2CD_RE

  548. I2CD_IB:MOV        DPL, #08H        ;取得一个字节
  549.         SETB        SDA
  550. I2CD_IL:SETB        SCL                ;SCL=1
  551.         NOP
  552.         MOV        C, SDA                ;MCU 采样 SDA,送到 C 中
  553.         RLC        A                ;C->ACC.0
  554.         CLR        SCL                ;SCL=0
  555.         DJNZ        DPL, I2CD_IL        ;得到的一个字节在 ACC 中
  556.         MOV        @R0, A
  557.         INC        R0
  558.         MOV        A, B
  559.         XRL        A, #01H
  560.         JZ        I2CD_GO
  561.         CLR        SDA
  562.         NOP
  563. I2CD_GO:SETB        SCL
  564.         NOP
  565.         CLR        SCL
  566.         DJNZ        B, I2CD_IB        ;取得不止一个字节

  567.         ACALL        I2C_ED
  568.         CLR        C
  569.         RET
  570. I2CD_RE:ACALL        I2C_ED
  571.         SETB        C
  572.         RET

  573. ; =========================================================================================
  574. ;向 IIC 总线发送一个字节
  575. I2C_O:        PUSH        B
  576.         MOV        B, #08H
  577. I2C_OLP:RLC        A                ;ACC.7 -> C
  578.         MOV        SDA, C
  579.         SETB        SCL                ;SCL=1
  580.         NOP
  581.         CLR        SCL                ;SCL=0
  582.         DJNZ        B, I2C_OLP
  583.         SETB        SDA                ;准备接收 ACK 位
  584.         SETB        SCL                ;SCL=1, [SDA=1]
  585.         NOP
  586.         MOV        C, SDA
  587.         CLR        SCL
  588.         POP        B
  589.         RET                        ;C=1, 未收到 ACK 位,出错, C=0, 收到 ACK 位,正常

  590. ; =========================================================================================
  591. I2C_BG: SETB        SCL                ;确保SCL=HIGH
  592.         CLR        SDA                ;向 IIC 总线发送开始位
  593.         NOP
  594.         CLR        SCL
  595.         RET

  596. ; =========================================================================================
  597. I2C_ED: CLR        SDA
  598.         SETB        SCL
  599.         NOP
  600.         SETB        SDA                ;向 IIC 总线发送停止位
  601.         RET


  602. ; =========================================================================================
  603. ;最好显示000-999=1000个,否则容易造成误解,这里显示全部2187个,0-9,A-F,H,L,P,U,Y
  604. ; =========================================================================================
  605. FONT:       
  606.         DB        0C0H                        ;"0"
  607.         DB        0F9H                        ;"1"
  608.         DB        0A4H                        ;"2"
  609.         DB        0B0H                        ;"3"
  610.         DB        099H                        ;"4"
  611.         DB        092H                        ;"5"
  612.         DB        082H                        ;"6"
  613.         DB        0F8H                        ;"7"
  614.         DB        080H                        ;"8"
  615.         DB        090H                        ;"9"
  616.         DB        088H                        ;"A"
  617.         DB        083H                        ;"B"
  618.         DB        0C6H                        ;"C"
  619.         DB        0A1H                        ;"D"
  620.         DB        086H                        ;"E"
  621.         DB        08EH                        ;"F"
  622.         DB        089H                        ;"H"
  623.         DB        0F0H                        ;"J"
  624.         DB        0C7H                        ;"L"
  625.         DB        08CH                        ;"P"
  626.         DB        0C1H                        ;"U"
  627.         DB        08DH                        ;"Y"

  628. ; =========================================================================================
  629.         END

复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2013-10-3 11:56:17 | 显示全部楼层
源程序来自网络。
原理图在上面,现在的现象是3个数码管都显示0,按遥控器没有任何反应。
不知道eeprom要不要填内容

出0入0汤圆

发表于 2013-10-3 12:43:22 | 显示全部楼层
不知道楼主的金牌会员是怎么来的

出0入0汤圆

发表于 2013-10-3 15:04:43 | 显示全部楼层
本帖最后由 duanll 于 2013-10-3 17:09 编辑

同问,楼主有何秘方能快速拿到金牌会员资格?

难道楼主的ID被人偷了??

出0入0汤圆

发表于 2013-10-4 16:15:29 | 显示全部楼层
楼主给点莫元吧.
问问题又不给莫元,太勾了!

出0入0汤圆

发表于 2013-10-4 16:16:48 | 显示全部楼层
duanll 发表于 2013-10-3 15:04
同问,楼主有何秘方能快速拿到金牌会员资格?

难道楼主的ID被人偷了?? ...

楼主发了74个主题,拿到金牌很正常,只要发的贴有人气.

出0入0汤圆

 楼主| 发表于 2013-10-6 23:08:55 | 显示全部楼层
我只能说有些人的脑袋装在裤裆里了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 14:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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