;*****************************************
; 78p153寄存器定义
;*****************************************
R0 == 0X0 ;间接寻址IAR
;****CONT REGISTE************* CONTW/R
; 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 ;如果为0,标致为1。
P == 3 ;执行SLEP时置为0
T == 4 ;时间溢出时置为0
GP0 == 5 ;
GP1 == 6 ;
RST == 7 ;复位类型,由引脚唤醒时置1,其它复位置0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
R4 == 0X4 ;在间接寻址中,用间接寻址方式寻址00~06,0F~2F,BIT6、7为通用读写位。
PORT5 == 0X5
IOC5 == 0X5 ;p5口控制,0:输出, 1:输入.
PORT6 == 0X6
IOC6 == 0X6 ;p5口控制,0:输出, 1:输入.
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 ;
li == 2 ;2 1
data == 0 ;0 2
clk == 1 ;1 0
long1 == 10
long2 == 20
timelong1 == 20
timelong2 == 30
speed1 == 10
speed2 == 40
;;;;;;;;;;;;;;;;
;通用常数预设
;;;;;;;;;;;;;;;;
linelong == 0xff ;灯体长度(总点数)
linelongnumb == 20
modenum == 0x06
;变量定义
time == 0x10 ;用于定时器延时
temp == 0x11 ;用于多个色彩计数输出。
chtbl == 0x12 ;查表值
temp2 == 0x13 ;用于一个长廷时
count1 == 0x14 ;
count2 == 0x16 ;用于一种模式的定时
count3 == 0x17
count4 == 0x18
temp1 == 0x15 ;
before == 0x19
after == 0x1a
a_temp == 0x1b
wmode == 0x1c
next == 0x1e
time1 == 0x1f
; include "emc153.h"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
org 0x0
jmp start
gomodtbl:
add pc,a
nop ;gomod_tblsize = 8
retl 1 ;红
retl 1
retl 4 ;红绿
retl 2
retl 2 ;绿
retl 6 ;绿蓝
retl 3
retl 3 ;蓝
retl 5 ;红蓝
challtbl:
add pc,a
nop
retl 1
retl 2
retl 3
retl 4
retl 5
retl 6
retl 7
resendtbl:
add pc,a
nop
retl 0
retl 1
retl 2
retl 3
retl 4
retl 5
retl 6
retl 7
lsmodtbl:
add pc,a
nop
retl 3
retl 1
retl 2
retl 3
retl 4
retl 5
retl 6
retl 7
scantbl:
add pc,a
nop
retl 0x15
retl 0x53
retl 0x36
retl 0x62
retl 0x24
retl 0x41
;;;;;;;;;;;;;;;;;;;;;;
;mncolor:根椐代码输出多个色彩
;输入:A:这里代表一色彩,TEMP:这里代表个数
;三层嵌
;;;;;;;;;;;;;;;;;;;;;
mncolor:
add pc,a
jmp mncolor0
jmp mncolor1
jmp mncolor2
jmp mncolor3
jmp mncolor4
jmp mncolor5
jmp mncolor6
jmp mncolor7
nop
mncolor0:
bs port5,data ;;输出为零
call oneclk
nop
call oneclk
nop
call oneclk
djz temp
jmp mncolor0
ret
mncolor1:
bc port5,data ;点亮红光
call oneclk
bs port5,data
call oneclk
bs port5,data
call oneclk
djz temp
jmp mncolor1
ret
mncolor2:
bs port5,data
call oneclk
bc port5,data ;点亮绿光
call oneclk
bs port5,data
call oneclk
djz temp
jmp mncolor2
ret
mncolor3:
bs port5,data
call oneclk
bs port5,data ;点亮蓝光
call oneclk
bc port5,data
call oneclk
djz temp
jmp mncolor3
ret
mncolor4:
bc port5,data
call oneclk
bc port5,data ;点亮红绿光
call oneclk
bs port5,data
call oneclk
djz temp
jmp mncolor4
ret
mncolor5:
bc port5,data
call oneclk
bs port5,data ;点亮红蓝光
call oneclk
bc port5,data
call oneclk
djz temp
jmp mncolor5
ret
mncolor6:
bs port5,data
call oneclk
bc port5,data ;点亮绿蓝光
call oneclk
bc port5,data
call oneclk
djz temp
jmp mncolor6
ret
mncolor7:
bc port5,data
call oneclk
bc port5,data ;点亮红绿蓝光
call oneclk
bc port5,data
call oneclk
djz temp
jmp mncolor7
ret
;;;;;;;;;;;;;;;;;;;;;
;NCOLOR:根据代码输出单个色彩像素
;输入:A,这里代表色彩
;双层嵌
;这个程式本身执行时间不长
;;;;;;;;;;;;;;;;;;;;;
ncolor:
add pc,a
jmp ncolor0
jmp ncolor1
jmp ncolor2
jmp ncolor3
jmp ncolor4
jmp ncolor5
jmp ncolor6
jmp ncolor7
nop
ncolor0:
call color0
ret
ncolor1:
call color1
ret
ncolor2:
call color2
ret
ncolor3:
call color3
ret
ncolor4:
call color4
ret
ncolor5:
call color5
ret
ncolor6:
call color6
ret
ncolor7:
call color7
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;初始化处理
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
org 0x110
start:
mov a,@0
contw ;定义分频比等
clr isr
mov a,@modenum ;模式总数
mov wmode,a
mov a,@0xf0 ;设置端口5为输出
iow ioc5
mov a,@0xf0 ;port5下拉
iow iocb
clr port5
mov a,@0xff ;port6口为输出,
iow ioc6
mov a,@0x0 ;p6口上拉
iow iocd
mov a,@0x01
iow iocf ;开外部中断,开中断后进入模式1
; jmp resend
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;gomod:
;变量:count2定时,count1,chtbl,time,temp1
;子程序:
; gomodtbl ;表首标识
; ncolor ;根据a输出色点
; mdelay2 ;一个用定时器实现的定时子程序
;常量:
gomod_time == 6 ;6本模式的定时常数
gomod_tabsize == 8 ;本模式查表的表据尺寸
gomod_long1 == 20 ;同色段的长度
gomod_speed == 30 ;移动的速度
gomod:
mov a,@linelongnumb
mov temp1,a ;借用TEMP1
gomod001:
mov a,@linelong ;{实际灯体长度
call mcolor0
call oneli ;}清屏
djz temp1
jmp gomod001
call oneli ;}清屏
mov a,@gomod_time ;本模式的定时常数
mov count2,a ;
gomod03:
mov a,@gomod_tabsize ;本模式查表的表据尺寸
mov chtbl,a
gomod02:
mov a,@gomod_long1
mov count1,a
gomod01:
mov a,chtbl
call gomodtbl ;表首标识
call ncolor
call oneli
mov a,@gomod_speed ;移动的速度
call mdelay2
jbc next,0
jmp chmode
djz count1
jmp gomod01
djz chtbl
jmp gomod02
djz count2
jmp gomod03
mov a,wmode
xor a,@modenum
jbs status,z
jmp gomod
;;;;;;;;;;;;;;;;;;;
;chall:全色变化
;子程序:
; challtbl ;表首标识
; mncolor ;根据a与temp输出色彩段
; mdelay1 ;一个用定时器实现的定时子程序
;变量:count2,count1,chtbl,before,after,temp,time
;常量:
; chall_time ;本模式的定时常数
; chall_tabsize ;本模式查表的表据尺寸
;chall模式的相关参数
chall_time == 10 ;10本模式的定时常数
chall_tabsize == 7 ;本模式查表的表据尺寸
chall_sp == 0xff
;修改后不再有渐变功能
;;;;;;;;;;;;;;;;;;;
chall:
mov a,@chall_time
mov count2,a
chall03:
mov a,@chall_tabsize
mov chtbl,a
chall02:
mov a,chtbl
call challtbl
mov after,a
mov a,@linelongnumb
mov temp1,a
chall01:
mov a,@0xff
mov temp,a
mov a,after
call mncolor
call oneli
djz temp1
jmp chall01 ;发出一行数据
mov a, @chall_sp
call mdelay2
jbc next,0
jmp chmode
djz chtbl
jmp chall02
djz count2
jmp chall03
mov a,wmode
xor a,@modenum
jbs status,z
jmp chall
/*
chall:
mov a,@linelong ;linelong ;{实际灯体长度
call mcolor0
call oneli ;}清屏
mov a,@chall_time ;本模式的定时常数
mov count2,a ;
chall03:
mov a,@chall_tabsize ;本模式查表的表据尺寸
mov chtbl,a
chall02:
mov a,@0xff
mov time,a ;count1做为一个渐变控制量
mov a,chtbl
call challtbl
mov before,a ;
and a,@0xf0 ;
mov after,a ;后一态的查表代码
swap after
mov a,before
and a,@0x0f
mov before,a ;前一态的查表代码
chall01:
mov a,@linelong
mov temp,a ;总个数
mov a,before
call mncolor ;输出一串数据
call oneli
com time
call mdelay1 ;这是一个更短的廷时
jbc next,0
jmp chmode
mov a,@linelong
mov temp,a
mov a,after
call mncolor
call oneli ;
com time
call mdelay1
jbc next,0
jmp chmode
djz time
jmp chall01
djz chtbl
jmp chall02
djz count2
jmp chall03
mov a,wmode
xor a,@modenum
jbs status,z
jmp chall
*/
;;;;;;;;;;;;;;;;;;;;;;;;
;resend:反向跑动,定长10米,25个点,用队列的方式记住当前点,长度有限
;子程序
; resendtbl ;表首标识
; mncolor ;根据a与temp输出色彩段
;
;变量:count2,count4,count3,count1,chtbl,temp,time
;常量
; resend_time
; resend_long ;实现反移位中的补移最大位数
; resend_sp ;定义移位的速度
; resend_tabsize
;resend模式的相关参数
resend_time == 250 ;8本模式的定时常数
resend_long == 10 ;实现反移位中的补移最大位数
resend_sp == 30 ;定义移位的速度
resend_tabsize == 8 ;查表数据尺寸
;;;;;;;;;;;;;;;;;;;;;;;;
resend:
mov a,@linelong
call mcolor0
call oneli
mov a,@resend_time
mov count2,a ;循环的次数
mov a,@resend_tabsize
mov chtbl,a ;总的段数-1,定义初始值。
mov a,@resend_long ;每段长度的
mov count4,a
mov a,@(resend_tabsize*resend_long)-1
mov count3,a
resend4:
mov a,chtbl
call resendtbl ;根据chtbl输出一个点。
call ncolor
djz count4 ;count4减1并判断是否要修改循环圈
jmp resend5 ;
mov a,@resend_long
mov count4,a ;重设一段的个数,count4与chtbl是无穷循环的
djz chtbl ;调整查表指针
jmp resend5
mov a,@resend_tabsize ;若查表超出范围,则重置值
mov chtbl,a ;重设当前处于哪一段
resend5:
djz count3 ;每发一位,总长度都减1
jmp resend4
resend8: ;一次发送完毕后会进行相应的廷时
mov a,@(resend_tabsize*resend_long)-1
mov count3,a
jmp resend7
resend7:
call oneli
mov a,@resend_sp ;定义移位的速度
call mdelay2
djz count2
jmp resend4
mov a,wmode
xor a,@modenum
jbs status,z
jmp resend
jmp lsmod
/*resend:
mov a,@linelong
call mcolor0
call oneli ;清0
mov a,@resend_time
mov count2,a ;决定这段模式的定时
mov a,@1 ;从末位开始
mov count3,a ;中间段的查
mov a,@resend_long ;实现反移位中的补移最大位数
mov count4,a ;本帧中要补移位的位数,4to1
resend04:
mov a,count3 ;count3记录了查表中一帧中的起头
mov chtbl,a ;重发一帧时要找到头
resend06:
mov a,@250/resend_long ;总段数=总长/每段长度
mov count1,a ;这个数用来保证像素是全的,temp1也是一个公用变量配套
mov a,count3
mov chtbl,a
resend02:
mov a,@resend_long ;
mov temp,a ;长度
mov a,chtbl
call resendtbl ;查找代码
call mncolor ;发出一段代码
resend05:
djz chtbl ;
jmp resend021
mov a,@resend_tabsize
mov chtbl,a
resend021: ;250位发送完毕,这段程序在发完250bit
djz count1
jmp resend02
resend01:
mov a,count4 ;进行适当移位,count4记录了当前要移动的位
mov temp,a ;确定长度
mov a,chtbl ;将下一个查表值
call resendtbl ;查表
call mncolor
call oneli ;发出一个有效脉冲
mov a,@resend_sp ;定义移位的速度
call mdelay2
jbc next,0
jmp chmode
djz count4
jmp resend06 ;只改变补移位数
mov a,@resend_long ;重新设置补位长度
mov count4,a
inc count3
mov a,count3
xor a,@9 ;有效数为1~8,用9来作叛断
jbs status,z
jmp resend04
mov a,@1 ;重新设定段数
mov count3,a
resend03:
djz count2 ;每移动一段要进行count2减1
jmp resend04
mov a,wmode
xor a,@modenum
jbs status,z
jmp resend
*/
;;;;;;;;;;;;;;;;
;lsmod:快速扫描
;子程序
; lsmodtbl ;表首标识
; ncolor ;根据a与temp输出色彩段
; mdelay2 ;
;变量:count2,chtbl,temp,time
;常量
; lsmod_time
; lsmod_long ;实现反移位中的补移最大位数
; lsmod_sp ;定义移位的速度
; lsmod_tabsize
;lsmod模式的相关参数
lsmod_time == 5 ;5
lsmod_long == 5 ;实现反移位中的补移最大位数
lsmod_sp == 4 ;定义移位的速度
lsmod_tabsize == 8
;
;;;;;;;;;;;;;;;;
lsmod:
mov a,@linelong ;{实际灯体长度
call mcolor0
call oneli ;}清屏
mov a,@lsmod_time
mov count2,a ;决定这段模式的定时
lsmod04:
mov a,@lsmod_tabsize
mov chtbl,a
lsmod03:
mov a,@lsmod_long
mov temp,a
lsmod01:
mov a,chtbl
call lsmodtbl
call ncolor
call oneli
mov a,@lsmod_sp
call mdelay2
jbc next,0
jmp chmode
djz temp
jmp lsmod01 ;
mov a,@lsmod_long
mov temp,a
lsmod05:
mov a,@0
call ncolor
call oneli
mov a,@lsmod_sp
call mdelay2
jbc next,0
jmp chmode
djz temp
jmp lsmod05
mov a,@lsmod_long
mov temp,a
lsmod07:
mov a,chtbl
call lsmodtbl
call ncolor
call oneli
mov a,@lsmod_sp
call mdelay2
jbc next,0
jmp chmode
djz temp
jmp lsmod07 ;
mov a,@linelong-4*lsmod_long
mov temp,a
lsmod02:
call color0
call oneli
mov a,@lsmod_sp
call mdelay2
jbc next,0
jmp chmode
djz temp
jmp lsmod02
mov a,@3*lsmod_long
mov temp,a
lsmod06:
call color0
call oneli
mov a,@lsmod_sp
call mdelay2
jbc next,0
jmp chmode
djz temp
jmp lsmod06
djz chtbl
jmp lsmod03
djz count2
jmp lsmod04
mov a,wmode
xor a,@modenum
jbs status,z
jmp lsmod
;;;;;;;;;;;;;;;;;;;;
;scan:全彩扫描,无底色,表中的数据进行了一定的安排。
;子程序
; scantbl ;表首标识
; ncolor ;根据a与temp输出色彩段
; mdelay2 ;
;变量:count2,chtbl,temp,time
;常量
; scan_time == 15
; scan_long1 == 6 ;实现反移位中的补移最大位数
; scan_sp == 5 ;定义移位的速度
; scan_tabsize == 6
;scan模式的相关参数
scan_time == 30 ;30
scan_long1 == 7 ;实现反移位中的补移最大位数
scan_sp == 4 ;定义移位的速度
scan_tabsize == 6