LED柔性丽得管汇编源代码

发布时间:2022-12-21  

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

; 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

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>