LED柔性丽得管汇编源代码

2023-03-21 11:30   150   0  

;*****************************************


; 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


登录icspec成功后,会自动跳转查看全文
博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。