EDN首页   博客首页

最新日志

发表于:2008-4-10 21:25:04
标签:无标签

1

PDF单片机及接口芯片

点击下载点击下载点击下载点击下载点击下载点击下载点击下载

系统分类: 单片机   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(349)
发表于:2008-2-26 17:24:58
标签:无标签

2

i++ ++i

#includ"stido.h"
main()
{
int a="5";
z=(++a)+(a++)+(++a);       //*z=6+6+8=20    *//

printf("z=%d",&z);
}

得20。对吗???  

单片机用C好还是用汇编的好。!!?  为什么??

系统分类: 软件开发   |    用户分类: 无分类    |    来源: 无分类

评论(2) | 阅读(685)
发表于:2008-1-1 9:46:05
标签:无标签

1

单片机电子时钟程序

  定时器T0、T1溢出周期为50MS,T0为秒计数用,T1为调整时闪烁用,
;  P3.5为调整按钮,P0口 为字符输出口,P2口为位选端,采用共阳显示管。
;  时间调整方法:按P3.5未超过1s进入省电模式,数码管不亮,内部时钟计时
;  按P3.5超过1s进入调整模式,要调整的时间会闪动,此时,按下P3.5超过0.5S,
;  进入下位调整,按下P3.5未超过0.5S,当前位加一
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;           中断入口程序              ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
              ORG 0000H        ;程序执行开始地址
              LJMP START       ;跳到标号START执行
              ORG 0003H        ;外中断0中断程序入口
              RETI             ;外中断0中断返回
              ORG 000BH        ;定时器T0中断程序入口
              LJMP INTT0       ;跳至INTTO执行
              ORG 0013H        ;外中断1中断程序入口
              RETI             ;外中断1中断返回
              ORG 001BH        ;定时器T1中断程序入口
              LJMP INTT1       ;跳至INTT1执行
              ORG 0023H        ;串行中断程序入口地址
              RETI             ;串行中断程序返回
