📄 keyboard.lst
字号:
C51 COMPILER V8.05a KEYBOARD 10/11/2008 10:55:50 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE KEYBOARD
OBJECT MODULE PLACED IN keyboard.OBJ
COMPILER INVOKED BY: F:\Keil C51 V8\C51\BIN\C51.EXE keyboard.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg51.h>
2
3 #define CHECK_KEY_DOWN 0 //处在检测按键压下阶段标志
4 #define CHECK_KEY_UP 1 //处在检测按键抬起阶段标志
5 #define KEY_UP 0 //按键抬起标志
6 #define KEY_DOWN 1 //按键压下标志
7
8 sbit _p33 = P3^3;
9 sbit _p34 = P3^4;
10 sbit _p35 = P3^5;
11 sbit _p36 = P3^6;
12
13 char data_out;
14 char _key_status = CHECK_KEY_DOWN; //按键检测状态(初值为检测压下阶段)
15 char _key_idx = 0; //按键序号
16
17 void _delay_1ns() {
18 1 }
19
20 void _p34_plus() { //发生移位脉冲,SH_CP
21 1 _p34 = 0;
22 1 _delay_1ns();
23 1 _p34 = 1;
24 1 _delay_1ns();
25 1 _p34 = 0;
26 1 }
27
28 void _p35_plus() { //发生锁存脉冲,ST_CP
29 1 _p35 = 0;
30 1 _delay_1ns();
31 1 _p35 = 1;
32 1 _delay_1ns();
33 1 _p35 = 0;
34 1 }
35
36 void serial_output(unsigned char out) { //通过595串行输出数据
37 1 char i = 0;
38 1 for (i = 7; i >= 0 ; i--) {
39 2 _p33 = (out >> i)& 0x01; //将数据移到最低位后由P33送出,DS信号
40 2 _p34_plus();
41 2 }
42 1 _p35_plus();
43 1 }
44
45 char _check_key(unsigned char _key_idx) { //检查按键状态
46 1
47 1 serial_output((~(0x01<<_key_idx))&0x0f); //将待查按键键码转换成扫描码后输出
48 1 if (_p36 == 0) { //根据P36状态决定返回值
49 2 return KEY_DOWN;
50 2 } else {
51 2 return KEY_UP;
52 2 }
53 1 }
54
55 char get_key(void) { //获取键值
C51 COMPILER V8.05a KEYBOARD 10/11/2008 10:55:50 PAGE 2
56 1 char result = -1; //无键按下时键值为-1
57 1 if (_key_status == CHECK_KEY_DOWN) { //如果当前处于检查压下阶段,进行以下操作
58 2 if (_check_key(_key_idx) == KEY_DOWN) { //判断当前扫描键的状态,若为压下标志则
59 3 _key_status = CHECK_KEY_UP; //将检查阶段标志设置为抬起
60 3 } else { //否则,将检查阶段标志设置为压下
61 3 _key_status = CHECK_KEY_DOWN;
62 3 _key_idx++; //判断是否4个按键已经轮流扫描一遍
63 3 if (_key_idx == 4) {
64 4 _key_idx = 0; //是,则将待扫描按键号设为0
65 4 }
66 3 }
67 2 } else if (_key_status == CHECK_KEY_UP) { //如果当前处于检查抬起阶段,进行以下操作
68 2 if (_check_key(_key_idx) == KEY_UP) { //判断当前扫描键的状态,若为抬起标志则
69 3 result = _key_idx; //键值输出
70 3 _key_status = CHECK_KEY_DOWN; //按键检查阶段标志改为压下
71 3 if (++_key_idx == 4) { //判断是否4个按键已经轮流扫描一遍
72 4 _key_idx = 0; //是,则将待扫描按键号设为0
73 4 }
74 3 } else {
75 3 _key_status = CHECK_KEY_UP;
76 3 }
77 2 }
78 1 return result;
79 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 150 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 3 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -