📄 keyboard.lst
字号:
C51 COMPILER V7.06 KEYBOARD 03/02/2005 16:07:52 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE KEYBOARD
OBJECT MODULE PLACED IN keyboard.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE keyboard.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*******************************************************
2 * LPC932 Keyboard Interrupt demo program
3 * Sends the pressed key via UART at 19200kbps.
4 * Internal RC oscillator is used (7.3728MHz).
5 *******************************************************/
6 #include <reg932.h>
7 #include <intrins.h>
8
9 #define nop _nop_()
10 extern void ua_outchar(char c);
11 extern void UART_Init(void);
12 extern void PrintString(char *s);
13 char key_tbl[2][8] = {
14 {'1' ,'A' ,'6' ,'9' ,'7' ,'8' ,'4' ,'5' }, // row 0
15 {'2' ,'0' ,'E' ,'D' ,'B' ,'C' ,'3' ,'F' } // row 1
16 };
17 char startup[] = "LPC9xx Keyboard application\n\r";
18 char press[] = " pressed\n\r";
19 char release[] = " released\n\r";
20 static unsigned char key,col,row,byte_read;
21 static bit flag = 0;
22 static bit rel = 0;
23 static bit valid_key = 0;
24 sbit rol1=P2^2;
25 sbit rol2=P2^3;
26 static void KEYB_Init(void)
27 {
28 1 // P0 (keypad columns) setting
29 1 P0M1 = 0x00; // P0 is bidirectional
30 1 P0 = 0xFF;
31 1 // P2 (keypad rows) setting
32 1 P2M1 &= 0xF3; // P2_2 and P2_3 are push pull
33 1 P2M2 |= 0x0C;
34 1 rol1=1;
35 1 rol2=1;
36 1 KBMASK = 0xFF; // to generate an interrupt, P0
37 1 KBPATN = 0xFF; // should be NOT equal to the
38 1 // value from KBPATN(0xFF)
39 1 EKBI = 1; // enable keyboard interrupt
40 1 TL1 = 0; // Timer1 used to generate a de
41 1 // bounce delay of 17.7ms
42 1 TH1 = 0;
43 1 TMOD = 0x10; // Timer 1 mode 1, 16 bit timer
44 1 ET1 = 1; // enable Timer 1 interrupt
45 1 }
46 static void DefineColumn(void)
47 {
48 1 valid_key = 1;
49 1 switch (byte_read)
50 1 {
51 2 case 0xFE: col = 0; break;
52 2 case 0xFD: col = 1; break;
53 2 case 0xFB: col = 2; break;
54 2 case 0xF7: col = 3; break;
55 2 case 0xEF: col = 4; break;
C51 COMPILER V7.06 KEYBOARD 03/02/2005 16:07:52 PAGE 2
56 2 case 0xDF: col = 5; break;
57 2 case 0xBF: col = 6; break;
58 2 case 0x7F: col = 7; break;
59 2 default: valid_key = 0; break;
60 2 }
61 1 }
62 static void DefineRow(void)
63 {
64 1 rol2 = 1;
65 1 if (P0 != 0xFF)
66 1 {
67 2 rol2 = 0;
68 2 row = 0;
69 2 }
70 1 else
71 1 {
72 2 rol2 = 0;
73 2 row = 1;
74 2 }
75 1 }
76 void Timer1_interrupt(void) interrupt 3
77 {
78 1 TR1 = 0; // stop timer
79 1 byte_read = P0; // save value of port 0
80 1 if (byte_read != 0xFF) // If P0 |= FF, means
81 1 { // that a key was pressed
82 2 // if not, key release
83 2 KBCON |= 2; // PATN_SEL = 1, next KB
84 2 // int on P0 = 0xFF
85 2 DefineRow();
86 2 DefineColumn();
87 2 if (valid_key)
88 2 {
89 3 key = key_tbl[row][col];
90 3 flag = 1;
91 3 }
92 2 }
93 1 else
94 1 {
95 2 if (valid_key)
96 2 {
97 3 rel = 1;
98 3 flag = 1;
99 3 }
100 2 KBCON &= 0xFD; // PATN_SEL = 0, next inter
101 2 // rupt if P0 != 0xFF
102 2 }
103 1 KBCON &= 0xFE; // reset keyb interrupt flag
104 1 EKBI = 1;
105 1 }
106 void Keyboard_Interrupt(void) interrupt 7
107 {
108 1 EKBI = 0; // disable int.
109 1 TR1 = 1; // start timer1
110 1 }
111 void main(void)
112 {
113 1 TRIM = 0x30;
114 1 KEYB_Init(); // initialise keyboard hardware
115 1 UART_Init(); // initialise on-chip UART
116 1 EA = 1; // enable interrupts
117 1 PrintString(startup);
C51 COMPILER V7.06 KEYBOARD 03/02/2005 16:07:52 PAGE 3
118 1 rol1 = 0; // row 0 low
119 1 rol2 = 0; // row 1 low
120 1 PCON |= 2; // get into power down mode
121 1 nop;
122 1 nop;
123 1 while(1) // endless loop
124 1 {
125 2 if (flag)
126 2 {
127 3 if (!rel)
128 3 {
129 4 ua_outchar(key);
130 4 PrintString(press);
131 4 }
132 3 else
133 3 {
134 4 rel = 0;
135 4 ua_outchar(key);
136 4 PrintString(release);
137 4 }
138 3 flag = 0;
139 3 PCON |= 2; // go into power down mode
140 3 nop;
141 3 nop;
142 3 }
143 2 }
144 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 276 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 73 ----
IDATA SIZE = ---- ----
BIT SIZE = 3 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -