📄 keys.lst
字号:
ARM COMPILER V2.50a, KEYS 25/08/06 23:22:56 PAGE 1
ARM COMPILER V2.50a, COMPILATION OF MODULE KEYS
OBJECT MODULE PLACED IN KEYS.OBJ
COMPILER INVOKED BY: C:\Keil\ARM\BIN\CA.exe KEYS.C THUMB DEBUG TABS(4)
stmt level source
1 /**********************************************************************************************
2 KEYS.c file
3
4 按键处理程序
5
6 作者:Computer-lov
7 建立日期:2006-4-11
8 修改日期:2006-5-12
9 最后修改时间:2006-08-25
10 版本:V1.0
11 版权所有,盗版必究。
12 任何技术问题可到我的博客上留言: http://computer00.21ic.org
13 Copyright(C) Computer-lov 2006-2016
14 All rights reserved
15 **********************************************************************************************/
16
17
18 #include "CPU.H"
19
20 #include "KEYS.h"
21
22 KEYBoard Key; //定义一个Key结构体。
23
24 /*********************************************************************************************/
25 void KEYBoardInit(void)
26 {
27 1 PINSEL1 &= ~0xFFF; //将按键对对应的IO口设置为GPIO口. P0.16--P0.21
28 1
29 1 IO0DIR &= ~0x001F0000; //将按键对应的IO设置为输入口
30 1
31 1 Key.Value=0; //Key初始化
32 1 Key.OldValue=0;
33 1 Key.NewValue=0;
34 1 Key.PressedTime=0;
35 1 }
36 ///////////////////////////////////////////////////////////////////////////////////////////////
37
38 /**********************************************************************************************
39 功能:延时x毫秒。
40 入口参数:x。要延时的毫秒数。
41 返回:无。
42 备注:纯软件延时,不同的指令执行速度,运行结果会不一样。
43 **********************************************************************************************/
44 void DelayXms(uint32 x)
45 {
46 1 uint32 i;
47 1 while(x--)
48 1 {
49 2 i=9000;
50 2 while(i--);
51 2 }
52 1 }
53 ///////////////////////////////////////////////////////////////////////////////////////////////
54
55
56 /**********************************************************************************************
57 功能:键盘扫描程序。
58 入口参数:无。
59 返回:无。
ARM COMPILER V2.50a, KEYS 25/08/06 23:22:56 PAGE 2
60 备注:按键相关信息保存在Key中。请参看KEYBoard结构体。
61 **********************************************************************************************/
62 void ScanKey(void) //键盘扫描
63 {
64 1 if(Key.Value)return; //如果上次按键还未处理,则直接返回,不扫描新的按键
65 1
66 1 if(KEY1IN && KEY2IN && KEY3IN && KEY4IN && KEY5IN && KEY6IN) //如果输入全部是高,则按键处于释放状态
67 1 {
68 2 if(!(Key.OldValue)) //如果上次无按键按下
69 2 {
70 3 return; //返回
71 3 }
72 2 else //如果上次有按键按下
73 2 {
74 3 if(Key.PressedTime>100) //按键时间超过一秒,长按键码
75 3 {
76 4 Key.Value=Key.OldValue+0x80; //长按键码等于普通按键码加0x80
77 4 }
78 3 else if(Key.PressedTime>1)
79 3 {
80 4 Key.Value=Key.OldValue; //按键值
81 4 }
82 3 Key.OldValue=0;
83 3 }
84 2 return;
85 2 }
86 1 else //按键按下
87 1 {
88 2 Key.NewValue=0;
89 2 if(!KEY1IN)Key.NewValue=KEY1; //KEY1键按下
90 2 if(!KEY2IN)Key.NewValue=KEY2; //KEY2键按下
91 2 if(!KEY3IN)Key.NewValue=KEY3; //KEY3键按下
92 2 if(!KEY4IN)Key.NewValue=KEY4; //KEY4键按下
93 2 if(!KEY5IN)Key.NewValue=KEY5; //KEY5键按下
94 2 if(!KEY6IN)Key.NewValue=KEY6; //KEY6键按下
95 2
96 2 if(Key.NewValue==Key.OldValue) //如果连续两次扫描到一样的键,即按键按下长于10ms
97 2 {
98 3 if(Key.PressedTime>200) //如果按键按下超过2s
99 3 {
100 4 Key.PressedTime-=4; //则自动按键。相当于每隔50ms按一次
101 4 Key.Value=Key.NewValue;
102 4 return;
103 4 }
104 3 else
105 3 {
106 4 Key.PressedTime++; //按键按下计时加一
107 4 }
108 3 }
109 2 else
110 2 {
111 3 Key.PressedTime=0; //如果本次按下跟上次按下不一样,则按键按下时间清零
112 3 }
113 2 Key.OldValue=Key.NewValue; //保存本次按键值
114 2 }
115 1 }
116 ///////////////////////////////////////////////////////////////////////////////////////////////
117
ARM COMPILER V2.50a, KEYS 25/08/06 23:22:56 PAGE 3
ASSEMBLY LISTING OF GENERATED OBJECT CODE
*** PUBLICS:
PUBLIC ScanKey?T
PUBLIC KEYBoardInit?T
PUBLIC DelayXms?T
PUBLIC Key
*** DATA SEGMENT '?DT0?KEYS':
00000000 Key:
00000000 DS 16
*** CODE SEGMENT '?PR?KEYBoardInit?T?KEYS':
27: PINSEL1 &= ~0xFFF; //将按键对对应的IO口设置为GPIO口. P0.16--P0.21
00000000 4800 LDR R2,=0xFFFFF000
00000002 4800 LDR R0,=0xE002C004
00000004 6801 LDR R1,[R0,#0x0]
00000006 4011 AND R1,R2
00000008 6001 STR R1,[R0,#0x0]
29: IO0DIR &= ~0x001F0000; //将按键对应的IO设置为输入口
0000000A 4800 LDR R2,=0x1F0000
0000000C 4800 LDR R0,=0xE0028008
0000000E 6801 LDR R1,[R0,#0x0]
00000010 4391 BIC R1,R2
00000012 6001 STR R1,[R0,#0x0]
31: Key.Value=0; //Key初始化
00000014 2100 MOV R1,#0x0
00000016 4800 LDR R0,=Key ; Key
00000018 6001 STR R1,[R0,#0x0] ; Key
32: Key.OldValue=0;
0000001A 4800 LDR R0,=Key + 0x4 ; Key+4
0000001C 6001 STR R1,[R0,#0x0] ; Key+4
33: Key.NewValue=0;
0000001E 4800 LDR R0,=Key + 0x8 ; Key+8
00000020 6001 STR R1,[R0,#0x0] ; Key+8
34: Key.PressedTime=0;
00000022 4800 LDR R0,=Key + 0xC ; Key+12
00000024 6001 STR R1,[R0,#0x0] ; Key+12
35: }
00000026 4770 BX R14
00000028 ENDP ; 'KEYBoardInit?T'
*** CODE SEGMENT '?PR?DelayXms?T?KEYS':
44: void DelayXms(uint32 x)
00000000 ---- Variable 'x' assigned to Register 'R0' ----
45: {
00000000 ; SCOPE-START
47: while(x--)
00000000 E004 B L_1 ; T=0x0000000C
00000002 L_3:
49: i=9000;
00000002 4800 LDR R1,=0x2328
00000004 ---- Variable 'i' assigned to Register 'R1' ----
50: while(i--);
00000004 L_5:
00000004 1C0A MOV R2,R1 ; i
00000006 3901 SUB R1,#0x1
00000008 2A00 CMP R2,#0x0 ; i
0000000A D1FB BNE L_5 ; T=0x00000004
51: }
0000000C L_1:
0000000C 1C01 MOV R1,R0 ; x
0000000E 3801 SUB R0,#0x1
00000010 2900 CMP R1,#0x0 ; x
00000012 D1F6 BNE L_3 ; T=0x00000002
00000014 ; SCOPE-END
ARM COMPILER V2.50a, KEYS 25/08/06 23:22:56 PAGE 4
52: }
00000014 4770 BX R14
00000016 ENDP ; 'DelayXms?T'
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -