;五功能外控跳机 ;Model:SR-191 ;2006二月九日改回 ;***************************************** ; 78p153寄存器定义 ;***************************************** R0 == 0X0 ;间接寻址IAR ;****CONT REGISTE************* ; 7 6 5 4 3 2 1 0 ; - INT TS TE PAB PSR2 PSR1 PSR2 ; PSR TCC RATE WDT RATE ; 000 1:2 1:1 ; 001 1:4 1:2 ; 010 1:8 1:4 ; 011 1:16 1:8 ; 100 1:32 1:16 ; 101 1:64 1:32 ; 110 1:128 1:64 ; 111 1:256 1:128 ;--------------------------------- ; PAB 0:TCC 1:WDT ; TE TCC信号边沿选择位。0:由高到低加1。 1:由低到高加1 ; TS TCC信号源 0:内部时钟。 1:外部输入(P62/TCC) ; INT 中断使能标志 0:由DISI或硬件中断屏蔽,1:由ENI/RETL使能中断。 TCC == 0X1 PC == 0X2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; STATUS == 0X3 C == 0 DC == 1 Z == 2 P == 3 ;执行SLEP时置为0 T == 4 ;时间溢出时置为0 GP0 == 5 ; GP1 == 6 ; RST == 7 ;复位类型,由引脚唤醒时置1,其它复位置0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; R4 == 0X4 PORT5 == 0X5 IOC5 == 0X5 PORT6 == 0X6 IOC6 == 0X6 IOCB == 0X0B ;为0将P50,P51,P52, P60,P61,P62下拉 IOCC == 0X0C ;为0将P60,P61,P62, P64,P65,P66,P67漏极开路 IOCD == 0X0D ;为0将P60,P61,P62, P64,P65,P66,P67上拉 ;0: 为允许使能。 1:为禁止 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IOCE == 0X0E ;WDT控制器 WDTE == 7 ;0:禁止,1:允许 EIS == 6 ;0:P60,双向I/O口,1:外部中断管脚。此时IOC6的BIT0置为1(输入) ;为“0”时,/通道被屏蔽。INT为“1”时,可通由P6口读取其状态 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ISR == 0XF ;中断状态寄存器 TCIF == 0 ;TCC溢出时置1,软件清0 ICIF == 1 ;P6口输入变化置1,软件清0 EXIF == 2 ;外部中断,由P60/INT下降沿置1,软件清0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IOCF == 0XF ;中断屏蔽寄存器 TCIE == 1 ;0:为中断禁止。1为中断允许 ICIE == 2 ; EXIE == 3 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;本程序的要点是计算电源频率进行计数实现同步。 ;保证通电后基本同步开工 a_temp == 0x10 ;中断子程序中保存A tcount1 == 0x11 ;节拍计数1 tcount2 == 0x12 ;节拍计数2 tick == 0x13 ;节拍常量值1
chtb == 0x14 ;查表序号值
count2 == 0x15 ;定时计数值 temp == 0x16 ;临时计数器 temp2 == 0x17 code == 0x18 ;输出代码 lamp == 0x19 ;用于闪烁计数 spcode == 0x1a ;代表速度的代码 stflag == 0x1b ;是否进入一拍标志 ifdrim == 0x1c ;是否梦幻 code2 == 0x1d ; tcount3 == 0x1e temp3 == 0x1f
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;开始 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; org 0x0 jmp main ;;;;;;;;;;;;;;;;;;;;;;;; ;中断计数子程序 ;;;;;;;;;;;;;;;;;;;;;;;; org 0x8 intext: mov a_temp,a bc stflag,7 ;这是是否要进入下一态的标志位 clr port5 clr port5 ;中断后先清0。 ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;仅用于指示灯 ;;;;;;;;;;;;;;;;;;;;;;;;;;;; inc lamp ;lamp是指示灯计数寄存器,也可以用别的方法代替 inca spcode ;速度代码0,1,2,3。加1后代入a中 mov temp2,a ;temp2是局部变量,通过加1成为1,2,3,4。后再减1判0的方 djz temp2 ;式来进行指示 jmp speed2 speed1: jbc lamp,3 jmp lampset1 bc port6,1 jmp lampok lampset1: bs port6,1 jmp lampok speed2: djz temp2 jmp speed3 jbc lamp,4 jmp lampset2 bc port6,1 jmp lampok lampset2: bs port6,1 jmp lampok speed3: djz temp2 jmp speed4 jbc lamp,5 jmp lampset3 bc port6,1 jmp lampok lampset3: bs port6,1 jmp lampok speed4: jbc lamp,6 jmp lampset4 bc port6,1 jmp lampok lampset4: bs port6,1 ;port6,1用于指示灯 jmp lampok
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; lampok: call delay100u ;调用廷时子程序越过0点
jbc ifdrim,0 ;是否梦幻,ifdrim判断是否梦幻 jmp intext2 ;有梦幻, ;;;;;;;;;;;;;;;;;;;;;;;;;; ;非梦幻子程序 ;;;;;;;;;;;;;;;;;;;;;;;;;; intext1: mov a,code ;输出代码 mov port5,a djz tcount1 ;tcount1是主计数器 jmp intend mov a,tick ;tick中有一个常量值 mov tcount1,a ;在中断子程序内加载数据 bs stflag,7 ;tcount1为0要查表 jmp intend ;;;;;;;;;;;;;;;;;;;;;;;;;; ;梦幻子程序 ;;;;;;;;;;;;;;;;;;;;;;;;;; intext2: djz tcount2 ;同一级亮度存在拍数由 spcode查表得到 jmp intext21 mov a,tick ;这是一个查表得来的值 mov tcount2,a ;;;;;;;;;;;;;;;;;;;;;;;;;; djz tcount1 ;tcount1表示节拍 jmp intext21 bs stflag,7 inc tcount1 ;重置查表标志
;;;;;;;;;;;;;;;;;;;;;;;;; ;tcount1!=tcount3 ;;;;;;;;;;;;;;;;;;;;;;;;; intext25: mov a,tcount1 sub a,tcount3 jbc status,c ;若为1则无借位,tcount1>tcount3 jmp intext27 mov temp3,a ;差放入temp3中 inc temp3 inc temp3 mov a,tcount3 mov temp,a intext28: call delay100u ;第一波廷时 djz temp jmp intext28 mov a,code2 ;先输出code2,即处于消暗的代码 mov port5,a intext29: call delay100u djz temp3 jmp intext29 mov a,code ;再输出code,即处于上涨的代码 mov port5,a jmp intext21 intext27: mov a,tcount3 sub a,tcount1 mov temp3,a inc temp3 inc temp3 mov a,tcount1 mov temp,a intext30: call delay100u djz temp jmp intext30 mov a,code ;输出code,即处于上涨的代码 mov port5,a intext31: call delay100u djz temp3 jmp intext31 mov a,code2 ;输出code2,即处于消暗的代码 mov port5,a ;;;;;;;;;;;;;;;;;;;;;;;;;;; intext21: jbs code,7 ;判断是渐亮还时渐灭 jmp intext22 ;这里是亮度变化趋势区分点 mov a,tcount1 ;code,7为1,则亮度渐亮 mov temp,a intext23: call delay100u ;这是个定长廷时子程序,如能用定时器会更好,那有可能利于加上按健功能 djz temp jmp intext23 mov a,code ;输出已准备好的代码 mov port5,a ; jmp intend intext22: mov a,tcount1 ;亮度为渐暗 add a,@91 ;与160对应产生不过0的廷时 mov temp,a com temp ;得到渐暗方式的代码 intext24: call delay100u djz temp jmp intext24 mov a,code mov port5,a call delay100u call delay100u
intend: mov a,a_temp clr isr ;这一指令不能少 reti ;;;;;;;;;;;;;;;;;;;;;;;;;;; spmode1: add pc,a retl 10;5;10 retl 10;5;10 retl 20;10;20 retl 30;15;30 retl 60;30;60 tbmode1: add pc,a retl 0b00000000 ;4 跑马1 retl 0b00000100;0b00000001 retl 0b00000010;0b00000010 retl 0b00000001;0b00000100 tbmode2: add pc,a retl 0b00000000 ;7 跑马2 retl 0b00000000 retl 0b00000100 retl 0b00000110 retl 0b00000111 retl 0b00000111 retl 0b00000011 retl 0b00000001 spmode4: add pc,a retl 1 retl 1 retl 1 retl 1 retl 1 tbmode3: add pc,a retl 0b00000000 ;6 retl 0b00000110 retl 0b10000110 retl 0b00000011 retl 0b10000011 retl 0b00000101 retl 0b10000101 tbmode4: add pc,a retl 0b00000000 ;6 retl 0b00000111 retl 0b10000111 retl 0b00000000 retl 0b00000111 retl 0b10000111
tbmode5: add pc,a retl 0b00000000 retl 0b00000101 retl 0b00000110 retl 0b00000011
;======================================= org 0x100 main: clr lamp mov a,@0xf0 ;设置PORT5 iow ioc5 clr port5 mov a,@0xf0 iow iocb mov a,@0b11111101 ;设置PORT6. iow ioc6 mov a,@0x02 ;P6口上拉 iow iocd mov a,port6 ;读入P6口的拔码开关值 nop mov a,port6 mov spcode,a rlc spcode ;把高2位左移到低2位 rlc spcode rlc spcode mov a,@0x03 ;屏蔽高6位 and spcode,a ;保存速度代码,这个代码是公用的
init: mov a,@04 ;开外部中断 iow iocf mov a,@0x40 iow ioce eni ;开总中断 ;jmp mode3 ;| ;;;;;;;;;;;;;;;;;;;;;;;;;; ;跑马1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;; mode1: clr ifdrim mov a,@15 mov count2,a ;决定这一模式总循环次数 mov a,spcode ;根据开关代码查到它对应的值 call spmode1 mov tick,a ;这里可以省去tick2了,40/80/120/160 mode13: bc stflag,0 ;表示不梦幻 mov a,@03 mov chtb,a mode12: mov a,chtb call tbmode1 mov code,a bc stflag,7 ;让查表标志清0 mov a,tick ;在中断子程序中也有这一句 mov tcount1,a mode10: nop nop nop nop nop nop nop nop nop nop jbs stflag,7 ;判断是否要进行查表 jmp mode10 ;tcountl若为0则进入下一拍 djz chtb jmp mode12 djz count2 jmp mode13 ; JMP MODE1
;;;;;;;;;;;;;;;;;;;;;;;;;; ;跑马2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;; mode2: clr ifdrim mov a,@14 mov count2,a ;决定这一模式总循环次数 mov a,spcode ;根据开关代码查到它对应的值 call spmode1 mov tick,a ;这里可以省去tick2了,40/80/120/160 mode23: bc stflag,0 ;表示不梦幻 mov a,@7 mov chtb,a mode22: mov a,chtb call tbmode2 mov code,a bc stflag,7 ;让查表标志清0 mov a,tick ;在中断子程序中也有这一句 mov tcount1,a mode20: nop nop nop nop nop nop nop nop nop nop jbs stflag,7 ;判断是否要进行查表 jmp mode20 ;tcountl若为0则进入下一拍 djz chtb jmp mode22 djz count2 jmp mode23 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;以下为梦幻模式,只计总时间 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mode3: clr ifdrim com ifdrim ;这是梦幻的标志,它是不变的 mov a,@5 ;进行的时间 mov count2,a ;count2决定了该模式的工作时间 mov a,spcode call spmode4 mov tick,a mov a,tick ;这个值由开机时决定,为4 mov tcount2,a ;决定同一亮度级别存在时间,为10ms的倍数 mode33: mov a,@6 mov chtb,a mode32: mov a,chtb call tbmode3 ;查表tbmode4 mov code,a ;进入代 bc stflag,7 ;让查表标志清0 mov a,@160 mov tcount1,a mode31: nop nop nop nop nop nop nop nop nop nop jbs stflag,7 jmp mode31 djz chtb jmp mode32 djz count2 jmp mode33
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;以下为梦幻模式,只计总时间 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mode4: clr ifdrim com ifdrim ;这是梦幻的标志,它是不变的 mov a,@5 ;进行的时间 mov count2,a ;count2决定了该模式的工作时间 mov a,spcode ;| call spmode4 ;| mov tick,a ;| mov a,@3 ;这个值由开机时决定,为4 mov tcount2,a ;决定同一亮度级别存在时间,为10ms的倍数 mode43: mov a,@5 mov chtb,a mode42: mov a,chtb call tbmode4 ;查表tbmode4 mov code,a ;进入代 bc stflag,7 ;让查表标志清0 mov a,@160 mov tcount1,a
mode41: nop nop nop nop nop nop nop nop nop nop jbs stflag,7 jmp mode41 djz chtb jmp mode42 djz count2 jmp mode43 ;;;;;;;;;;;;;;;;;;;;;;;;;; ;跑马5 ;;;;;;;;;;;;;;;;;;;;;;;;;;;; mode5: clr ifdrim mov a,@15 mov count2,a ;决定这一模式总循环次数 mov a,spcode ;根据开关代码查到它对应的值 call spmode1 mov tick,a ;这里可以省去tick2了,40/80/120/160 mode53: bc stflag,0 ;表示不梦幻 mov a,@3 mov chtb,a mode52: mov a,chtb call tbmode5 mov code,a bc stflag,7 ;让查表标志清0 mov a,tick ;在中断子程序中也有这一句 mov tcount1,a mode50: nop nop nop nop nop nop nop nop nop nop jbs stflag,7 ;判断是否要进行查表 jmp mode50 ;tcountl若为0则进入下一拍 djz chtb jmp mode52 djz count2 jmp mode53 jmp mode1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;延时子程序 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
delay100u: mov a,@10 mov temp2,a nop nop nop nop nop nop delay100: nop nop nop nop nop nop djz temp2 jmp delay100 ;循环体内定时4US,当F=4MHZ,D=2 ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
end |