;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;           主 程 序                 ;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
            START: MOV   R0,#70H        ;清70H-7AH共11个内存单元
                   MOV   R7,#0BH        ;
       CLEARDISP:  MOV   @R0,#00H       ;
                   INC   R0             ;
                   DJNZ  R7,CLEARDISP   ;
                   MOV   20H,#00H       ;清20H(标志用)
                   MOV   7AH,#0AH       ;放入"熄灭符"数据
                   MOV   TMOD,#11H      ;设T0、T1为16位定时器
                   MOV   TL0,#0B0H      ;50MS定时初值(T0计时用)
                   MOV   TH0,#3CH       ;50MS定时初值
                   MOV   TL1,#0B0H      ;50MS定时初值(T1闪烁定时用)
                   MOV   TH1,#3CH       ;50MS定时初值
                   SETB  EA             ;总中断开放
                   SETB  ET0            ;允许T0中断
                   SETB  TR0            ;开启T0定时器
                   MOV   R4,#14H        ;1秒定时用初值(50MS×20)
           START1: LCALL DISPLAY        ;调用显示子程序
                   JNB   P3.5,SETMM1    ;P3.5口为0时转时间调整程序
                   SJMP  START1         ;P3.5口为1时跳回START1
           SETMM1: LJMP  SETMM          ;转到时间调整程序SETMM
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;           1秒计时程序              ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T0中断服务程序
            INTT0: PUSH  ACC           ;累加器入栈保护
                   PUSH  PSW           ;状态字入栈保护
                   CLR   ET0           ;关T0中断允许
                   CLR   TR0           ;关闭定时器T0
                   MOV   A,#0B7H       ;中断响应时间同步修正
                   ADD   A,TL0         ;低8位初值修正
                   MOV   TL0,A         ;重装初值(低8位修正值)
                   MOV   A,#3CH        ;高8位初值修正
                   ADDC  A,TH0         ;
                   MOV   TH0,A         ;重装初值(高8位修正值)
                   SETB  TR0           ;开启定时器T0
                   DJNZ  R4, OUTT0     ;20次中断未到中断退出
           ADDSS:  MOV   R4,#14H       ;20次中断到(1秒)重赋初值
                   MOV   R0,#71H       ;指向秒计时单元(71H-72H)
                   ACALL ADD1          ;调用加1程序(加1秒操作)
                   MOV   A,R3          ;秒数据放入A(R3为2位十进制数组合)
                   CLR   C             ;清进位标志
                   CJNE  A,#60H,ADDMM  ;
           ADDMM:  JC    OUTT0         ;小于60秒时中断退出
                   ACALL CLR0          ;大于或等于60秒时对秒计时单元清0
                   MOV   R0,#77H       ;指向分计时单元(76H-77H)
                   ACALL ADD1          ;分计时单元加1分钟
                   MOV   A,R3          ;分数据放入A
                   CLR   C             ;清进位标志
                   CJNE  A,#60H,ADDHH  ;
            ADDHH: JC    OUTT0         ;小于60分时中断退出
                   ACALL CLR0          ;大于或等于60分时分计时单元清0
                   MOV   R0,#79H       ;指向小时计时单元(78H-79H)
                   ACALL ADD1          ;小时计时单元加1小时
                   MOV   A,R3          ;时数据放入A
                   CLR   C             ;清进位标志
                   CJNE  A,#24H,HOUR   ;
             HOUR: JC    OUTT0         ;小于24小时中断退出
                   ACALL CLR0          ;大于或等于24小时小时计时单元清0
            OUTT0: MOV   72H,76H       ;中断退出时将分、时计时单元数据移
                   MOV   73H,77H       ;入对应显示单元
                   MOV   74H,78H       ;
                   MOV   75H,79H       ;
                   POP   PSW           ;恢复状态字(出栈)
                   POP   ACC           ;恢复累加器
                   SETB  ET0           ;开放T0中断
                   RETI                ;中断返回
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;           闪动调时 程 序            ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T1中断服务程序,用作时间调整时调整单元闪烁指示
INTT1:          PUSH    ACC                ;中断现场保护
                PUSH    PSW                ;
                MOV     TL1,   #0B0H       ;装定时器T1定时初值
                MOV     TH1,   #3CH     ;
                DJNZ    R2,INTT1OUT     ;0.3秒未到退出中断(50MS中断6次)
                MOV     R2,#06H         ;重装0.3秒定时用初值
                CPL     02H             ;0.3秒定时到对闪烁标志取反
                JB      02H,FLASH1      ;02H位为1时显示单元"熄灭"
                MOV     72H,76H       ;02H位为0时正常显示
                MOV     73H,77H       ;
                MOV     74H,78H       ;
                MOV     75H,79H       ;
INTT1OUT:       POP     PSW          ;恢复现场
                POP     ACC           ;
                RETI                  ;中断退出
FLASH1:         JB      01H,FLASH2    ;01H位为1时,转小时熄灭控制
                MOV     72H,7AH       ;01H位为0时,"熄灭符"数据放入分
                MOV     73H,7AH       ;显示单元(72H-73H),将不显示分数据
                MOV     74H,78H       ;
                MOV     75H,79H       ;
                AJMP    INTT1OUT      ;转中断退出
