📄 shukong.asm
字号:
[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 + -