主题 : 韦老板_mini2440_第一篇_按键和led双剑合璧 复制链接 | 浏览器收藏 | 打印
知识改变命运!
级别: 新手上路
UID: 39523
精华: 0
发帖: 7
金钱: 35 两
威望: 7 点
贡献值: 0 点
综合积分: 14 分
注册时间: 2011-03-09
最后登录: 2011-06-16
楼主  发表于: 2011-03-25 12:29

 韦老板_mini2440_第一篇_按键和led双剑合璧

复制代码
  1. /*
  2. 文件名:main.s
  3. 时间:2011.3.23  作者:kissyyg
  4. 功能:按键K1到K4被按下时相应的led1到led4被点亮,K5被按下时全亮,K6按下时蜂鸣器响。
  5. */
  6. #define GPBCON *((volatile unsigned long*)0x56000010)
  7. #define GPBDAT *((volatile unsigned long*)0x56000014)
  8. #define GPGCON *((volatile unsigned long*)0x56000060)
  9. #define GPGDAT *((volatile unsigned long*)0x56000064)
  10. //对应led1,2,3,4的io口,做输出
  11. #define GPB5_OUT (1<<(5*2))
  12. #define GPB6_OUT (1<<(6*2))
  13. #define GPB7_OUT (1<<(7*2))
  14. #define GPB8_OUT (1<<(8*2))
  15. //蜂鸣器io口,作输出
  16. #define GPB0_OUT (1<<(0*2))
  17. //对应按键1,2,3,4,5,6的的io口,做输入
  18. #define GPG0_IN  ~(3<<(0*2))
  19. #define GPG3_IN  ~(3<<(3*2))
  20. #define GPG5_IN  ~(3<<(5*2))
  21. #define GPG6_IN  ~(3<<(6*2))
  22. #define GPG7_IN  ~(3<<(7*2))
  23. #define GPG11_IN ~(3<<(11*2))
  24. //led事件的定义,点灯给低电平,灭灯相反,键被按下为低电平
  25. #define led1_on         ~(1<<5)
  26. #define led2_on      ~(1<<6)
  27. #define led3_on      ~(1<<7)
  28. #define led4_on      ~(1<<8)
  29. #define led_all_on      ~((1<<5)|(1<<6)|(1<<7)|(1<<8))
  30. #define led1_down      (1<<5)
  31. #define led2_down      (1<<6)
  32. #define led3_down      (1<<7)
  33. #define led4_down      (1<<8)
  34. #define led_all_down ((1<<5)|(1<<6)|(1<<7)|(1<<8))
  35. //按键事件定义,键被按下读得为低电平否则为高电平
  36. #define k1_down (1<<0)
  37. #define k2_down (1<<3)
  38. #define k3_down (1<<5)
  39. #define k4_down (1<<6)
  40. #define k5_down (1<<7)
  41. #define k6_down (1<<11)
  42. //蜂鸣器,给高则发声否则不发
  43. #define beep         (1<<0)
  44. #define beep_stop   ~(1<<0)
  45. int main()
  46. {
  47.     
  48.     
  49.     unsigned long dwData;;
  50.     
  51.     //配置端口的输入输出
  52.     
  53.     GPBCON = GPB0_OUT | GPB5_OUT | GPB6_OUT | GPB7_OUT | GPB8_OUT;
  54.     GPGCON = GPG0_IN & GPG3_IN & GPG5_IN & GPG6_IN & GPG7_IN;
  55.     
  56.     //循环查询是否有键被按下
  57.     
  58.     while(1)
  59.     {
  60.         dwData = GPGDAT;
  61.         
  62.         if(dwData & k1_down)            //k1没被按下
  63.             GPBDAT |= led1_down;        //led1灭
  64.         else
  65.             GPBDAT &= led1_on;            //否则亮
  66.             
  67.                 
  68.         if(dwData & k2_down)            //k2没被按下
  69.             GPBDAT |= led2_down;        //led2灭
  70.         else
  71.             GPBDAT &= led2_on;            //否则亮
  72.             
  73.                 
  74.         if(dwData & k3_down)            //k3没被按下
  75.             GPBDAT |= led3_down;        //led3灭
  76.         else
  77.             GPBDAT &= led3_on;            //否则亮
  78.             
  79.                 
  80.         if(dwData & k4_down)            //k4没被按下
  81.             GPBDAT |= led4_down;        //led4灭
  82.         else
  83.             GPBDAT &= led4_on;            //否则亮
  84.     
  85.     
  86.         if(dwData & k5_down)            //k5没被按下
  87.                 ;                        //什么也不做
  88.         else
  89.             GPBDAT &= led_all_on;        //否则全亮
  90.             
  91.             
  92.         if(dwData & k6_down)            //键6没被按
  93.             GPBDAT &= beep_stop;
  94.         else
  95.             GPBDAT |= beep;                //否则响
  96.         
  97.     }
  98.     
  99.     return 0;
  100. }
  101. ;文件名:main.s
  102. ;时间:2011.3.23  作者:kissyyg
  103. ;功能:设置堆栈,关掉看门狗,跳转到main()函数执行
  104.         IMPORT main    
  105.         CODE32
  106.         AREA test,CODE,READONLY
  107.         ENTRY
  108.         
  109. START    LDR r0, =0x53000000    ;disable dog
  110.         MOV r1, #0x0
  111.         STR r1, [r0]
  112.         LDR sp, =1024*4        ;init stack
  113.         BL  main            ;call main fron main.c
  114. LOOP
  115.          B   LOOP
  116.         
  117.         END


希望大家一起讨论指正,我的程序自己都在板子上验证过,下期中断,请您静静等候!
级别: 新手上路
UID: 40545
精华: 0
发帖: 9
金钱: 45 两
威望: 9 点
贡献值: 0 点
综合积分: 18 分
注册时间: 2011-03-19
最后登录: 2011-03-26
1楼  发表于: 2011-03-26 17:00
gei li
级别: 新手上路
UID: 46086
精华: 0
发帖: 5
金钱: 25 两
威望: 5 点
贡献值: 0 点
综合积分: 10 分
注册时间: 2011-05-10
最后登录: 2011-05-10
2楼  发表于: 2011-05-10 13:45
真正彪悍的人生不需要做任何解释
级别: 侠客
UID: 31905
精华: 0
发帖: 58
金钱: 295 两
威望: 59 点
贡献值: 0 点
综合积分: 116 分
注册时间: 2010-11-07
最后登录: 2015-12-25
3楼  发表于: 2011-05-11 14:43
这个是不是在Linux下编写的程序。
又来了一次,不得不成为打渔的
级别: 新手上路
UID: 45139
精华: 0
发帖: 11
金钱: 55 两
威望: 11 点
贡献值: 0 点
综合积分: 22 分
注册时间: 2011-05-02
最后登录: 2011-06-03
4楼  发表于: 2011-05-12 20:32
ARM的初始化有这么简单么,是不是因为是裸机程序,就只设置使用到的项目?
级别: 新手上路
UID: 22064
精华: 0
发帖: 13
金钱: 70 两
威望: 14 点
贡献值: 0 点
综合积分: 26 分
注册时间: 2010-05-26
最后登录: 2013-03-04
5楼  发表于: 2011-06-22 16:11
LDR sp, =1024*4        ;init stack
请教楼主,这里我一直有疑惑,既然初始内部sram只有4k,那地址应该是0~(1024*4-1)才对,但他这里设置到1024*4,是不是不对呀!
级别: 侠客
UID: 46715
精华: 0
发帖: 54
金钱: 275 两
威望: 55 点
贡献值: 0 点
综合积分: 108 分
注册时间: 2011-05-15
最后登录: 2012-05-25
6楼  发表于: 2011-08-04 09:58
学习了
级别: 新手上路
UID: 53539
精华: 0
发帖: 14
金钱: 70 两
威望: 14 点
贡献值: 0 点
综合积分: 28 分
注册时间: 2011-08-10
最后登录: 2013-10-09
7楼  发表于: 2011-08-10 12:08
不错!
级别: 新手上路
UID: 53468
精华: 0
发帖: 6
金钱: 30 两
威望: 6 点
贡献值: 0 点
综合积分: 12 分
注册时间: 2011-08-08
最后登录: 2011-08-10
8楼  发表于: 2011-08-10 21:03
樓主你好,有些問題想問你,請問你QQ多少呢?
如果方便的話可以發我郵箱:woods2001@126.com
謝謝~