FLASH2:         MOV     72H,76H       ;01H位为1时,"熄灭符"数据放入小时
                MOV     73H,77H       ;显示单元(74H-75H),小时数据将不显示
                MOV     74H,7AH       ;
                MOV     75H,7AH       ;
                AJMP    INTT1OUT      ;转中断退出
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;           加1子 程 序              ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
             ADD1: MOV   A,@R0       ;取当前计时单元数据到A
                   DEC   R0          ;指向前一地址
                   SWAP  A           ;A中数据高四位与低四位交换
                   ORL   A,@R0       ;前一地址中数据放入A中低四位
                   ADD   A,#01H      ;A加1操作
                   DA    A           ;十进制调整
                   MOV   R3,A        ;移入R3寄存器
                   ANL   A,#0FH      ;高四位变0
                   MOV   @R0,A       ;放回前一地址单元
                   MOV   A,R3        ;取回R3中暂存数据
                   INC   R0          ;指向当前地址单元
                   SWAP  A           ;A中数据高四位与低四位交换
                   ANL   A,#0FH      ;高四位变0
                   MOV   @R0,A       ;数据放入当削地址单元中
                   RET              ;子程序返回
   ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;           清零程序                  ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;对计时单元复零用
             CLR0: CLR   A           ;清累加器
                   MOV   @R0,A       ;清当前地址单元
                   DEC   R0          ;指向前一地址
                   MOV   @R0,A       ;前一地址单元清0
                   RET               ;子程序返回
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;           时钟调整程序              ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;当调时按键按下时进入此程序
           SETMM:  cLR   ET0            ;关定时器T0中断
                   CLR   TR0            ;关闭定时器T0
                   LCALL DL1S           ;调用1秒延时程序
                   JB    P3.5,CLOSEDIS  ;键按下时间小于1秒,关闭显示(省电)
                   MOV   R2,#06H        ;进入调时状态,赋闪烁定时初值
                   SETB  ET1            ;允许T1中断
                   SETB  TR1            ;开启定时器T1
            SET2:  JNB   P3.5,SET1      ;P3.5口为0(键未释放),等待
                   SETB  00H            ;键释放,分调整闪烁标志置1
            SET4:  JB    P3.5,SET3      ;等待键按下
                   LCALL DL05S          ;有键按下,延时0.5秒
                   JNB   P3.5,SETHH     ;按下时间大于0.5秒转调小时状态
                   MOV   R0,#77H        ;按下时间小于0.5秒加1分钟操作
                   LCALL ADD1           ;调用加1子程序
                   MOV   A,R3           ;取调整单元数据
                   CLR   C              ;清进位标志
                   CJNE  A,#60H,HHH     ;调整单元数据与60比较
              HHH: JC    SET4           ;调整单元数据小于60转SET4循环
                   LCALL CLR0           ;调整单元数据大于或等于60时清0
                   CLR   C              ;清进位标志
                   AJMP  SET4           ;跳转到SET4循环
        CLOSEDIS:  SETB  ET0            ;省电(LED不显示)状态。开T0中断
                   SETB  TR0            ;开启T0定时器(开时钟)
        CLOSE:     JB    P3.5,CLOSE     ;无按键按下,等待。
                   LCALL DISPLAY        ;有键按下,调显示子程序延时削抖
                   JB    P3.5,CLOSE     ;是干扰返回CLOSE等待
        WAITH:     JNB   P3.5,WAITH     ;等待键释放
                   LJMP  START1         ;返回主程序(LED数据显示亮)
           SETHH:  CLR   00H            ;分闪烁标志清除(进入调小时状态)
          SETHH1:  JNB   P3.5,SET5      ;等待键释放
                   SETB  01H            ;小时调整标志置1
            SET6:  JB    P3.5,SET7      ;等待按键按下
                   LCALL DL05S          ;有键按下延时0.5秒
                   JNB   P3.5,SETOUT    ;按下时间大于0.5秒退出时间调整
                   MOV   R0,#79H        ;按下时间小于0.5秒加1小时操作
                   LCALL ADD1           ;调加1子程序
                   MOV   A,R3           ;
                   CLR   C              ;
                   CJNE  A,#24H,HOUU    ;计时单元数据与24比较
            HOUU:  JC    SET6           ;小于24转SET6循环
                   LCALL CLR0           ;大于或等于24时清0操作
                   AJMP  SET6           ;跳转到SET6循环
           SETOUT: JNB   P3.5,SETOUT1   ;调时退出程序。等待键释放
                   LCALL DISPLAY        ;延时削抖
                   JNB   P3.5,SETOUT    ;是抖动,返回SETOUT再等待
                   CLR   01H            ;清调小时标志
                   CLR   00H            ;清调分标志
                   CLR   02H            ;清闪烁标志
                   CLR   TR1            ;关闭定时器T1
                   CLR   ET1            ;关定时器T1中断
                   SETB  TR0            ;开启定时器T0
                   SETB  ET0            ;开定时器T0中断(计时开始)
                   LJMP  START1         ;跳回主程序
            SET1:  LCALL DISPLAY        ;键释放等待时调用显示程序(调分)
                   AJMP  SET2           ;防止键按下时无时钟显示
            SET3:  LCALL DISPLAY        ;等待调分按键时时钟显示用
                   AJMP  SET4
            SET5:  LCALL DISPLAY        ;键释放等待时调用显示程序(调小时)
                   AJMP  SETHH1         ;防止键按下时无时钟显示
            SET7:  LCALL DISPLAY        ;等待调小时按键时时钟显示用
                   AJMP  SET6
         SETOUT1:  LCALL DISPLAY        ;退出时钟调整时键释放等待
                   AJMP  SETOUT         ;防止键按下时无时钟显示
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;           显示程序                  ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 显示数据在70H-75H单元内,用六位LED共阳数码管显示,P1口输出段码数据,P3口作
; 扫描控制,每个LED数码管亮1MS时间再逐位循环。
          DISPLAY: MOV   R1,#70H        ;指向显示数据首址
                   MOV   R5,#0FEH       ;扫描控制字初值
             PLAY: MOV   A,R5           ;扫描字放入A
                   MOV   P2,A           ;从P3口输出
                   MOV   A,@R1          ;取显示数据到A
                   MOV   DPTR,#TAB      ;取段码表地址
                   MOVC  A,@A+DPTR      ;查显示数据对应段码
                   MOV   P0,A           ;段码放入P1口
                   LCALL DL1MS          ;显示1MS
                   INC   R1             ;指向下一地址
                   MOV   A,R5           ;扫描控制字放入A
                   JNB   ACC.5,ENDOUT   ;ACC.5=0时一次显示结束
                   RL    A              ;A中数据循环左移
                   MOV   R5,A           ;放回R5内
                   AJMP  PLAY           ;跳回PLAY循环
           ENDOUT: SETB  P2.5           ;一次显示结束,P3口复位
                   MOV   P0,#0FFH       ;P1口复位
                   RET                  ;子程序返回
             TAB:  DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
