📄 key2.lst
字号:
C51 COMPILER V8.02 KEY2 08/21/2008 17:43:54 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE KEY2
OBJECT MODULE PLACED IN key2.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE key2.c OPTIMIZE(6,SPEED) BROWSE DEBUG OBJECTEXTEND
line level source
1 /*********************************************************************************************/
2 /*公司名称:四川大学制造学院*/
3 /*模 块 名:键盘调试程序*/
4 /*创 建 人:陈朝泽 日期:2008年8月20日*/
5 /*功能描述:*/
6 /*其他说明:1、当操作P4-P7口时,请别忘了用SFRPAGE寄存器设置为F页。
7 2、行线为输入,列线为输出。逐列输出低电平,检测输入口电平情况。
8 只要P2口高4位不全为1,则该列有键按下。
9 3、横线输入P2经过74LS14N反相后进入MCU,端口为高,则MCU处低;
10 列线输出端P7从MCU出来后经过74LS14N和ULN2003两次反相,端口处电平状态与MCU处一致。*/
11 /*********************************************************************************************/
12 #include "C8051F120.h"
13 #define uchar unsigned char
14 //#include <intrins.h> //added
15
16 #define KEYP_H P2 //定义 P2口(高4位)为4×6矩阵键盘的行线输入(通过上拉电阻接+24V)
17 #define KEYP_L P7 //定义 P7口(低6位)为4×6矩阵键盘的列线输出
18
19 sbit led1=P5^0; //测试用
20 sbit led2=P5^1;
21 sbit led3=P5^2;
22 sbit led4=P5^3;
23 sbit led5=P5^4;
24 sbit led6=P5^5;
25 sbit led7=P5^6;
26 sbit led8=P5^7;
27
28 uchar key;
29
30 void Reset_Sources_Init()
31 {
32 1 WDTCN = 0xDE;
33 1 WDTCN = 0xAD;
34 1 }
35
36 void Port_IO_Init()
37 {
38 1 SFRPAGE = CONFIG_PAGE;
39 1 P3MDOUT = 0xFF;
40 1 P4MDOUT = 0xFF;
41 1 P5MDOUT = 0xFF;
42 1 P6MDOUT = 0xFF;
43 1 P7MDOUT = 0xFF;
44 1 XBR0 = 0x04;
45 1 XBR2 = 0x44;
46 1 }
47
48 void Oscillator_Init()
49 {
50 1 int i = 0;
51 1 SFRPAGE = CONFIG_PAGE;
52 1 OSCXCN = 0x67;
53 1 for (i = 0; i < 3000; i++); // Wait 5ms for initialization
54 1 while ((OSCXCN & 0x80) == 0);
55 1 CLKSEL = 0x01;
C51 COMPILER V8.02 KEY2 08/21/2008 17:43:54 PAGE 2
56 1 }
57 void Init_Device(void)
58 {
59 1 Reset_Sources_Init();
60 1 Port_IO_Init();
61 1 Oscillator_Init();
62 1 }
63
64 void delay(long t)
65 {
66 1 for(;t>=0;t--);
67 1 }
68
69 uchar keyscan(void)
70 {
71 1 uchar scancode,tmpcode,mcode;
72 1 P7 = 0x00; //P7口发全0列扫描码
73 1 delay(300);
74 1 mcode = P2;
75 1 if((mcode&0xF0) != 0x00) //若有键按下
76 1 {
77 2 delay(3000);
78 2 mcode = P2; //延时去抖动
79 2 if((mcode&0xF0) != 0x00) //延时后再判断一次
80 2 {
81 3 scancode = 0xFE;
82 3 while (scancode != 0xFF) //逐列扫描
83 3 {
84 4 P7 = scancode; //输出列扫描码11111110,将之取反,高位为按键所在列
85 4 delay(300);
86 4 mcode = P2;
87 4 if(((mcode&0xF0) != 0x00)) //本列有键按下
88 4 {
89 5 //P5 = 0x00; //测试用
90 5 tmpcode = mcode&0xF0; //检测哪行的电平被拉低,为1的那1行有键按下
91 5 /*
92 5 while (1) //松手检测
93 5 {
94 5 mcode = P2;
95 5 if((mcode&0xF0) == 0x00)
96 5 break;
97 5 }
98 5 */
99 5 if(scancode==0xDF&&tmpcode==0x10)
100 5 return 0x31;
101 5 else
102 5 return ((~scancode) + tmpcode); //返回特征值
103 5
104 5 }
105 4 else
106 4 {
107 5 scancode = (scancode<<1)|0x01; //向高位移动
108 5 //else scancode = _crol_(scancode,1);
109 5 }
110 4 }
111 3 }
112 2 }
113 1 return 0;
114 1 }
115
116 void main()
117 {
C51 COMPILER V8.02 KEY2 08/21/2008 17:43:54 PAGE 3
118 1 Init_Device();
119 1 //uchar key;
120 1 while(1)
121 1 {
122 2 key = keyscan();
123 2 switch(key)
124 2 {
125 3 case 0x11:
126 3 led7 = 0;
127 3 break;
128 3 case 0x21:
129 3 led8 = 0;
130 3 break;
131 3 case 0x41:
132 3 led3 = 0;
133 3 break;
134 3 case 0x81:
135 3 led4 = 0;
136 3 break;
137 3 default:
138 3 led7 = 1;
139 3 }
140 2 }
141 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 276 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 6
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 + -