;*****************************************
; 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