;共阳段码表            "0""  1""  2" " 3" "4" "5" "6"  "7" "8" "9""不亮"
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;           延时程序                  ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;1MS延时程序,LED显示程序用
            DL1MS: MOV  R6,#14H
            DL1:   MOV  R7,#19H
            DL2:   DJNZ  R7,DL2
                   DJNZ  R6,DL1
                   RET
;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象
           DS20MS: ACALL   DISPLAY
                   ACALL  DISPLAY
                   ACALL  DISPLAY
                   RET
;延时程序,用作按键时间的长短判断
           DL1S:   LCALL      DL05S
                   LCALL      DL05S
                   RET
          DL05S:   MOV        R3,#20H      ;8毫秒*32=0.196秒
          DL05S1:  LCALL      DISPLAY
                   DJNZ       R3,DL05S1
                   RET
                   END                     ;程序结束

系统分类: 单片机   |    用户分类: 无分类    |    来源: 无分类

评论(1) | 阅读(1955)
发表于:2007-12-22 13:01:53
标签:无标签

2

寻师傅一名,单片机行业

      本人因学习单片机,爱好至深,学过汇编程序,单片机原理及应用,接口技术,现在主攻单片机原理及应用,自学数模电路,嵌入式开发,现在正执毕业之迹,但现在非常迷茫,不知从何学起,现寻师傅一名,单片机行业,了解单片机项目开发(如嵌入式开发)或有过工作经验,有意者请加为好友,或加QQ13775989. 希望能够经常联系,常交流,谢谢. 

 

 

                                                                                                         小祝

系统分类: 单片机   |    用户分类: 无分类    |    来源: 无分类

评论(1) | 阅读(842)
发表于:2007-12-19 17:04:17
标签:无标签

1

51单片机汇编程序集

1、片内RAM初始化子程序
2、片外RAM初始化子程序
3、片外RAM初始化子程序(双字节个单元)
4、内部RAM数据复制程序
5、外部RAM数据复制程序
6、外部RAM数据复制程序
7、外部RAM数据复制到内部RAM程序
8、限幅滤波程序
9、中位值滤波程序
10、N点算术平均滤波
11、N点加权平均滤波
12、一阶加权滞后滤波程序
13、双字节取补程序
14、N节取补程序
15、双字节无符号数加法程序
16、N字节无符号数加法程序
17、双字节无符号数减法程序
18、N字节无符号数减法程序
19、单字节无符号数乘法程序
20、单字节无符号数乘法程序
21、单字节无符号数乘法程序
22、双字节无符号数乘法程序
23、双字节无符号数乘法程序
24、N字节无符号数乘法程序
25、单字节无符号除法程序
26、单字节无符号除法程序
27、双字节无符号除法程序
28、N字节无符号除法程序(组合)
29、N字节无符号除法程序
30、N字节数据左移程序
31、原码有符号双字节减法程序
32、原码有符号双字节加法程序
33、原码有符号双字节乘法程序
34、原码有符号双字节除法程序
35、单字节顺序查找程序
36、单字节顺序查找程序
37、双字节字符串顺序查找程序
38、双字节字符串顺序查找程序
39、N字节字符串顺序查找程序
40、单字节最值查找程序
41、浮点数顺序查找程序

42、浮点数最值查找程序
43、单字节折半查找程序

;片内RAM初始化子程序
IBCLR    :MOV    A,R0
          MOV    R1,A
          CLR    A
IBC1     :MOV    @R1,A
          INC    R1
          DJNZ   R7,IBC1
          RET
;片外RAM初始化子程序
EBCLR1   :MOV    A,ADDPL
          MOV    DPL,A
          MOV    A,ADDPH
          MOV    DPH,A
          CLR    C
EBC11    :MOVX   @DPTR,A
          INC    DPTR
          DJNZ   R7,EBC11
          RET
;片外RAM初始化子程序(双字节个单元)
EBCLR2   :MOV    A,ADDPL
          MOV    DPL,A
          MOV    A,ADDPH
          MOV    DPH,A
          MOV    A,R7
          JZ     EBC21
          INC    R6
EBC21    :CLR    A
          MOVX   @DPTR,A
          INC    DPTR
          DJNZ   R7,EBC21
          DJNZ   R6,EBC21
          RET

;内部RAM数据复制程序
;入口    :R0,R7
;占用资源:A
;堆栈需求:2字节
;出口    :R1
IBMOV    :MOV    A,R0
          ADD    A,R7
          MOV    R0,A
          MOV    A,R1
          ADD    A,R7
          MOV    R1,A
IBM1     :DEC    R0
          DEC    R1
          MOV    A,@R0
          MOV    @R1,A
          DJNZ   R7,IBM1
          RET
;外部RAM数据复制程序
;入口    :ADDPH,ADDPL,R7
;占用资源:ACC
;堆栈需求:2字节
;出口    :R0,R1
EBMOV1   :MOV    A,ADDPL
          ADD    A,R7
          MOV    DPL,A
          CLR    A
          ADDC   A,ADDPH
          MOV    DPH,A
          MOV    A,R7
          ADD    A,R1
          XCH    A,R0
          ADDC   A,#00H
          MOV    P2,A
EBM11    :DEC    R0
          CJNE   R0,#0FFH,EBM12
          DEC    P2
EBM12    :DEC    DPL
          MOV    A,DPL
          CJNE   A,#0FFH,EBM13
          DEC    DPH
EBM13    :MOVX   A,@R0
          MOVX   @DPTR,A
          DJNZ   R7,EBM11
          RET
;外部RAM数据复制程序
;入口    :ADDPH,ADDPL,R6,R7
;占用资源:ACC
;堆栈需求:2字节
;出口    :R0,R1
EBMOV2   :MOV    A,ADDPL
          ADD    A,R7
          MOV    DPL,A
          MOV    A,R6
          ADDC   A,ADDPH
          MOV    DPH,A
          MOV    A,R7
          ADD    A,R1
          XCH    A,R0
          ADDC   A,R6
          MOV    P2,A
          MOV    A,R7
          JZ     EBM21
          INC    R6
EBM21    :DEC    R0
          CJNE   R0,#0FFH,EBM22
          DEC    P2
EBM22    :DEC    DPL
          MOV    A,DPL
          CJNE   A,#0FFH,EBM23
          DEC    DPH
EBM23    :MOVX   A,@R0
          MOVX   @DPTR,A
          DJNZ   R7,EBM21
          DJNZ   R6,EBM21
          RET
;外部RAM数据复制到内部RAM程序
;入口    :ADDPH,ADDPL,R7
;占用资源:ACC
;堆栈需求:2字节
;出口    :R0
ITEMOV  :MOV    A,ADDPL
         ADD    A,R7
         MOV    DPL,A
         MOV    A,ADDPH
         ADDC   A,#00H
         MOV    DPH,A
         MOV    A,R0
         ADD    A,R7
         MOV    R0,A
ITEM1   :DEC    R0
         DEC    DPL
         MOV    A,DPL
         CJNE   A,#0FFH,ITEM2
         DEC    DPH
ITEM2   :MOVX   A,@DPTR
         MOV    @R0,A
         DJNZ   R7,ITEM1
         RET
 
;限幅滤波程序
;入口    :A,SDAT,DELTY
;占用资源:B
;堆栈需求:2字节
;出口    :A
JUGFILT  :MOV    B,A
          CLR    C
          SUBB   A,SDAT
          JNC    JUGFT1
          CPL    A
          INC    A
JUGFT1   :SETB   A
          SUBB   A,#DELTY
          JNC    JUGFT3
          MOV    A,SDAT
          RET
JUGFT3   :MOV    A,B
          MOV    SDAT,A   
          RET
;中位值滤波程序
;入口    :ADDPH,ADDPL,N
;占用资源:ESELSORT
;堆栈需求:4字节
;出口    :A
MEDFILT  :LCALL  ESELSORT
          MOV    A,N
          CLR    C
          RRC    A
          ADD    A,ADDPL
          MOV    DPL,A
          MOV    A,ADDPH
          MOV    DPH,A
          JNC    MEDFT1
          INC    DPH
MEDFT1   :MOVX   A,@DPTR
          RET
;N点算术平均滤波
;入口    :ADDPH,ADDPL,N
;占用资源:B,R3,R4
;堆栈需求:2字节
;出口    :A
AVFILT   :MOV    A,ADDPL
          MOV    DPL,A
          MOV    A,ADDPH
          MOV    DPH,A
          CLR    A
          MOV    R3,A
          MOV    R4,A
          MOV    R7,N
AVFT1    :MOVX   A,@DPTR
          INC    DPTR
          ADD    A,R4
          MOV    R4,A
          JNC    AVFT2
          INC    R3
AVFT2    :DJNZ   R7,AVFT1
          MOV    R7,N
          MOV    R2,#00H
          LCALL  NDIV31
          MOV    A,R4
          RET
;N点加权平均滤波
;入口    :ADDPH,ADDPL,N
;占用资源:B,R3,R4
;堆栈需求:2字节
;出口    :A
QAVFILT  :CLR    A
          MOV    R3,A
          MOV    R4,A
          MOV    R7,N
          MOV    P2,ADDPH
          MOV    R1,ADDPL
          MOV    DPTR,#QAVTAB
QAVFT1   :MOVC   A,@A+DPTR
          MOV    B,A
          MOVX   A,@R1
          INC    DPTR
          INC    R1
          MUL    AB
          ADD    A,R4
          MOV    R4,A
          MOV    A,B
          ADDC   A,R3
          MOV    R3,A
          DJNZ   R7,QAVFT1
          MOV    A,R4
          JNB    ACC.7,QAVFT2
          INC    R3
QAVFT2   :MOV    A,R3
          RET
