📄 keyscan.lst
字号:
C51 COMPILER V7.09 KEYSCAN 04/25/2006 10:22:40 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE KEYSCAN
OBJECT MODULE PLACED IN KeyScan.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE KeyScan.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /******************************************************/
2 /* 文件名: KeyScan.c */
3 /* 功能描述: 控制8255完成键盘扫描及数码显示实验 */
4 /******************************************************/
5
6 #include "Absacc.h"
7
8 #define C8255_A XBYTE[0x7F00] //8255端口地址定义
9 #define C8255_B XBYTE[0x7F01]
10 #define C8255_C XBYTE[0x7F02]
11 #define C8255_CON XBYTE[0x7F03]
12 //数码管显示编码
13 unsigned char a[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
14 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
15 //显示缓冲
16 unsigned char b[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
17
18 unsigned char key_down;
19 unsigned char key_value;
20 unsigned char key_count;
21
22 void delay(unsigned int time)
23 {
24 1 unsigned int i;
25 1 for(i=0; i<time; i++);
26 1 }
27
28 void keyscan() //按键扫描函数
29 {
30 1 unsigned char cc;
31 1 C8255_A = 0x00; //X1~X4置0
32 1 cc = C8255_C; //得到Y1~Y4的值
33 1 key_down = (~cc) & 0x0f;
34 1 }
35
36 void display() //显示函数
37 {
38 1 unsigned char i, j = 0xDF;
39 1 for(i=0; i<6; i++)
40 1 {
41 2 C8255_A = 0xFF;
42 2 C8255_B = a[b[i]]; //查表输出显示
43 2 C8255_A = j;
44 2 delay(0x100);
45 2 j = (j>>1)|(j<<7);
46 2 }
47 1 }
48
49 void clear() //清屏
50 {
51 1 C8255_B = 0x00;
52 1 }
53
54 void writebuffer()
55 {
C51 COMPILER V7.09 KEYSCAN 04/25/2006 10:22:40 PAGE 2
56 1 b[key_count] = key_value;
57 1 key_count--;
58 1 if(key_count == -1)
59 1 key_count = 5;
60 1 display();
61 1 clear();
62 1 keyscan();
63 1 while(key_down) //键盘消抖
64 1 {
65 2 display();
66 2 clear();
67 2 keyscan();
68 2 }
69 1 }
70
71 void getkey() //得到按键值
72 {
73 1 unsigned char value;
74 1 unsigned char i, j = 0xFE;
75 1
76 1 for(i=0; i<4; i++)
77 1 {
78 2 C8255_A = j;
79 2 value = C8255_C;
80 2
81 2 if(!(value & 0x01)) //行1
82 2 {
83 3 key_value = i + 0;
84 3 writebuffer();
85 3 return;
86 3 }
87 2
88 2 if(!(value & 0x02)) //行2
89 2 {
90 3 key_value = i + 4;
91 3 writebuffer();
92 3 return;
93 3 }
94 2
95 2 if(!(value & 0x04)) //行3
96 2 {
97 3 key_value = i + 8;
98 3 writebuffer();
99 3 return;
100 3 }
101 2
102 2 if(!(value & 0x08)) //行4
103 2 {
104 3 key_value = i + 12;
105 3 writebuffer();
106 3 return;
107 3 }
108 2
109 2 j <<= 1;
110 2 }
111 1 }
112
113 void main()
114 {
115 1 C8255_CON = 0x81; //8255初始化
116 1
117 1 key_count = 5;
C51 COMPILER V7.09 KEYSCAN 04/25/2006 10:22:40 PAGE 3
118 1
119 1 while(1)
120 1 {
121 2 display(); //显示
122 2 clear(); //清屏
123 2 keyscan(); //按键扫描
124 2 if(key_down) //判是否有键按下
125 2 {
126 3 display();
127 3 delay(0x80);
128 3 clear();
129 3 keyscan();
130 3 if(key_down)
131 3 {
132 4 getkey(); //得到按键值
133 4 }
134 3 }
135 2 }
136 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 238 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 25 2
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 + -