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

📄 shukong.asm

📁 数控电流源61控制程序 包含zlg7289的61控制程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
     [P_IOB_Data] = r1;  
     test r4,0x8000;
     jz DIO_0;                     //IOB15为低,制DIO为0
     jmp DIO_1;                    //IOB15为高,制DIO为1
DIO_0:
     r1 = [P_IOB_Data];            //lxp_pin_DIO = 0;
     r1 &= 0xfbff;                 //1&x = x;0&x = 0;    1111111011111111
     [P_IOB_Data] = r1;
     jmp zbt;
DIO_1:
     r1 = [P_IOB_Data];            //lxp_pin_DIO = 1;
     r1 |= 0x0400;                 //0|x = x;1|x = 1;    0000000100000000
     [P_IOB_Data] = r1;
zbt:
     r1 = [P_IOB_Data];         
	 r1 |= 0x0200;
     [P_IOB_Data] = r1;            //lxp_pin_CLK = 1;
     call _lxp_ShortDelay;
     r1 = [P_IOB_Data];         
     r1 &= 0xfdff;
     [P_IOB_Data] = r1;            // lxp_pin_CLK = 0;
     call _lxp_ShortDelay;
     r4 = r4 lsl 1;                //dat<<=1;
     r3 -= 1;
     jnz loop2;
     irq on;
     pop r1,r5 from [sp];
     retf
.endp  
.public _display
_display: .proc
      push r1,r5 to [sp];
      bp = sp + 8;
      r2 = 0;
      r3 = 0;
      r4 = gbw_7;
diploop:
      r1 = 3;
      cmp r3,r1;
      je aaa;
      jmp bbb;
   aaa:
      r2 = 1;
      jmp ccc;
   bbb:
      r2 = 0;
   ccc:
      r1 = [bp];
      push r1 to [sp];
      r1 = r2;
      push r1 to [sp];
      r1 = [r4];
      push r1 to [sp];
      r1 = 0x0000;
      push r1 to [sp];
      call _lxp_Download;
      pop r1 from [sp];
      pop r1 from [sp];
      pop r1 from [sp];
      pop r1 from [sp];
      bp += 1;
      r4 += 1;
      r3 += 1;
      r1 = 5;
      cmp r3,r1;
      jne diploop;
      pop r1,r5 from [sp];      
      retf
.endp 
//函数:_lxp_ShortDelay()
//功能:短延时
//说明:延时(lxp_Delay_t*2+2)个机器周期
.public _lxp_ShortDelay
_lxp_ShortDelay: .proc
      push r1 to [sp];
      r1 = [lxp_Delay_t];            
loop:
      r1 -= 1; 
      jnz loop;
      r1=0x0001;                      
      [P_Watchdog_Clear]=r1;	//清看门狗
      pop r1 from [sp];
      retf
.endp
//函数:_lxp_LongDelay()
//功能:长延时
//说明:延时(lxp_Delay_t*2*6+8)个机器周期
.public _lxp_LongDelay
_lxp_LongDelay: .proc
      push r1,r2 to [sp];
      r1 = [lxp_Delay_t];
      r2 = r1;                     
      r1 = r1 lsl 2;               //
      r1 += r2;                    //r1 *= 6;
      r1 += r2;                    //
loop1:
       r2=0x0001;                   //清看门狗
      [P_Watchdog_Clear]=r2;	
      r1 -= 1;
      jnz loop1;
      pop r1,r2 from [sp];
     retf
.endp
//函数:_lxp_SPI_Write()
//功能:向SPI 总线写入1 个字节的数据
//参数:dat:要写入的数据
.public _lxp_SPI_Write
_lxp_SPI_Write: .proc
     push r1,r5 to [sp];
     irq off;
     r1 = [P_IOB_Dir];
     r1 |= 0x0007;
     r1 &= 0xfff7;
     [P_IOB_Dir] = r1;
     [P_IOB_Attrib] = r1;
     bp = sp + 8;                  //bp指向参数
     r4 = [bp];                    //参数放入r1
     r3 = 8;                       //向SPI 总线写入八位数二进制数
loopx:
     test r4,0x80;
     jz DIO_0_1;                     //IOB7为低,制DIO为0
     jmp DIO_1_1;                    //IOB7为高,制DIO为1
DIO_0_1:
     r1 = [P_IOB_Data];            //lxp_pin_DIO = 0;
     r1 &= 0xfffb;                 //1&x = x;0&x = 0;    1111111111111011
     [P_IOB_Data] = r1;
     jmp zbt_1;
DIO_1_1:
     r1 = [P_IOB_Data];            //lxp_pin_DIO = 1;
     r1 |= 0x0004;                 //0|x = x;1|x = 1;    0000000000000100
     [P_IOB_Data] = r1;
zbt_1:
     r4 = r4 lsl 1;                //dat<<=1;
     r1 = [P_IOB_Data];         
	 r1 |= 0x0002;
     [P_IOB_Data] = r1;            //lxp_pin_CLK = 1;
     call _lxp_ShortDelay;
     r1 = [P_IOB_Data];         
     r1 &= 0xfffd;
     [P_IOB_Data] = r1;            // lxp_pin_CLK = 0;
     call _lxp_ShortDelay;
    r3 -= 1;
     jnz loopx;
     irq on;
     pop r1,r5 from [sp];
     retf
     .endp
//函数:_lxp_SPI_Read()
//功能:从SPI 总线读取1 个字节的数据
//返回:读取到的数据
.public _lxp_SPI_Read
_lxp_SPI_Read: .proc
     push r1,r5 to [sp];
     r1 = [P_IOB_Dir];
     r1 |= 0x0003;
     r1 &= 0xfff3;
     [P_IOB_Dir] = r1;
     [P_IOB_Attrib] = r1;
     r4 = 0;                       //初始化读取数据为零
     r1 = [P_IOB_Data];            //读取数据之前DIO 引脚要置1 以切换到输入状态       
     r1 |= 0x0004;
     [P_IOB_Data] = r1;            //lxp_pin_DIO = 1;
     r3 = 8;
loop3:
     r1 = [P_IOB_Data];
     r1 |= 0x0002;
     [P_IOB_Data] = r1;           // lxp_pin_CLK = 1;
     call _lxp_ShortDelay;
     r4 = r4 lsl 1;               //数据左移
     r1 = [P_IOB_Data];           //读数据lxp_pin_DIO
     r2 = 0x0004;
     test r1,r2
     jz DIO_01;                    //lxp_pin_DIO为零
     r4 += 1;                     //否则lxp_pin_DIO为1,将数据最低位置1
DIO_01:
     r1 = [P_IOB_Data];
     r1 &= 0xfffd;
     [P_IOB_Data] = r1            //lxp_pin_CLK = 0
     call _lxp_ShortDelay;
     r3 -= 1;
     jnz loop3;
     [Key] = r4;
     pop r1,r5 from [sp];
      retf;
     .endp
//函数:_lxp_cmd()
//功能:执行ZLG7289 纯指令
//参数:cmd:命令字
.public _lxp_cmd
_lxp_cmd: .proc
     push r1,r5 to [sp];
     bp = sp + 8;
     r4 = [bp];
     r1 = [P_IOB_Data];
     r1 &= 0xfffe;
     [P_IOB_Data] = r1;           //lxp_pin_CS = 0;
     call _lxp_LongDelay;
     push r4 to [sp];
     call _lxp_SPI_Write;         //将纯指令写入ZLG7289
     pop r4 from [sp];
     r1 = [P_IOB_Data];
     r1 |= 0x0001;
     [P_IOB_Data] = r1;           //lxp_pin_CS = 1;
     call _lxp_LongDelay;
     pop r1,r5 from [sp];
     retf
     .endp
//函数:_lxp_cmd_dat()
//功能:执行ZLG7289 带数据指令
//参数:cmd:命令字;dat:数据
.public _lxp_cmd_dat
_lxp_cmd_dat: .proc
     push r1,r5 to [sp];
     irq off;
     bp = sp + 8;
     r1 = [P_IOB_Data];
     r1 &= 0xfffe;
     [P_IOB_Data] = r1;           //lxp_pin_CS = 0;
     call _lxp_LongDelay;
     r1 = [bp];
     push r1 to [sp];
     call _lxp_SPI_Write;
     pop r1 from [sp];
     call _lxp_LongDelay;
     r1 = [bp+1];
     push r1 to [sp];
     call _lxp_SPI_Write;
     pop r1 from [sp];
     r1 = [P_IOB_Data];
     r1 |= 0x0001;
     [P_IOB_Data] = r1;           //lxp_pin_CS = 1;
     call _lxp_LongDelay;
     irq on;
     pop r1,r5 from [sp];
     retf
     .endp