QAVTAB   :DB
;一阶加权滞后滤波程序
;入口    :A,DELTY
;占用资源:B,R3,R4
;堆栈需求:2字节
;出口    :A
BQFILT   :MOV    B,A
          CLR    A
          MOV    DPTR,#ABTAB
          MOVC   A,@A+DPTR
          MUL    AB
          MOV    R4,A
          MOV    R3,B
          MOV    A,#01H
          MOVC   A,@A+DPTR
          MOV    B,DELTY
          MUL    AB
          ADD    A,R4
          MOV    R4,A
          MOV    A,B
          ADDC   A,R3
          MOV    R3,A
          MOV    A,R4
          JNB    ACC.7,FT1
          INC    R3
FT1      :MOV    A,R3
          MOV    DELTY,A
          RET
BQTAB    :DB     80H,80H
 
;双字节取补程序 /(R3R4)=(R3R4)
;入口    :R3,R4
;占用资源:ACC
;堆栈需求:2字节
;出口    :R3,R4
CMPT     :MOV    A,R4
          CPL    A
          ADD    A,#01H
          MOV    R4,A
          MOV    A,R3
          CPL    A
          ADDC   A,#00H
          MOV    R3,A
          RET
;N节取补程序 /([R0])=([R0])
;入口    :R0,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口    :R0
NCMPTN   :MOV    B,R0
          SETB   C
NCPT1    :MOV    A,@R0
          CPL    A
          ADDC   A,#00H
          MOV    @R0,A
          INC    R0
          DJNZ   R7,NCPT1
          MOV    R0,B
          RET
;双字节无符号数加法程序 (R3R4+R6R7)=(R3R4)
;入口    :R3,R4,R6,R7
;占用资源:ACC
;堆栈需求:2字节
;出口    :R3,R4,CF
NADD     :MOV    A,R4
          ADD    A,R7
          MOV    R4,A
          MOV    A,R3
          ADDC   A,R6
          MOV    R3,A
          RET

;N字节无符号数加法程序 ([R0]+[R1])=([R0])
;入口    :R0,R1,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口    :R0,CF
NADDN    :MOV    B,R0
          CLR    C
NADN1    :MOV    A,@R0
          ADDC   A,@R1
          MOV    @R0,A
          INC    R0
          INC    R1
          DJNZ   R7,NADN1
          MOV    R0,B
          RET
;双字节无符号数减法程序 (R3R4-R6R7)=(R3R4)
;入口    :R3,R4,R6,R7
;占用资源:ACC
;堆栈需求:2字节
;出口    :R3,R4
NSUB     :MOV    A,R4
          CLR    C
          SUBB   A,R7
          MOV    R4,A
          MOV    A,R3
          SUBB   A,R6
          MOV    R3,A
          RET
;N字节无符号数减法程序 ([R0]-[R1])=([R0])
;入口    :R0,R1,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口    :R0,CF
NSUBN    :MOV    B,R0
          MOV    R7,N
          CLR    C
NSUBN1   :MOV    A,@R0
          SUBB   A,@R1
          MOV    @R0,A
          INC    R0
          INC    R1
          DJNZ   R7,NSUBN1
          MOV    R0,B
          RET
;单字节无符号数乘法程序 (R3R4*R7)=(R2R3R4)
;入口    :R3,R4,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口    :R2,R3,R4
NMUL21   :MOV    A,R4
          MOV    B,R7
          MUL    AB
          MOV    R4,A
          MOV    A,B
          XCH    A,R3
          MOV    B,R7
          MUL    AB
          ADD    A,R3
          MOV    R3,A
          CLR    A
          ADDC   A,B
          MOV    R2,A
          CLR    OV
          RET
;单字节无符号数乘法程序 (R2R3R4*R7)=(R5R2R3R4)
;入口    :R2,R3,R4,R6,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口    :R5,R2,R3,R4
NMUL31   :MOV    A,R4
          MOV    B,R7
          MUL    AB
          MOV    R4,A
          MOV    A,B
          XCH    A,R3
          MOV    B,R7
          MUL    AB
          ADD    A,R3
          MOV    R3,A
          CLR    A
          ADDC   A,B
          XCH    A,R2
          MOV    B,R7
          MUL    AB
          ADD    A,R2
          MOV    R2,A
          CLR    A
          ADDC   A,B
          MOV    R5,A
          CLR    OV
          RET
;单字节无符号数乘法程序 (R5R2R3R4*R7)=(R7R5R2R3R4)
;入口    :R5,R2,R3,R4,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口    :R7,R5,R2,R3,R4
NMUL41   :MOV    A,R4
          MOV    B,R7
          MUL    AB
          MOV    R4,A
          MOV    A,B
          XCH    A,R3
          MOV    B,R7
          MUL    AB
          ADD    A,R3
          MOV    R3,A
          CLR    A
          ADDC   A,B
          XCH    A,R2
          MOV    B,R7
          MUL    AB
          ADD    A,R2
          MOV    R2,A
          CLR    A
          ADDC   A,B
          XCH    A,R5
          MOV    B,R7
          MUL    AB
          ADD    A,R5
          MOV    R5,A
          CLR    A
          ADDC   A,B
          MOV    R7,A
          CLR    OV
          RET
;双字节无符号数乘法程序 (R3R4*R6R7)=(R5R2R3R4)
;入口    :R3,R4,R6,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口    :R5,R2,R3,R4
NMUL22   :MOV    A,R4
          MOV    B,R7
          MUL    AB
          XCH    A,R4
          MOV    R5,B
          MOV    B,R6
          MUL    AB
          ADD    A,R5
          MOV    R5,A
          CLR    A
          ADDC   A,B
          MOV    R2,A
          MOV    A,R3
          MOV    B,R7
          MUL    AB
          ADD    A,R5
          MOV    R5,A
          MOV    A,B
          ADDC   A,R2
          MOV    R2,A
          CLR    A
          ADDC   A,#00H
          XCH    A,R3
          MOV    B,R6
          MUL    AB
          ADD    A,R2
          MOV    R2,A
          MOV    A,B
          ADDC   A,R3
          XCH    A,R5
          MOV    R3,A
          CLR    OV
          RET
;双字节无符号数乘法程序 (R2R3R4*R6R7)=(R1R5R2R3R4)
;入口    :R2,R3,R4,R6,R7
;占用资源:ACC,B
;堆栈需求:2字节
;出口    :R1,R5,R2,R3,R4
NMUL32   :MOV    A,R4
          MOV    B,R7
          MUL    AB
          XCH    A,R4
          MOV    R5,B
          MOV    B,R6
          MUL    AB
          ADD    A,R5
          MOV    R5,A
          CLR    A
          ADDC   A,B
          MOV    R1,A
          MOV    A,R3
          MOV    B,R7
          MUL    AB
          ADD    A,R5
          MOV    R5,A
          MOV    A,B
          ADDC   A,R1
          MOV    R1,A
          CLR    A
          ADDC   A,#00H
          XCH    A,R3
          MOV    B,R6
          MUL    AB
          ADD    A,R1
          MOV    R1,A
          MOV    A,B
          ADDC   A,R3
          XCH    A,R5
          MOV    R3,A
          MOV    A,R2
          MOV    B,R7
          MUL    AB
          ADD    A,R1
          MOV    R1,A
          MOV    A,B
          ADDC   A,R5
          MOV    R5,A
          CLR    A
          ADDC   A,#00H
          XCH    A,R2
          MOV    B,R6
          MUL    AB
          ADD    A,R5
          MOV    R5,A
          MOV    A,B
          ADDC   A,R2
          XCH    A,R1
          MOV    R2,A
          CLR    OV
          RET
;N字节无符号数乘法程序 ([R0]*[R1])=([R0])
;入口    :R0,R1,M,N
;占用资源:ACC,B,R2,R5,R6,R7,NCNT
;堆栈需求:2字节
;出口    :R0
NMULMN   :MOV    A,M
          ADD    A,R0
          MOV    R5,A
          XCH    A,R1
          XCH    A,R5
          ADD    A,N
          XCH    A,R0
          MOV    R6,A
          MOV    B,M