📄 key.lst
字号:
C51 COMPILER V8.02 KEY 10/20/2008 13:54:42 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE KEY
OBJECT MODULE PLACED IN .\KEY.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\KEY\KEY.c LARGE BROWSE DEBUG OBJECTEXTEND PRINT(.\KEY.lst) OBJECT(.\KEY.
-obj)
line level source
1 /********************************************************************************/
2 /* filename : KEY.c */
3 /* created : xillinx */
4 /* descript : 处理与键盘扫描相关的函数 */
5 /********************************************************************************/
6 #include "../CPU/CPU.h"
7 #include "../CFG/CFG.h"
8 #include "../UART/UART.h"
9 #include "../KEY/KEY.h"
10
11 key_put_on_hook key_put_on_proc=c51_key_put_on_null;
12 key_off_hook key_off_proc=c51_key_off_null;
13
14 /********************************************************************************/
15 /* fun_name : c51_key_put_on_null() */
16 /* version : v1.00 */
17 /* created : xillinx */
18 /********************************************************************************/
19 void c51_key_put_on_null(unsigned char key_val)
20 { key_val=key_val;
21 1 }
22
23 /********************************************************************************/
24 /* fun_name : c51_key_off_null() */
25 /* version : v1.00 */
26 /* created : xillinx */
27 /********************************************************************************/
28 void c51_key_off_null(void)
29 { ;
30 1 }
31
32 /********************************************************************************/
33 /* 键盘是4X4的行列扫描,键盘扫描的输出是U7<74HC573>的低四位,输入端是U12<74HC245> */
34 /* 的低四位,所以建立一个表 */
35 /********************************************************************************/
36 volatile unsigned char KEY_scan_timer=0x0;
37
38 /********************************************************************************/
39 /* 键值查找表 */
40 /********************************************************************************/
41 unsigned char code key_table[KEY_LINE_MAX][KEY_ROW_MAX]=
42 { { '1', '2', '3', 'A'},
43 { '4', '4', '6', 'B'},
44 { '7', '8', '9', 'C'},
45 { '*', '0', '#', 'D'}
46 };
47
48 unsigned char code key_line_table[]={0xE,0xD,0xB,0x7}; //* 对应的行数据
49
50 /********************************************************************************/
51 /* fun_name : c51_key_write() */
52 /* version : v1.00 */
53 /* created : hw-chen */
54 /* descript : 向KEY的锁存器里面写入低四位控制KEY的扫描 */
C51 COMPILER V8.02 KEY 10/20/2008 13:54:42 PAGE 2
55 /********************************************************************************/
56 void c51_key_write(unsigned char mdata)
57 { c51_U07_latch&=0xF0;
58 1 c51_U07_latch|=(mdata&0xF);
59 1 c51_hc138_cs_keyw[0x0]=c51_U07_latch;
60 1 }
61
62 /********************************************************************************/
63 /* fun_name : c51_key_read_lo() */
64 /* version : v1.00 */
65 /* created : hw-chen */
66 /* descript : 出KEY的缓冲区读出KEY的低四位作为键盘扫描 */
67 /********************************************************************************/
68 unsigned char c51_key_read_lo(void)
69 { return (c51_hc138_cs_keyr[0x0]&0x0F);
70 1 }
71
72
73 /********************************************************************************/
74 /* fun_name : c51_key_read_hi() */
75 /* version : v1.00 */
76 /* created : hw-chen */
77 /* descript : 出KEY的缓冲区读出KEY的高四位作为键盘扫描 */
78 /********************************************************************************/
79 unsigned char c51_key_read_hi(void)
80 { return (c51_hc138_cs_keyr[0x0]&0xF0);
81 1 }
82
83 /********************************************************************************/
84 /* fun_name : c51_key_scan_operate() */
85 /* version : v1.00 */
86 /* created : hw-chen */
87 /* descript : 键盘扫描操作,先把写的行变成低电平,如果有键按下,那么读取的列就会 */
88 /* 变成低电平 */
89 /********************************************************************************/
90 unsigned char c51_key_scan_operate(void)
91 { unsigned char mdata,find=0x0;
92 1 unsigned char i,j;
93 1 unsigned char pos;
94 1
95 1 /****************************************************************************/
96 1 /* 先把所有的行输出都变成低电平,检查是否有按键按下,如果有就检查是那一行的 */
97 1 /* 那一列按下的,否则直接返回 */
98 1 /****************************************************************************/
99 1 c51_key_write(0x0);
100 1 mdata=c51_key_read_lo();
101 1 if (mdata==0xF) //* 没有任何按键按下
102 1 { return 0x0;
103 2 }
104 1
105 1 /****************************************************************************/
106 1 /* 先让行输出低电平,然后读取列数据,如果列数据不为0xF<四列>,就有一列键被按下 */
107 1 /* 根据前面的行编号和现在的列编号就可以确定被按下的键 */
108 1 /****************************************************************************/
109 1 for(i=0x0;i<KEY_LINE_MAX;i++)
110 1 { c51_key_write(key_line_table[i]); //* 每一行扫描
111 2 mdata=c51_key_read_lo();
112 2 if( mdata==0xF)
113 2 { continue;
114 3 }
115 2 pos=0x1;
116 2 for(j=0x0;j<KEY_ROW_MAX;j++)
C51 COMPILER V8.02 KEY 10/20/2008 13:54:42 PAGE 3
117 2 { if((mdata&pos)==0x0)
118 3 { break;
119 4 }
120 3 pos<<=0x1;
121 3 }
122 2 if(j>=KEY_ROW_MAX)
123 2 { return 0x0; //* 这儿不可能发生
124 3 }
125 2 else
126 2 { find=0x1;
127 3 break;
128 3 }
129 2 }
130 1 if( find==0x0)
131 1 { return 0x0;
132 2 }
133 1 else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -