|
基本上程序还是DEMO程序,程序并没有采用定时器来生成PWM,而是采用延时循环来实现,这样就做不了其他事情
了,但实际上只需要将主循环转换为定时器中断处理即可,很简单.这个是参照市面上邦定IC RGB控制功能来做
的,这应该是采用单片机方案最便宜版本之一了
本程序已经在ICE-153S上仿真通过,实物图片就不提供了,因为整个循环时间约1分钟,照片也不能看到LED渐亮/
暗的效果.
上原理图:
(原文件名:sch.jpg)
完整程序:
;******************************************
;EM78P153 RGB LED渐亮渐暗控制器
;P5.1-3分别接R G B LED,共七个模式循环R-G-B-RG-BG-RB-RGB
;P6.0 暂停/启动
;P6.1 开/关(并保持关前的状态)
;8M内部时钟,2clocks
;PWM频率约100Hz
;*******************************************
r1 EQU 0X01
R2 EQU 0X02
R3 EQU 0X03
R4 EQU 0x04
IOC5 EQU 0X05
IOC6 EQU 0X06
RF EQU 0x0F
port5 EQU 0X05
port6 EQU 0x06
IOCA EQU 0x0A
IOCB EQU 0X0B
IOCC EQU 0X0C
IOCD EQU 0X0D
IOCE EQU 0X0E
IOCF EQU 0x0F
CONT EQU 0X01
;**************************************
;定义各寄存器
delay EQU 0x20
delay1 EQU 0x21
count_inc EQU 0x22
count_dec EQU 0x23
count_inc_t EQU 0x24
count_dec_t EQU 0X25
sw EQU 0x26
count_mode EQU 0x27 ;模式寄存器
count_c EQU 0x28 ;重复脉冲计数器,每个相同脉冲输出5次
count_c_1 EQU 0x29 ;重复脉冲计数器,每个相同脉冲输出5次
;定义位寄存器
flag_light EQU 0
flag_onoff EQU 1
c EQU 0 ;进位标志位
dc EQU 1 ;辅助进位标志
z EQU 2 ;零标志位,算术或逻辑操作结果为0时置1
tcif EQU 0 ;TCC时间中断标志
icif EQU 1 ;P6口输入变化中断标志
exif EQU 2 ;外部中断标志
tcie EQU 0
icie EQU 1
exie EQU 2
;*****************************************
org 0x00
jmp start
table:add r2,a
retl @0b00001110 ;RGB灯
retl @0b00001010 ;红蓝灯
retl @0b00000110 ;蓝绿灯
retl @0b00001100 ;红绿灯
retl @0b00000010 ;蓝灯
retl @0b00000100 ;绿灯
retl @0b00001000 ;红灯
;*****************************************
start:
nop
mov a,@0x00
mov sw,a ;初始数据加载
mov a,@0x01 ;0x01
mov count_inc,a ;最小的高电平100us
mov count_inc_t,a
mov a,@0x63 ;0x63
mov count_dec,a
mov count_dec_t,a ;最大高电平时间9.9ms
mov a,@0x05
mov count_c,a ;重复脉冲计数器,每个相同脉冲输出5次
mov count_c_1,a
mov a,@0x07
mov count_mode,a ;七种模式
mov a,@0xff
iow ioc6 ;port6为输入口
mov a,@0x00
iow iocb ;所有IO下拉禁止
mov a,@0xff
iow iocc ;漏极开路输出禁止
mov a,@0xf8
iow iocd ;P6.0,1上拉允许
mov a,@0x00 ;
iow ioce
;******************************************************************
main:
call delay100us
jbc port6,1
jmp normal ;P6.1为1,程序正常执行
mov a,@0xff
iow ioc5 ;port5为输入口
jmp main ;熄灭LED
normal:
mov a,@0b11110001
iow ioc5 ;port5.1-3为输出口
jbc sw,flag_light
jmp night ;标志为1,去渐暗程序
;*******渐亮程序******************
jbc sw,flag_onoff
jmp toon ;标志为0,IO为0,去延时后打开
djz count_inc ;标志为1,IO为1,去延时后关闭
jmp main ;还没到延时时间,就退出
jbs port6,0 ;测试P6.0状态
jmp back_countinc ;为0,需要保持状态, 将count_inc_t数据备份回count_inc
djz count_c
jmp back_countinc ;重复次数
inc count_inc_t ;count_inc_t加1
mov a,count_inc_t
mov count_inc,a ;并将增加后的数据返回count_inc
mov a,@0x05
mov count_c,a ;重复脉冲计数器,每个相同脉冲输出4次
setting_inc:
bs sw,flag_onoff ;LED开的时间够了,关掉
mov a,@0x00
mov port5,a
jmp main
back_countinc:
mov a,count_inc_t
mov count_inc,a
jmp setting_inc
;*****************
toon:
djz count_dec
jmp main ;还没到延时时间,就退出
jbs port6,0 ;测试P6.0状态
jmp back_countdec ;为0,将count_dec_t数据备份回count_dec
djz count_c_1
jmp back_countdec ;没到0,重复次数
mov a,@0x05
mov count_c_1,a
djz count_dec_t
jmp setting_dec
bs sw,flag_light
mov a,@0x63 ;0x63
mov count_inc,a
mov count_inc_t,a
mov a,@0x01 ;0x01
mov count_dec,a
mov count_dec_t,a
jmp main
setting_dec:
mov a,count_dec_t
mov count_dec,a ;并将减去后的数据返回count_dec
bc sw,flag_onoff ;LED关的时间够了,打开
deca count_mode ;加载偏移量
call table
mov port5,a ;输出对应模式
jmp main
back_countdec:
mov a,count_dec_t
mov count_dec,a
jmp setting_dec
;**********************************
night: ;渐暗程序
jbc sw,flag_onoff
jmp toon_1 ;标志为0,IO为0,去延时后打开
djz count_inc ;标志为1,IO为1,去延时后关闭
jmp main ;还没到延时时间,就退出
jbs port6,0 ;测试P6.0状态
jmp back_countinc_1 ;为0,将count_inc_t数据备份回count_inc
djz count_c_1
jmp back_countinc_1
mov a,@0x05
mov count_c_1,a
djz count_inc_t
jmp back_countinc_1
bc sw,flag_light
mov a,@0x01 ;0x01
mov count_inc,a ;最小的高电平时间100us
mov count_inc_t,a
mov a,@0x63 ;0x63
mov count_dec,a
mov count_dec_t,a ;最大高电平时间为9.9ms
djz count_mode
jmp main
mov a,@0x07
mov count_mode,a
jmp main
setting_inc_1:
bs sw,flag_onoff ;
mov a,@0x00
mov port5,a
jmp main
back_countinc_1:
mov a,count_inc_t
mov count_inc,a
jmp setting_inc_1
;*****************
toon_1:
djz count_dec
jmp main ;还没到延时时间,就退出
jbs port6,0 ;测试P6.0状态
jmp back_countdec_1 ;为0,将count_dec_t数据备份回count_dec
djz count_c
jmp back_countdec_1
inc count_dec_t ;为1,count_dec_t加1
mov a,count_dec_t
mov count_dec,a ;并将减去后的数据返回count_dec
mov a,@0x05
mov count_c,a ;重复脉冲计数器,没个相同脉冲输出4
setting_dec_1:
bc sw,flag_onoff ;LED关的时间够了,打开
deca count_mode ;加载偏移量
call table
mov port5,a ;输出对应模式
jmp main
back_countdec_1:
mov a,count_dec_t
mov count_dec,a
jmp setting_dec_1
jmp main
;********************
delay100us:
mov a,@0x1
mov delay,a
delay100us_1:
mov a,@0x39
mov delay1,a
delay100us_2:
djz delay1
jmp delay100us_2
djz delay
jmp delay100us_1
ret
end
烧写代码(晕,居然不能直接上传烧写文件):点击此处下载 ourdev_336925.rar(文件大小:434字节) (原文件名:file.rar) |
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|