//*****************************************************************

//作者:昊天

//

//功能:在ok6410板子上跑裸板程序,用四个按键控制四个led灯的两灭及蜂鸣器的叫声,

//    
 当按键1按下时(此时为低电平)点亮led1同时蜂鸣器响,当松手时,led1灭及蜂鸣器不响
   

//    
 以此类推剩下三个键

//时间:2012/12/13   22:01

//******************************************************************

//蜂鸣器---GPF15

#define GPFCON   (*(volatile unsigned
*)(0x7f0080a0))

#define GPFDAT   (*(volatile unsigned
*)(0x7f0080a4))

#define GPFPUD   (*(volatile unsigned
*)(0x7f0080a8))

//按键(6个)---GPN0--GPN5

#define GPNCON   (*(volatile unsigned
*)(0x7f008830))

#define GPNDAT   (*(volatile unsigned
*)(0x7f008834))

#define GPNPUD   (*(volatile unsigned
*)(0x7f008838))

//LED(四个)----GPM0--GPM3

#define GPMCON  (*(volatile unsigned long
*)(0x7F008820))

#define GPMDAT  (*(volatile unsigned long
*)(0x7F008824))

#define GPMPUD   (*(volatile unsigned long
*)(0x7F008828))

void msDelay(volatile unsigned int time)