//函数:lxp_Download()
//功能:下载数据
//参数:mod=0:下载数据且按方式0 译码
//      mod=1:下载数据且按方式1 译码
//      mod=2:下载数据但不译码
//      x:数码管编号(横坐标),取值0~7
//      dp=0:小数点不亮; dp=1:小数点亮
//      dat:要显示的数据
//说明:译码方式的具体含义请参考数据手册
.public _lxp_Download
_lxp_Download: .proc
     push r1,r5 to [sp];
     bp = sp + 8;
     r1 = [bp];
     r2 = 0x0002;
     cmp r1,r2;
     ja mod_e;
     jmp mod_c;
mod_e:
     r1 = 0x0002;
mod_c:
     cmp r1,0x0000;
     je mod_0;
     cmp r1,0x0001;
     je mod_1;
     r1= 0x0090;                    //mod=2
     jmp exit;
mod_0:
     r1 = 0x0080;                   //mod=0
     jmp exit;
mod_1:
     r1 = 0x00c8;                   //mod=1
exit:
     r2 = [bp+1];
     r2 &= 0x0007;
     r1 |= r2;
     r4 = [bp+3];
     r4 = r4 & 0x007F;
     r3 = [bp+2];
     jz exit1;
     r4 |= 0x0080;
exit1:
     push r4 to [sp];
     push r1 to [sp];
     call _lxp_cmd_dat;
     pop r1 from [sp];
     pop r4 from [sp];
     pop r1,r5 from [sp];
     retf
     .endp
//功能:执行ZLG7289 键盘命令
//返回:返回读到的按键值:0~63
//      如果返回0xFF 则表示没有键按下
.public _lxp_Key
_lxp_Key: .proc
     push r1,r5 to [sp];
     r1 = [P_IOB_Data];
     r1 &= 0xfffe;
     [P_IOB_Data] = r1;          //lxp_pin_CS = 0;
     call _lxp_LongDelay;
     r1 = 0x0015;
     push r1 to [sp];
     call _lxp_SPI_Write;
     pop r1 from [sp];
     call _lxp_LongDelay;
     call _lxp_SPI_Read;
     r1 = [P_IOB_Data];
     r1 |= 0x0001;
     [P_IOB_Data] = r1;          //lxp_pin_CS = 1;
     call _lxp_LongDelay;
     pop r1,r5 from [sp];
     retf
     .endp
//函数:_lxp_Init()
//功能:ZLG7289 初始化
//参数:t:SPI 总线的延时值设置,取值1-40(超出范围可能导致错误)
//说明:t的取值可以参照以下公式:t >= 5 * f1 / f2,其中f1
//      表示80C51的晶振频率,f2 表示ZLG7289 的晶振频率
.public _lxp_Init
_lxp_Init: .proc
     push r1,r5 to [sp];
     r1 = [P_IOB_Data];
     r1 |= 0x0001;
     [P_IOB_Data] = r1;          //lxp_pin_CS = 1;
     r1 = [P_IOB_Data];
     r1 &= 0xfffd;
     [P_IOB_Data] = r1;          //lxp_pin_CLK = 0;
     r1 = [P_IOB_Data];
     r1 |= 0x0004;
     [P_IOB_Data] = r1;          //lxp_pin_DIO = 1;
     r1 = [P_IOB_Data];
     r1 |= 0x0008;
     [P_IOB_Data] = r1;          //lxp_pin_INT = 1;
     bp = sp + 8;
     r1 = [bp];
     [lxp_Delay_t] = r1;
     pop r1,r5 from [sp];
     retf;
     .endp
//函数:Delay()
//功能:延时0.01~655.36s
//参数:t>0 时,延时(t*0.01)s;t=0 时,延时655.36s
//说明:晶振采用11.0592MHz
.public _Delay
_Delay: .proc
     push r1,r5 to [sp];
     bp = sp + 8;
     r3 = [bp];   
loop5:   
     r4 = 10;
loop6:
     r4 -= 1;
     jnz loop6;
     r1=0x0001;                      //清看门狗
     [P_Watchdog_Clear]=r1;	
     r3 -= 1;
     jnz loop5;
     pop r1,r5 from [sp];
     retf
.endp
.public xieru
   xieru: .proc
   
   push r1,r5 to [sp];
   bp = sp + 8;
   
   r1= [P_IOB_Data]
   r1|=cslsb1
   r1|=csmsb1
   r1|=wr1
   r1|=ldacl
   [P_IOB_Data]=r1 
   
    r1= [P_IOB_Data]
    r1&=cslsb0
    r1|=csmsb1
    r1|=wr1
    r1|=ldacl
    [P_IOB_Data]=r1  
   
   
   call delays  
   
   r1= [P_IOB_Data]
   r1&=cslsb0
   r1|=csmsb1
   r1&=wr0
   r1|=ldacl
   [P_IOB_Data]=r1       
        
   call delays     
  
   r4=[bp];
   r2=r2 lsl 4
   r2=r2 lsl 4
   r1=[P_IOB_Data]  
   r1&=0x00ff
   r1+=r2;
   [P_IOB_Data]=r1;
        
   call delays      
        
   r1= [P_IOB_Data]
   r1&=cslsb0
   r1|=csmsb1
   r1|=wr1
   r1|=ldacl
   [P_IOB_Data]=r1      
        
    call delays   
   
   r1= [P_IOB_Data]
   r1|=cslsb1
   r1|=csmsb1
   r1|=wr1
   r1|=ldacl
   [P_IOB_Data]=r1   
    
    call delays    
   
   r1= [P_IOB_Data]
   r1|=cslsb1
   r1&=csmsb0
   r1|=wr1
   r1|=ldacl
   [P_IOB_Data]=r1 
   

   call delays        
     
   r1= [P_IOB_Data]
   r1|=cslsb1
   r1&=csmsb0
   r1&=wr0
   r1|=ldacl
   [P_IOB_Data]=r1 
                                               
   call delays   
   
   r4&=0x0f00
   r1= [P_IOB_Data]
   r1&=0x00ff
   r1+=r4
   [P_IOB_Data]=r1
   
   call delays  
  
   r1= [P_IOB_Data]
   r1|=cslsb1
   r1&=csmsb0
   r1|=wr1
   r1|=ldacl
   [P_IOB_Data]=r1 
   
   call delays 
   
   r1= [P_IOB_Data]
   r1|=cslsb1
   r1|=csmsb1
   r1|=wr1
   r1|=ldacl
   [P_IOB_Data]=r1
   
   call delays 
   
   r1= [P_IOB_Data]
   r1|=cslsb1
   r1|=csmsb1
   r1|=wr1
   r1&=ladc0
   [P_IOB_Data]=r1
   
   call delays 
   
   r1= [P_IOB_Data]
   r1|=cslsb1
   r1|=csmsb1
   r1|=wr1
   r1|=ldacl
   [P_IOB_Data]=r1
   
   pop r1,r5 from [sp];
     retf
     .endp
     
     
.public delays
 delays:.proc
   push r1,r5 to [sp]
    r1=0x0000
    r3=0x0000
  delay1:
   loop0000:
     r2+=1
     r4=0x0001
     [P_Watchdog_Clear]=r4
     cmp r2,21
     jb loop0000
     r3+=1
     cmp r3,10
     jb delay1
     pop r1,r5 from [sp]
     retf;
   .endp  





.text
     .public _IRQ3
_IRQ3:
     INT OFF;
     push r1 to [sp];
     r1=0x0001;                      //清看门狗
     [P_Watchdog_Clear]=r1;	
     r1 = 0x0200;
     test r1,[P_INT_Ctrl];
     jnz irq3_ext2;
     r1 = 0x0100;
     test r1,[P_INT_Ctrl];
      jnz irq3_ext1
irq3_key:
     goto Exit_INT;
irq3_ext1:
     goto Exit_INT;
irq3_ext2:
     call _lxp_Key;
     r1 = 0x0200;
Exit_INT:
     [P_INT_Clear] = r1
     pop r1 from [sp]
     INT IRQ,FIQ;
     reti;
.end

⌨️ 快捷键说明

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