历史上的今天
今天是:2025年12月21日(星期日)
2022年12月21日 | 大功率轮廓灯跳机同步2回路源程序
2022-12-21 来源:zhihu
;*****************************************
; 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
retl 10
retl 20
retl 30
retl 60
tbmode1:
add pc,a
retl 0b00000000 ;2
retl 0b00000010
retl 0b00000001
tbmode2:
add pc,a
retl 0b00000000 ;3
retl 0b00000010
retl 0b00000011
retl 0b00000001
spmode4:
add pc,a
retl 1
retl 1
retl 1
retl 1
retl 1
tbmode3:
add pc,a
retl 0b00000000 ;8
retl 0b00000011
retl 0b10000011
retl 0b00000010
retl 0b10000010
retl 0b00000011
retl 0b10000011
retl 0b00000001
retl 0b10000001
tbmode4:
add pc,a
retl 0b00000000 ;6
retl 0b00000011
retl 0b10000011
retl 0b00000000
retl 0b00000011
retl 0b10000011
tbmode5:
add pc,a
retl 0b00000000
retl 0b00000000
retl 0b00000011
retl 0b00000000
retl 0b00000011
retl 0b00000000
retl 0b00000011
retl 0b00000000
retl 0b00000011
retl 0b00000000
retl 0b00000011
retl 0b00000000
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 mode4
;;;;;;;;;;;;;;;;;;;;;;;;;;
;跑马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,@02
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
;;;;;;;;;;;;;;;;;;;;;;;;;;
;跑马2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mode2:
clr ifdrim
mov a,@4
mov count2,a ;决定这一模式总循环次数
mov a,spcode ;根据开关代码查到它对应的值
call spmode1
mov tick,a ;这里可以省去tick2了,40/80/120/160
mode23:
bc stflag,0 ;表示不梦幻
mov a,@3
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,@8
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,@12
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
上一篇:LED迷你烟花灯汇编源代码
下一篇:简化版LED烟花灯汇编源代码
史海拾趣
|
CE60下调试RIL怎么算是调试成功了?用什么标准来衡量?TAPI/SIM/SMS的那些API可以正常使用算不算? CE60下调试RIL怎么算是调试成功了?用什么标准来衡量?TAPI/SIM/SMS的那些API可以正常使用算不算?… 查看全部问答> |
|
【玩转ADuCM360】 自己做的ADuCM360 ADC初始化程序-----芯片由VOCO_2000网友提供 测量电压已基本正常,ADC可以正常工作了,连续模式。 1、将ADI的ADUCM360的头文件中,凡是加了“ADI_”的,都去掉了。觉得烦人, 2、原来使用ADI提供的函数,觉得不明了,调用需要一至两层,需要压栈什么的。所以就直接使用它定义的结构体了,简 ...… 查看全部问答> |
|
Strategy Analytics移动互联网 (WMS)战略服务发布最新研究报告《新兴市场、室内定位和移动广告推动未来移动LBS市场增长》指出,破除在新兴市场采用基于位置服务(LBS)的障碍,并结合室内LBS和移动广告的势头,将推动未来移动LBS的增长。 配备GP ...… 查看全部问答> |
|
用WEBENCH设计一款太阳能电池降压电路,刚开始选择的输出电流太小0.1A,没有设计方案,后面将电流改为1A后就有了相应电路设计,如下: … 查看全部问答> |