{

volatile unsigned int i;

volatile unsigned int j;

for(i=0;i<200000;i++)

{

for(j=0;j

}

}

 void GPIO_Init(void)

 {  //初始化buzzer

GPFCON = GPFCON &
(~(0x1<<(31)));  
//最高位31至0

GPFCON = GPFCON | (0x1<<(2*15));
     //第30位置1
  这样01表示输出

GPFPUD = GPFPUD &
(~(0x3<<(2*15)));  
//上拉电阻禁用

GPFDAT = GPFDAT & 0x7fff;  
//第16管脚输出为0  也就是buzzer不响

 

//初始化按键

GPNCON = GPNCON &
(0xffffffff<<12);

  GPNPUD = GPNPUD &
(0xffffffff<<12);

  GPNDAT = GPNDAT |
(~(0xffffffff<<6));

 

  //led初始化

    GPMCON = GPMCON |
(0x00001111);

    GPMPUD = GPMPUD
&
(0xFFFFFFFF<<8);

    GPMDAT = GPMDAT |
(~(0xfffffff0));

    

    

 }

 void BeepOff(void)

{

GPFDAT = GPFDAT &0x7fff;

}

void BeepOn(void)

{

GPFDAT = GPFDAT | 0x8000;

}

unsigned int KeyScan(void)

{

  

    if((GPNDAT
& 0x3f)==0x3e)

  return 1;  //说明按键1按下

else if((GPNDAT & 0x3f)==0x3d)

  return 2;  
//说明有按键2按下

else if((GPNDAT & 0x3f)==0x3b)

  return 3;  
  //说明有按键3按下

else if((GPNDAT & 0x3f)==0x37)

  return 4;  
   //说明有按键4按下

else

  return 0;  
 //说明没有按键按下

  

}

void KeyTest(void)

{

   unsigned int
KeyStatus;

   while(1)

   {

   
KeyStatus=KeyScan();

     

    switch(KeyStatus)

    {

    case
0:BeepOff(); 

     
    GPMDAT = GPMDAT |
0x0000000f;

     
    break;

    case 1:GPMDAT = (GPMDAT
& 0xfffffffe);   //1键按下点亮led1
     
     
  

     
     
  BeepOn();    
     
     
     
   

     
    break;

    case 2:GPMDAT = GPMDAT
& 0xfffffffd;

     
     
  BeepOn();

     
     
  break;

    case 3:GPMDAT = GPMDAT
& 0xfffffffb;

     
     
  BeepOn();

     
     
  break;

     
 case 4:GPMDAT = GPMDAT &
0xfffffff7;

     
     
  BeepOn();

     
     
  break;

    }

     

     

   }

}

void main(void)

{

GPIO_Init();

    BeepOff();

    KeyTest();

    

}

下面是启动代码init.o:

PRESERVE8

IMPORT main

AREA init,CODE,READONLY

ENTRY

CODE32

START

ldr r0,=0x70000000

orr r0,r0,#0x13

mcr p15,0,r0,c15,c2,4

ldr r0,=0x7E004000

mov r1,#0

str r1,[r0]

ldr sp,=8*1024

bl main

     
      END

6410裸板程序,led、蜂鸣器、按键…的更多相关文章

  1. 【arm学习】我的第一个裸板程序

    初学ARM感觉写个裸板程序还真的不容易,可能是没有用到ADS,keil之类的开发平台的缘故吧.编译,链接过程在linux平台上完成,这样学起来更有实感,还能顺便熟悉linux环境,以及命令,何乐而不为 ...

  2. 第8课.第一个ARM裸板程序(点亮led)及申引

    1.原理图 2.芯片手册 3.几条汇编代码 1.ldr:读内存 ldr R0, [R1] 假设R1的值是x,读取地址x上的数据(4字节),保存到R0中 ldr R0, =0x12345678 (4字节 ...

  3. JZs3c2440裸板程序GPIO操作总结

    分别用汇编,汇编+C两种方式 ***************************************汇编编程led_on.s********************************** ...

  4. 【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)

    作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42239705  参考博客 : [嵌入式开发]嵌入式 开发环境 (远 ...

  5. ARM裸板开发:04_MMU 链接地址与运行地址不一致时,(SDRAM)初始化程序地址无关码问题的分析

    ARM裸板开发过程,程序的链接地址设置为为0x30000000,而前期的启动代码以及相关硬件的初始化代码需要在内部iRAM(steppingstone,起始地址0x0)的4K中运行.链接地址与运行地址 ...

  6. S5PV210裸板驱动:启动

    以往2440和6410的启动方式,只要我们把裸板代码烧写到NAND FLASH的开始位置,当开发板上点启动时,处理器会自动从NAND FLASH上拷贝前面一段的代码到内部的RAM中执行.按照以前的方法 ...

  7. 裸板驱动总结(makefile+lds链接脚本+裸板调试)

    在裸板2440中,当我们使用nand启动时,2440会自动将前4k字节复制到内部sram中,如下图所示: 然而此时的SDRAM.nandflash的控制时序等都还没初始化,所以我们就只能使用前0~40 ...

  8. arm裸板驱动总结(makefile+lds链接脚本+裸板调试)

    在裸板2440中,当我们使用nand启动时,2440会自动将前4k字节复制到内部sram中,如下图所示: 然而此时的SDRAM.nandflash的控制时序等都还没初始化,所以我们就只能使用前0~40 ...

  9. uboot-tiny4412启动流程(下)----如何将自己的裸板测试程序加入uboot中启动测试

    今天在工作上搞了一天高通的芯片uboot程序,目的是希望将一个裸板的程序移植到uboot中,并且开机让它运行.这个芯片是NXP4330,目前是高通的一个芯片,基于ARM-contexA9架构,那么就跟 ...

随机推荐

  1. String、StringBuffer、StringBuilder分析(jdk8)

    以下代码只挑选了关键方法进行分析 public final class String //String类不可继承,实现了序列化 implements java.io.Serializable, Com ...

  2. 2017.10.31 Enginer+position+statement

    一.The basic information Post name Engineering manager Department Engineering Post member A24645 imme ...

  3. 《Drools7.0.0.Final规则引擎教程》第3章 3.2 KIE API解析

    3.2.4 KieServices 该接口提供了很多方法,可以通过这些方法访问KIE关于构建和运行的相关对象,比如说可以获取KieContainer,利用KieContainer来访问KBase和KS ...

  4. 在Virtualbox虚拟机中配置使用ROS Spark机器人(Orbbec Astra 和 Xtion)

    在虚拟机中配置使用ROS Spark,在Virtualbox中使用USB外设包括Orbbec Astra 和 Xtion深度摄像头和底盘. 虚拟机使用外接设备时,会遇到一些问题.不过随着虚拟机功能的逐 ...

  5. windows获取屏幕显示比例 读取注册表法

    static int GetDesktopScale() { ; HINSTANCE hUser32 = LoadLibrary(L"user32.dll"); if (hUser ...

  6. 常用的两个PHP类

      /** * Class Interval * @author logonmy * @desc 简单分析程序执行时间: */   Class Interval{ var $start;   publ ...

  7. 深入了解ZooKeeper(二)

    在上篇博客<<深入了解ZooKeeper(一)>>中我们知道了分布式协调技术.分布式锁的实现和zookeeper服务机制,接下来将进一步了解zookeeper究竟能为我们做了什 ...

  8. 重温CLR(七 ) 属性和事件

    无参属性 许多类型都定义了能被获取或更高的状态信息.这种状态信息一般作为类型的字段成员实现.例如一下类型包含两个字段: public sealed class Employee{ public str ...

  9. Hive中使用Python实现Transform时遇到Broken pipe错误排查

    Hive中有一表,列分隔符为冒号(:),有一列utime是Timestamp格式,需要转成Weekday存到新表. 利用Python写一个Pipeline的Transform,weekday.py的代 ...

  10. ④SpringBoot之thymeleaf使用

    本文介绍SpringBoot使用的模板技术thymeleaf以及通过webJar进行前端资源的引入以及使用thymeleaf介绍简单说, Thymeleaf 是一个跟 Velocity.FreeMar ...