⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spline.lis

📁 ssd1325控制器液晶的驱动程序
💻 LIS
📖 第 1 页 / 共 5 页
字号:
                        .module spline.c
                        .area text(rom, con, rel)
 0000                   .dbfile G:\IccPro\mega128_lcd\ZLG_GUI\spline.c
 0000                   .dbfunc e max _max fI
 0000           ;              b -> R18,R19
 0000           ;              a -> R16,R17
                        .even
 0000           _max::
 0000                   .dbline -1
 0000                   .dbline 19
 0000           ; /****************************************************************************************
 0000           ; * 文件名:SPLINE.C
 0000           ; * 功能:二次参数样条曲线生成程序。
 0000           ; * 作者:黄绍斌
 0000           ; * 日期:2003.09.09
 0000           ; ****************************************************************************************/
 0000           ; #include  "config.h"
 0000           ; #include  "math.h"
 0000           ; 
 0000           ; 
 0000           ; /****************************************************************************
 0000           ; * 名称:max()
 0000           ; * 功能:求两个整数中最大的整数值。
 0000           ; * 入口参数:a                 整数1
 0000           ; *          b          整数2
 0000           ; * 出口参数:返回最大的整数值
 0000           ; ****************************************************************************/
 0000           ; int  max(int a, int b)
 0000           ; {  if(a>b) return(a);
 0000                   .dbline 19
 0000 2017              cp R18,R16
 0002 3107              cpc R19,R17
 0004 0CF4              brge L8
 0006                   .dbline 19
 0006 01C0              xjmp L7
 0008           L8:
 0008                   .dbline 20
 0008           ;      else  return(b);
 0008 8901              movw R16,R18
 000A                   .dbline -2
 000A           L7:
 000A                   .dbline 0 ; func end
 000A 0895              ret
 000C                   .dbsym r b 18 I
 000C                   .dbsym r a 16 I
 000C                   .dbend
 000C                   .dbfunc e abs _abs fI
 000C           ;              a -> R16,R17
                        .even
 000C           _abs::
 000C                   .dbline -1
 000C                   .dbline 30
 000C           ; }
 000C           ; 
 000C           ; /****************************************************************************
 000C           ; * 名称:abs()
 000C           ; * 功能:求一个整数的绝对值。
 000C           ; * 入口参数:a                 取绝对值的数据
 000C           ; * 出口参数:返回a的绝对值
 000C           ; ****************************************************************************/
 000C           ; int  abs(int a)
 000C           ; {  if(a>0) return(a);
 000C                   .dbline 30
 000C 2224              clr R2
 000E 3324              clr R3
 0010 2016              cp R2,R16
 0012 3106              cpc R3,R17
 0014 0CF4              brge L11
 0016                   .dbline 30
 0016 04C0              xjmp L10
 0018           L11:
 0018                   .dbline 31
 0018           ;      else  return(-a);
 0018 0095              com R16
 001A 1095              com R17
 001C 0F5F              subi R16,0xFF
 001E 1F4F              sbci R17,0xFF
 0020                   .dbline -2
 0020           L10:
 0020                   .dbline 0 ; func end
 0020 0895              ret
 0022                   .dbsym r a 16 I
 0022                   .dbend
 0022                   .dbfunc e CURVE_SetCurve _CURVE_SetCurve fV
 0022           ;             cy -> y+22
 0022           ;             cx -> y+18
 0022           ;             by -> y+14
 0022           ;             bx -> y+10
 0022           ;             ay -> y+6
 0022           ;             ax -> y+2
 0022           ;             cl -> R20,R21
                        .even
 0022           _CURVE_SetCurve::
 0022 3A93              st -y,r19
 0024 2A93              st -y,r18
 0026 0E940000          xcall push_gset1
 002A A801              movw R20,R16
 002C                   .dbline -1
 002C                   .dbline 63
 002C           ; }
 002C           ; 
 002C           ; 
 002C           ; 
 002C           ; /* 曲线类变量及相关函数 */
 002C           ; typedef  struct
 002C           ; {  float      Ax, Ay;                 // 定义A、B、C点坐标变量
 002C           ;    float      Bx, By;
 002C           ;    float      Cx, Cy;
 002C           ;    
 002C           ;    int        Ndiv;                   // 定义曲线平滑参数变量     
 002C           ; } CURVE;  
 002C           ; 
 002C           ; #define  DIV_FACTOR           8.0                             /* 平滑控制参数 */
 002C           ; /****************************************************************************
 002C           ; * 名称:CURVE_SetCurve()
 002C           ; * 功能:设置三点曲线参数。
 002C           ; * 入口参数:  cl              要操作的曲线对象,CURVE结构
 002C           ; *           ax                a点x坐标值
 002C           ; *           ay                a点y坐标值
 002C           ; *                     bx              b点x坐标值
 002C           ; *           by                b点y坐标值
 002C           ; *                     cx              c点x坐标值
 002C           ; *           cy                c点y坐标值
 002C           ; * 出口参数:无
 002C           ; * 说明:
 002C           ; ****************************************************************************/
 002C           ; void  CURVE_SetCurve(CURVE *cl,
 002C           ;                      float ax, float ay, 
 002C           ;                                float bx, float by,
 002C           ;                                float cx, float cy) 
 002C           ; {  cl->Ax = ax;
 002C                   .dbline 63
 002C FE01              movw R30,R28
 002E 2280              ldd R2,z+2
 0030 3380              ldd R3,z+3
 0032 4480              ldd R4,z+4
 0034 5580              ldd R5,z+5
 0036 FA01              movw R30,R20
 0038 2082              std z+0,R2
 003A 3182              std z+1,R3
 003C 4282              std z+2,R4
 003E 5382              std z+3,R5
 0040                   .dbline 64
 0040           ;    cl->Ay = ay;
 0040 FE01              movw R30,R28
 0042 2680              ldd R2,z+6
 0044 3780              ldd R3,z+7
 0046 4084              ldd R4,z+8
 0048 5184              ldd R5,z+9
 004A FA01              movw R30,R20
 004C 2482              std z+4,R2
 004E 3582              std z+5,R3
 0050 4682              std z+6,R4
 0052 5782              std z+7,R5
 0054                   .dbline 65
 0054           ;    cl->Bx = bx; 
 0054 FE01              movw R30,R28
 0056 2284              ldd R2,z+10
 0058 3384              ldd R3,z+11
 005A 4484              ldd R4,z+12
 005C 5584              ldd R5,z+13
 005E FA01              movw R30,R20
 0060 2086              std z+8,R2
 0062 3186              std z+9,R3
 0064 4286              std z+10,R4
 0066 5386              std z+11,R5
 0068                   .dbline 66
 0068           ;    cl->By = by;
 0068 FE01              movw R30,R28
 006A 2684              ldd R2,z+14
 006C 3784              ldd R3,z+15
 006E 4088              ldd R4,z+16
 0070 5188              ldd R5,z+17
 0072 FA01              movw R30,R20
 0074 2486              std z+12,R2
 0076 3586              std z+13,R3
 0078 4686              std z+14,R4
 007A 5786              std z+15,R5
 007C                   .dbline 67
 007C           ;    cl->Cx = cx; 
 007C FE01              movw R30,R28
 007E 2288              ldd R2,z+18
 0080 3388              ldd R3,z+19
 0082 4488              ldd R4,z+20
 0084 5588              ldd R5,z+21
 0086 FA01              movw R30,R20
 0088 208A              std z+16,R2
 008A 318A              std z+17,R3
 008C 428A              std z+18,R4
 008E 538A              std z+19,R5
 0090                   .dbline 68
 0090           ;    cl->Cy = cy;
 0090 FE01              movw R30,R28
 0092 2688              ldd R2,z+22
 0094 3788              ldd R3,z+23
 0096 408C              ldd R4,z+24
 0098 518C              ldd R5,z+25
 009A FA01              movw R30,R20
 009C 248A              std z+20,R2
 009E 358A              std z+21,R3
 00A0 468A              std z+22,R4
 00A2 578A              std z+23,R5
 00A4                   .dbline 70
 00A4           ;    
 00A4           ;    cl->Ndiv = (int)(max( abs((int)ax), abs((int)ay) ) / DIV_FACTOR);
 00A4 FE01              movw R30,R28
 00A6 0281              ldd R16,z+2
 00A8 1381              ldd R17,z+3
 00AA 2481              ldd R18,z+4
 00AC 3581              ldd R19,z+5
 00AE 0E940000          xcall fp2int
 00B2 ACDF              xcall _abs
 00B4 1801              movw R2,R16
 00B6 FE01              movw R30,R28
 00B8 0681              ldd R16,z+6
 00BA 1781              ldd R17,z+7
 00BC 2085              ldd R18,z+8
 00BE 3185              ldd R19,z+9
 00C0 0E940000          xcall fp2int
 00C4 2F92              push R2
 00C6 3F92              push R3
 00C8 A1DF              xcall _abs
 00CA 3F90              pop R3
 00CC 2F90              pop R2
 00CE 9801              movw R18,R16
 00D0 8101              movw R16,R2
 00D2 96DF              xcall _max
 00D4 0E940000          xcall int2fp
 00D8 3A93              st -y,R19
 00DA 2A93              st -y,R18
 00DC 1A93              st -y,R17
 00DE 0A93              st -y,R16
 00E0 00E0              ldi R16,<L15
 00E2 10E0              ldi R17,>L15
 00E4 0E940000          xcall lpm32
 00E8 3A93              st -y,R19
 00EA 2A93              st -y,R18
 00EC 1A93              st -y,R17
 00EE 0A93              st -y,R16
 00F0 0E940000          xcall div32f
 00F4 0E940000          xcall fp2int
 00F8 FA01              movw R30,R20
 00FA 118F              std z+25,R17
 00FC 008F              std z+24,R16
 00FE                   .dbline -2
 00FE           L14:
 00FE 0E940000          xcall pop_gset1
 0102 2296              adiw R28,2
 0104                   .dbline 0 ; func end
 0104 0895              ret
 0106                   .dbsym l cy 22 D
 0106                   .dbsym l cx 18 D
 0106                   .dbsym l by 14 D
 0106                   .dbsym l bx 10 D
 0106                   .dbsym l ay 6 D
 0106                   .dbsym l ax 2 D
 0106                   .dbsym r cl 20 pX
 0106                   .dbend
 0106                   .dbfunc e CURVE_GetCount _CURVE_GetCount fI
 0106           ;             cl -> R16,R17
                        .even
 0106           _CURVE_GetCount::
 0106                   .dbline -1
 0106                   .dbline 82
 0106           ; }
 0106           ; 
 0106           ; 
 0106           ; /****************************************************************************
 0106           ; * 名称:CURVE_GetCount()
 0106           ; * 功能:取出平滑参数Ndiv+1的值。
 0106           ; * 入口参数:cl                要操作的曲线对象,CURVE结构
 0106           ; * 出口参数:返回Ndiv+1的值
 0106           ; * 说明:若Ndiv为0,则先设置其为1。
 0106           ; ****************************************************************************/
 0106           ; int  CURVE_GetCount(CURVE *cl)
 0106           ; {  if(0 == cl->Ndiv) cl->Ndiv=1;
 0106                   .dbline 82
 0106 F801              movw R30,R16
 0108 208C              ldd R2,z+24
 010A 318C              ldd R3,z+25
 010C 2220              tst R2
 010E 39F4              brne L17
 0110 3320              tst R3
 0112 29F4              brne L17
 0114           X0:
 0114                   .dbline 82
 0114 81E0              ldi R24,1
 0116 90E0              ldi R25,0
 0118 F801              movw R30,R16
 011A 918F              std z+25,R25
 011C 808F              std z+24,R24
 011E           L17:
 011E                   .dbline 84
 011E           ; 
 011E           ;    return(cl->Ndiv+1);
 011E F801              movw R30,R16
 0120 008D              ldd R16,z+24
 0122 118D              ldd R17,z+25
 0124 0F5F              subi R16,255  ; offset = 1
 0126 1F4F              sbci R17,255
 0128                   .dbline -2
 0128           L16:
 0128                   .dbline 0 ; func end
 0128 0895              ret
 012A                   .dbsym r cl 16 pX
 012A                   .dbend
 012A                   .dbfunc e CURVE_GetCurve _CURVE_GetCurve fV
 012A           ;              Y -> R10,R11
 012A           ;              X -> R12,R13
 012A           ;              h -> y+12
 012A           ;              g -> y+8
 012A           ;              f -> y+4
 012A           ;              i -> R14,R15
 012A           ;              t -> y+0
 012A           ;     PointCount -> R20,R21
 012A           ;         points -> R22,R23
 012A           ;              y -> y+34
 012A           ;              x -> y+30
 012A           ;             cl -> R6,R7
                        .even
 012A           _CURVE_GetCurve::
 012A 3A93              st -y,r19
 012C 2A93              st -y,r18
 012E 0E940000          xcall push_gset5
 0132 3801              movw R6,R16
 0134 6497              sbiw R28,20
 0136 6EA1              ldd R22,y+38
 0138 7FA1              ldd R23,y+39
 013A 48A5              ldd R20,y+40
 013C 59A5              ldd R21,y+41
 013E                   .dbline -1
 013E                   .dbline 100
 013E           ; }
 013E           ; 
 013E           ; 
 013E           ; /****************************************************************************
 013E           ; * 名称:CURVE_GetCurve()
 013E           ; * 功能:增加曲线点到points。
 013E           ; * 入口参数:cl                        要操作的曲线对象,CURVE结构
 013E           ; *          x                  新增点的x坐标值

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -