打印

五功能外控跳机(控制LED彩虹管)

[复制链接]
2034|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
优动的LED|  楼主 | 2008-7-18 14:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
;五功能外控跳机
;Model:SR-191
;2006二月九日改回
;*****************************************
;    78p153寄存器定义
;*****************************************
    R0     ==    0X0    ;间接寻址IAR
;****CONT REGISTE*************
;    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
        P      ==    3    ;执行SLEP时置为0
        T      ==    4    ;时间溢出时置为0
        GP0    ==    5    ;
        GP1    ==    6    ;
        RST    ==    7    ;复位类型,由引脚唤醒时置1,其它复位置0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    R4     ==    0X4
    
    PORT5  ==    0X5
    IOC5   ==    0X5
    PORT6  ==    0X6
    
    IOC6   ==    0X6
        
    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    ;
        
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;本程序的要点是计算电源频率进行计数实现同步。
    ;保证通电后基本同步开工
    a_temp     ==    0x10        ;中断子程序中保存A
    tcount1    ==    0x11       ;节拍计数1
    tcount2    ==    0x12       ;节拍计数2
    tick       ==    0x13          ;节拍常量值1

    chtb       ==    0x14          ;查表序号值

    count2     ==    0x15        ;定时计数值
    temp       ==    0x16          ;临时计数器
    temp2      ==    0x17
    code       ==    0x18          ;输出代码
    lamp       ==    0x19        ;用于闪烁计数
    spcode     ==    0x1a        ;代表速度的代码
    stflag     ==    0x1b        ;是否进入一拍标志
    ifdrim     ==    0x1c        ;是否梦幻
    code2      ==    0x1d        ;
    tcount3    ==    0x1e
    temp3      ==    0x1f

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;开始
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;    
    org    0x0
    jmp    main
;;;;;;;;;;;;;;;;;;;;;;;;
;中断计数子程序
;;;;;;;;;;;;;;;;;;;;;;;;
    
    org    0x8
intext:
    mov    a_temp,a
    bc    stflag,7        ;这是是否要进入下一态的标志位
    clr    port5
    clr    port5          ;中断后先清0。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;仅用于指示灯
;;;;;;;;;;;;;;;;;;;;;;;;;;;;        
    inc    lamp                ;lamp是指示灯计数寄存器,也可以用别的方法代替
    inca    spcode             ;速度代码0,1,2,3。加1后代入a中
   
    mov    temp2,a             ;temp2是局部变量,通过加1成为1,2,3,4。后再减1判0的方
    djz    temp2               ;式来进行指示
    jmp    speed2    
speed1:
    jbc    lamp,3
    jmp    lampset1
    bc    port6,1
    jmp    lampok
lampset1:
    bs    port6,1
    jmp    lampok
speed2:
    djz    temp2
    jmp    speed3
    jbc    lamp,4
    jmp    lampset2
    bc    port6,1
    jmp    lampok
lampset2:
    bs    port6,1
    jmp    lampok    
speed3:
    djz    temp2
    jmp    speed4
    jbc    lamp,5
    jmp    lampset3
    bc    port6,1
    jmp    lampok
lampset3:
    bs    port6,1
    jmp    lampok    
speed4:
    jbc    lamp,6
    jmp    lampset4
    bc    port6,1
    jmp    lampok
lampset4:
    bs    port6,1            ;port6,1用于指示灯
    jmp    lampok

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;    
lampok:
    call    delay100u            ;调用廷时子程序越过0点

    
    jbc    ifdrim,0           ;是否梦幻,ifdrim判断是否梦幻
    jmp    intext2            ;有梦幻,
;;;;;;;;;;;;;;;;;;;;;;;;;;
;非梦幻子程序
;;;;;;;;;;;;;;;;;;;;;;;;;;    
intext1:
    mov    a,code            ;输出代码
    mov    port5,a
    djz    tcount1           ;tcount1是主计数器
    jmp    intend
    mov    a,tick            ;tick中有一个常量值
    mov    tcount1,a        ;在中断子程序内加载数据
    bs     stflag,7            ;tcount1为0要查表
    jmp    intend
;;;;;;;;;;;;;;;;;;;;;;;;;;
;梦幻子程序
;;;;;;;;;;;;;;;;;;;;;;;;;;
intext2:
    djz    tcount2                ;同一级亮度存在拍数由 spcode查表得到
    jmp    intext21
    mov    a,tick                 ;这是一个查表得来的值
    mov    tcount2,a
;;;;;;;;;;;;;;;;;;;;;;;;;;
    djz    tcount1                ;tcount1表示节拍
    jmp    intext21
    
    bs     stflag,7
    inc    tcount1                  ;重置查表标志

;;;;;;;;;;;;;;;;;;;;;;;;;
;tcount1!=tcount3
;;;;;;;;;;;;;;;;;;;;;;;;;
intext25:
    mov    a,tcount1
    sub    a,tcount3
    jbc    status,c            ;若为1则无借位,tcount1>tcount3
    jmp    intext27
    mov    temp3,a            ;差放入temp3中
    inc    temp3
    inc    temp3
    mov    a,tcount3
    mov    temp,a
intext28:
    call    delay100u         ;第一波廷时
    djz    temp
    jmp    intext28
    mov    a,code2            ;先输出code2,即处于消暗的代码
    mov    port5,a
intext29:
    call    delay100u
    djz    temp3
    jmp    intext29
    mov    a,code            ;再输出code,即处于上涨的代码
    mov    port5,a
    jmp    intext21
    
intext27:
    mov    a,tcount3
    sub    a,tcount1
    mov    temp3,a
    inc    temp3
    inc    temp3
    mov    a,tcount1
    mov    temp,a
intext30:
    call    delay100u
    djz    temp
    jmp    intext30
    mov    a,code            ;输出code,即处于上涨的代码
    mov    port5,a
intext31:    
    call    delay100u
    djz    temp3
    jmp    intext31
    mov    a,code2            ;输出code2,即处于消暗的代码
    mov    port5,a
;;;;;;;;;;;;;;;;;;;;;;;;;;;    
    
intext21:
    jbs    code,7                ;判断是渐亮还时渐灭
    jmp    intext22                ;这里是亮度变化趋势区分点
    
    mov    a,tcount1               ;code,7为1,则亮度渐亮
    mov    temp,a
intext23:
    call    delay100u            ;这是个定长廷时子程序,如能用定时器会更好,那有可能利于加上按健功能
    djz    temp
    jmp    intext23
    mov    a,code                  ;输出已准备好的代码
    mov    port5,a                 ;
    jmp    intend
    
intext22:
    mov    a,tcount1                  ;亮度为渐暗
    add    a,@91                ;与160对应产生不过0的廷时
    mov    temp,a
    com    temp                  ;得到渐暗方式的代码
intext24:
    call    delay100u
    djz    temp
    jmp    intext24    
    mov    a,code
    mov    port5,a
    call    delay100u
    call    delay100u 

intend:
    mov    a,a_temp
    clr    isr                ;这一指令不能少
    reti
    
;;;;;;;;;;;;;;;;;;;;;;;;;;;
spmode1:
    add    pc,a
    retl    10;5;10
    retl    10;5;10
    retl    20;10;20
    retl    30;15;30
    retl    60;30;60
    
tbmode1:
    add    pc,a
    retl    0b00000000    ;4    跑马1
    retl    0b00000100;0b00000001
    retl    0b00000010;0b00000010
    retl    0b00000001;0b00000100
    
tbmode2:
    add    pc,a
    retl    0b00000000    ;7    跑马2    
    retl    0b00000000
    retl    0b00000100
    retl    0b00000110
    retl    0b00000111
    retl    0b00000111
    retl    0b00000011
    retl    0b00000001
    
spmode4:
    add    pc,a
    retl    1
    retl    1
    retl    1
    retl    1
    retl    1
    
tbmode3:
    add    pc,a
    retl    0b00000000    ;6
    
    retl    0b00000110
    retl    0b10000110
    
    retl    0b00000011
    retl    0b10000011
    
    retl    0b00000101
    retl    0b10000101
    
tbmode4:
    add    pc,a
    retl    0b00000000    ;6
    retl    0b00000111
    retl    0b10000111
    retl    0b00000000
    retl    0b00000111
    retl    0b10000111

tbmode5:
    add    pc,a
    retl    0b00000000
    retl    0b00000101
    retl    0b00000110
    retl    0b00000011

;=======================================    
    org    0x100
main:
    clr    lamp
    mov    a,@0xf0    ;设置PORT5
    iow    ioc5
    clr    port5
    mov    a,@0xf0
    iow    iocb
    mov    a,@0b11111101    ;设置PORT6.
    iow    ioc6
    mov    a,@0x02     ;P6口上拉
    iow    iocd
    
    mov    a,port6    ;读入P6口的拔码开关值
    nop
    mov    a,port6
    mov    spcode,a
    rlc    spcode     ;把高2位左移到低2位
    rlc    spcode
    rlc    spcode
    mov    a,@0x03    ;屏蔽高6位
    and    spcode,a   ;保存速度代码,这个代码是公用的
    

init:    
    mov    a,@04    ;开外部中断
    iow    iocf
    mov    a,@0x40
    iow    ioce
    eni                ;开总中断
    ;jmp    mode3    ;|
    
;;;;;;;;;;;;;;;;;;;;;;;;;;
;跑马1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mode1:
    clr    ifdrim
    mov    a,@15
    mov    count2,a           ;决定这一模式总循环次数
    
    mov    a,spcode           ;根据开关代码查到它对应的值
    call    spmode1
    mov    tick,a             ;这里可以省去tick2了,40/80/120/160
    
mode13:
    bc    stflag,0            ;表示不梦幻
    mov    a,@03        
    mov    chtb,a            
mode12:
    mov    a,chtb
    call    tbmode1
    mov    code,a
    bc    stflag,7           ;让查表标志清0
    mov    a,tick            ;在中断子程序中也有这一句
    mov    tcount1,a
