找回密码
 立即注册

QQ登录

只需一步,快速开始

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

ARM S2C2410A控制5个LED流水灯

[复制链接]
跳转到指定楼层
楼主
ID:113276 发表于 2016-4-10 17:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
无论是S3C2410A还是S3C2440A,其IO口B都是11位二进制数,xxx  xxxx xxxx,现在控制第5、6、7、8为做输出点亮LED灯(共阳极,输出0点亮),即xx8  765x  xxxx,GPBCON            equ            0x56000010
GPBDAT             equ            0x56000014
GPBUP               equ            0x56000018
                        xport xmain
                        area Init,code,readonly
                        entry
                        export
xmain
                        ldr r0,=GPBCON
                        ldr r1,[r0]
                        bic r1,#0x3fC00  ;r1=xx00 0000 00xx xxxx xxxx
                        orr r1,#0x15400  ;r1=xx01 0101 01xx xxxx xxxx
                        str r1,[r0]            ;r1传给GPBCON设置8765位为输出
                        ldr r0,=GPBUP
                        ldr r1,[r0]
                        orr r1,#0x1e0       ;r1=xx1 111x xxxx
                        str r1,[r0]             ;开B口第8、7、6、5位上拉电阻
                        ldr r0,=GPBDAT

        ldr r2,[r0]            ;把B口最初状态保存在R2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
LOOP                dr r1,[r2]
                        orr r1,#0x1c0
                        str r1,[r0]
                        bl  delay      ;BL跳转时将PC+4值自动保存在R14即LR中,也就是将程序的下一个语句地址保存在lr中
                                          ;在转移的程序后执行mov     pc,lr相当于返回,这样BL相当于调用子程序,pc=lr相当于子程序返回

                      ;;;;;;;;;;;;;;;;;;
                        dr r1,[r2]
                        orr r1,#0x1a0
                        str r1,[r0]
                        bl  delay
                    ;;;;;;;;;;;;;;;;;;;;;
                        ldr r1,[r2]
                        orr r1,#0x160
                        str r1,[r0]
                        bl  delay
                    ;;;;;;;;;;;;;;;;;;;;;;;;
                        ldr r1,[r2]
                        orr r1,#0x0e0
                        str r1,[r0]
                        bl  delay
                    ;;;;;;;;;;;;;;;;;;;;;;;;
                        b LOOP
delay
                        mov r3,#3
delay1               sub r3,r3,#1
                        cmp r3,#0x0
                        bne delay1
                        mov pc,lr           ;这句相当于子程序返回语句
                        end






GPA            equ 0x000000
                    GET d:\abc\INC\2440addr.inc
                    GET d:\abc\INC\Option.inc
                    GET d:\abc\INC\Memcfg.inc

                    area Init,code,readonly
                    CODE32
                     entry     
xmain                  
start
                    ldr r0,=GPACON
                    ldr r1,=GPA
                    str r1,[r0]
                    ldr r0,=GPADAT;
LOOP2        mov r1,#0
                    mov r2,#1
LOOP1        str r2,[r0]
                    BL delay
                    MOV r2,r2,LSL#1
                    add r1,#1
                    cmp r1,#23
                    bne LOOP1
                    B LOOP2

delay           mov r3,#5
delay1        sub r3,r3,#1
                   cmp r3,#0
                    bne delay1
                    mov pc,lr
                    end





GPBCON                                  equ            0x56000010
GPBDAT                                  equ            0x56000014
GPBUP                                    equ            0x56000018
GPAOUT                                 equ             0x0000000
GPACON                                 equ             0x56000000
GPADAT                                  equ            0x56000004
                                                 export  xmain
                                                area Init,code,readonly
                                                 CODE32
                                                 entry
                                                export
                                                GBLA nn   ;设置全局变量nn

xmain                  
                                            ldr r1,=GPAOUT ;调取设置A口为输出的数据

                                           ldr r0,=GPACON  ;调取A口输出的方向控制寄存器地址
                                           str r1,[r0]              ;把方向控制数据赋值给A口方向寄存器0x56000000
                                           ldr r0,=GPADAT   ;调取A口输出的寄存器地址,传递给[r0]就是输出
LOOP2                                mov r1,#0             ;r1计数23次,22个输出脚循环一次流水效果
                                            mov r2,#1             ;点亮流水灯一个灯亮
LOOP1
                                            str r2,[r0]                ;点亮一个灯
                                            BL delay                 ;延迟
                                            MOV r2,r2,LSL#1  ;左移点亮下一个,依次类推
                                            add r1,#1               ;计数加1
                                            cmp r1,#23      ;计数加1看够不够23,
                                            bne LOOP1            ;不够23次,说明没有全部轮流一次,跳到LOOP1继续。
                                            B LOOP2                 ;够23次,流水灯循环1次,跳到LOOP2处从头再来

delay                                    mov r3,#5
delay1                                  sub r3,r3,#1
                                            cmp   r3,#0
                                            bne delay1
                                            mov pc,lr
                                            end
流水灯C语言程序
#include"S3C2440.h"
void xmain()
{
            unsigned char n,m;
             GPACON =0;
             while(1)
                 {
                     for(n=0;n<23;n++)
                         {
                                GPADAT =1<<n;
                                for(m=0;m<15;m++)
                                    GPADAT = 1<<n;
                         }
                 }
}





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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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