单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 191|回复: 1
打印 上一主题 下一主题
收起左侧

BASCOM- AVR版 MEGA16驱动WS2812彩带源代码

[复制链接]
跳转到指定楼层
楼主
taotie 发表于 2019-11-16 20:34 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 taotie 于 2019-11-16 22:19 编辑

在这个程序的基础上还可以玩出许多花样~~~





rem    老外的代码:mega16 ,10Mhz外部晶振驱动WS2812彩带
rem  运行环境:编译器bascom-avr   仿真Proteus 8 .8
rem  功能:点亮1个WS2812x8彩带,绿色亮度递增
rem   两个SUB过程800好用。400不知何原因待研究。
rem   仿真时需将芯片晶振属性改为10Mhz外部晶振。
$regfile = "m16def.dat" ' specify the used micro
$crystal = 10000000 ' used crystal frequency
$hwstack = 64 ' default use 32 for the hardware stack
$swstack = 32 ' default use 10 for the SW stack
$framesize = 32 ' default use 40 for the frame space
Declare Sub Send_frame_800(byval Number_of_ic As Byte)
Declare Sub Send_frame_400(byval Number_of_ic As Byte)
' 包含每个通道的 PWM 值
' Gr?e 数组的 e 是根据 WS2811 控制器的数量 = 3 计算的
' 在示例程序中 3 × 3 = 9
Dim Led_buffer(9) As Byte                 '缓冲区9字节
' 用于测试的辅助变量
Dim Rnd_value As Byte
Dim Loop_counter As Byte                 '    循环计数器变量        
' 数据线的配置
Sdi Alias Portd.6
Config Portd.6 = Output
' --------- 主要程序--------------
Do
'For Loop_counter = 1 To 9
'Led_buffer(loop_counter) = Rnd(255)  '随机值载入缓存
'Call Send_frame_400(3)
'Call Send_frame_800(3)                       '发送帧
' Next Loop_counter                               '退出循环                          
'使用控制器进行测试
Led_buffer(1) =70    ' 绿色
Led_buffer(2) = 0          ' 红
Led_buffer(3) =0                ' 蓝色
Led_buffer(4) = 100  ' 绿色
Led_buffer(5) = 0           ' 红
Led_buffer(6) =0                ' 蓝色
Led_buffer(7) = 130     ' 绿色
Led_buffer(8) =0          ' 红
Led_buffer(9) =0            ' 蓝色
Led_buffer(10) = 160    ' 绿色
Led_buffer(11) =0          ' 红
Led_buffer(12) =0            ' 蓝色
Led_buffer(13) = 190    ' 绿色
Led_buffer(14) =0         ' 红
Led_buffer(15) =0              ' 蓝色
Led_buffer(16) = 220  ' 绿色
Led_buffer(17) =0        ' 红
Led_buffer(18) =0             ' 蓝色
Led_buffer(19) = 255   ' 绿色
Led_buffer(20) =0         ' 红
Led_buffer(21) =0              ' 蓝色
Led_buffer(22) = 255  ' 绿色
Led_buffer(23) =0          ' 红
Led_buffer(24) =0             ' 蓝色

Call Send_frame_800(3)
Waitms 300
Loop
'--------- Ende Hauptprogramm --------------
Sub Send_frame_800(byval Number_of_ic As Byte)
Local I As Byte
Local J As Byte
Local Last_channel As Byte
Local Temp As Byte
Local Mask As Byte
Last_channel = Number_of_ic * 3
Mask = 128
Sdi = 0
Waitms 1
' Bit Zeiten
' für eine 1, T1H 0.6 μs T1L 0.65 μs
' für eine 0, T0H 0.25 μs T0L 1.0 μs
push r0 ' enth?lt das aktuelle Byte des Kanals
push r16 ' Bitz?hler
push r17 ' Kanalz?hler
Loadadr Last_channel , X
ld r17,x
Loadadr Led_buffer(1) , X
Channel_loop_800:
ld r0,x+
ldi r16,8
Bit_loop_800:
lsl r0
brcc BIT_0_800
Bit_1_800:
Sbi $12 , 6
nop
nop
nop
nop
cbi $12 , 6
rjmp Next_bit_800
Bit_0_800:
Sbi $12 , 6
nop
cbi $12 , 6
Next_bit_800:
dec r16
cpi r16,0
brne BIT_LOOP_800
dec r17
cpi r17,0
brne CHANNEL_LOOP_800
pop r17
pop r16
pop r0
Waitus 60
End Sub
'******************************************
'
'
'******************************************
Sub Send_frame_400(byval Number_of_ic As Byte)Local I As Byte
Local J As Byte
Local Last_channel As Byte
Local Temp As Byte
Local Mask As Byte
Last_channel = Number_of_ic * 3
Mask = 128
Sdi = 0
Waitms 1
' Bit Zeiten
' für eine 1, T1H 1.2 μs T1L 1.3 μs
' für eine 0, T0H 0.5 μs T0L 2.0 μs
push r0 ' enth?lt das aktuelle Byte des Kanals
push r16 ' Bitz?hler
push r17 ' Kanalz?hler
Loadadr Last_channel , X
ld r17,x
Loadadr Led_buffer(1) , X
Channel_loop_400:
ld r0,x+
ldi r16,8
Bit_loop_400:
lsl r0
brcc BIT_0_400
Bit_1_400:
Sbi $12 , 6
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
cbi $12 , 6
nop
nop
rjmp Next_bit_400
Bit_0_400:
Sbi $12 , 6
nop
nop
nop
cbi $12 , 6
nop
nop
nop
nop
nop
nop
nop
nop
nop
Next_bit_400:
dec r16
cpi r16,0
brne BIT_LOOP_400
dec r17
cpi r17,0
brne CHANNEL_LOOP_400
pop r17
pop r16
pop r0
Waitus 60
End Sub


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

沙发
51hei团团 发表于 2019-11-22 20:56 | 只看该作者
好东东啊 求工程文件
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|单片机论坛 |51黑电子论坛技术交流 QQ 管理员QQ:125739409;技术交流QQ群636986012

Powered by 单片机教程网

快速回复 返回顶部 返回列表