mode10:    
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    jbs    stflag,7    ;判断是否要进行查表
    jmp    mode10    ;tcountl若为0则进入下一拍
    djz    chtb
    jmp    mode12
    djz    count2
    jmp    mode13
;    JMP    MODE1

;;;;;;;;;;;;;;;;;;;;;;;;;;
;跑马2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mode2:
    clr    ifdrim
    mov    a,@14
    mov    count2,a           ;决定这一模式总循环次数
    
    mov    a,spcode           ;根据开关代码查到它对应的值
    call    spmode1
    mov    tick,a             ;这里可以省去tick2了,40/80/120/160
    
mode23:
    bc    stflag,0            ;表示不梦幻
    mov    a,@7        
    mov    chtb,a            
mode22:
    mov    a,chtb
    call    tbmode2
    mov    code,a
    bc    stflag,7           ;让查表标志清0
    mov    a,tick            ;在中断子程序中也有这一句
    mov    tcount1,a
mode20:    
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    jbs    stflag,7    ;判断是否要进行查表
    jmp    mode20    ;tcountl若为0则进入下一拍
    djz    chtb
    jmp    mode22
    djz    count2
    jmp    mode23    
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;以下为梦幻模式,只计总时间
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mode3:
    clr    ifdrim
    com    ifdrim              ;这是梦幻的标志,它是不变的    
    mov    a,@5               ;进行的时间
    mov    count2,a            ;count2决定了该模式的工作时间
    mov    a,spcode
    call    spmode4
    mov    tick,a
    mov    a,tick              ;这个值由开机时决定,为4
    mov    tcount2,a           ;决定同一亮度级别存在时间,为10ms的倍数
mode33:
    mov    a,@6
    mov    chtb,a
mode32:
    mov    a,chtb
    call    tbmode3            ;查表tbmode4
    mov    code,a              ;进入代
    bc    stflag,7           ;让查表标志清0
    mov    a,@160
    mov    tcount1,a    
    
mode31:        
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    jbs    stflag,7
    jmp    mode31
    djz    chtb
    jmp    mode32
    djz    count2
    jmp    mode33

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;以下为梦幻模式,只计总时间
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mode4:
    clr    ifdrim
    com    ifdrim              ;这是梦幻的标志,它是不变的    
    mov    a,@5               ;进行的时间
    mov    count2,a            ;count2决定了该模式的工作时间
    mov    a,spcode    ;|
    call    spmode4    ;|
    mov    tick,a      ;|
    mov    a,@3              ;这个值由开机时决定,为4
    mov    tcount2,a           ;决定同一亮度级别存在时间,为10ms的倍数
mode43:
    mov    a,@5
    mov    chtb,a
mode42:
    mov    a,chtb
    call    tbmode4            ;查表tbmode4
    mov    code,a              ;进入代
    bc    stflag,7           ;让查表标志清0
    mov    a,@160
    mov    tcount1,a

mode41:        
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    jbs    stflag,7
    jmp    mode41
    djz    chtb
    jmp    mode42
    djz    count2
    jmp    mode43          
    
;;;;;;;;;;;;;;;;;;;;;;;;;;
;跑马5
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mode5:
    clr    ifdrim
    mov    a,@15
    mov    count2,a           ;决定这一模式总循环次数
    
    mov    a,spcode           ;根据开关代码查到它对应的值
    call    spmode1
    mov    tick,a             ;这里可以省去tick2了,40/80/120/160
    
mode53:
    bc    stflag,0            ;表示不梦幻
    mov    a,@3        
    mov    chtb,a            
mode52:
    mov    a,chtb
    call    tbmode5
    mov    code,a
    bc    stflag,7           ;让查表标志清0
    mov    a,tick            ;在中断子程序中也有这一句
    mov    tcount1,a
mode50:    
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    jbs    stflag,7    ;判断是否要进行查表
    jmp    mode50    ;tcountl若为0则进入下一拍
    djz    chtb
    jmp    mode52
    djz    count2
    jmp    mode53
    jmp    mode1    
        
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;延时子程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;    

delay100u:
    mov    a,@10
    mov    temp2,a
    nop
    nop
    nop
    nop
    nop
    nop
delay100:
    nop
    nop
    nop
    nop
    nop
    nop
    djz    temp2
    jmp    delay100    ;循环体内定时4US,当F=4MHZ,D=2
    ret    
    
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    end

相关帖子

沙发
OUCHANGHUA| | 2010-8-17 17:48 | 只看该作者
怎么没人顶下,,我来支持下

使用特权

评论回复
板凳
z_no1| | 2010-8-17 21:17 | 只看该作者
第一:LZ要干嘛?
第二:一般人是没兴趣去看汇编代码的。

使用特权

评论回复
地板
highgear| | 2010-8-17 21:26 | 只看该作者
虽然没有兴趣看你的汇编代码, 还是顶一个,以示支持。

使用特权

评论回复
5
LEDS| | 2010-9-14 12:59 | 只看该作者
汇编我喜欢.我用的是AVR汇编

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

11

帖子

0

粉丝