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

//作者:昊天

//

//功能:在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. [JS学习笔记]浅谈Javascript事件模型

    DOM0级事件模型 element.on[type] = function(){} 兼容性:全部支持   lay1 lay2 lay3 e.target:直接触发事件的元素[IE8及以下不支持tage ...

  2. Android 开发最牛的图片轮播控件,基本什么都包含了。

    Android图片轮播控件  源码下载地址: Android 图片轮播 现在的绝大数app都有banner界面,实现循环播放多个广告图片和手动滑动循环等功能.因为ViewPager并不支持循环翻页, ...

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

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

  4. OpenCV 视频与图片序列相互转换

    我们在计算机视觉相关的实验中都需要视频与图片序列之间相互转换,在平时的实验中,经常需要将视频保存为一帧一帧的图片,以获取实验结果:另一方面,很多标准的算法测试数据库都是图片序列(文件名以帧号+图片扩展 ...

  5. mysql 视图,触发器,存储

    一.视图 概念:其实就是一个临时表. 视图是一个虚拟表(非真实存在的),其本质是[根据SQL语句获取动态的数据库,并为其命名],用户使用时只需使用[名称]即可获取结果集.就可以当做表来使用. # 1. ...

  6. 迁移 Windows 上 Oracle 11.2.0.3.0 到 Linux 上 Oracle 11.2.0.3.0

    一.迁移前数据库基本信息统计 查看数据库版本 SELECT * FROM V$VERSION; /* Oracle Database 11g Enterprise Edition Release 11 ...

  7. Python之contextlib库及源码分析

    Utilities for with-statement contexts __all__ = ["contextmanager", "closing", &q ...

  8. JDBC 2 封装

    1 封装 新建类 DBConnUtil  ,新建database.properties 文件储存链接信息如下所示 jdbcDriver=com.mysql.jdbc.Driver jdbcUrl=jd ...

  9. 剑指offer-第四章解决面试题的思路(栈的压入和弹出序列)

    题目:输入两个整数序列,第一个序列表示栈的压入序列,请判断第二个序列是否为弹出序列. 思路:定义两个指针sPush和sPop分别指向两个整数序列的开头,借助一个辅助的栈,将第一个序列的数据依次压入栈中 ...

  10. 【经典】Noip动态规划

    一.线性动态规划 最长严格上升子序列 #include<iostream> #include<cstdio> using namespace std; int n,ans; ] ...