📄 矩阵键盘lcd.lst
字号:
C51 COMPILER V7.50 __阵键盘LCD 09/11/2011 16:39:17 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE __阵键盘LCD
OBJECT MODULE PLACED IN 矩阵键盘LCD.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 矩阵键盘LCD.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /********************************************************************
2 * 文件名 : 矩阵键盘LCD.c
3 * 描述 : 该文件实现了 4 * 4 键盘的试验。通过1602液晶来显示当前的按键值。
4 * 创建人 : 东流,2009年4月10日
5 * 版本号 : 2.0
6 *********************************************************************/
7 #include<reg51.h>
8 #include<intrins.h>
9
10 #define uint unsigned int
11 #define uchar unsigned char
12
13 uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};
14
15 //这三个引脚参考资料
16 sbit E=P2^7; //1602使能引脚
17 sbit RW=P2^6; //1602读写引脚
18 sbit RS=P2^5; //1602数据/命令选择引脚
19
20
21 /********************************************************************
22 * 名称 : Delay_1ms()
23 * 功能 : 延时子程序,延时时间为 1ms * x
24 * 输入 : x (延时一毫秒的个数)
25 * 输出 : 无
26 ***********************************************************************/
27 void Delay_1ms(uint i)//1ms延时
28 {
29 1 uchar x,j;
30 1 for(j=0;j<i;j++)
31 1 for(x=0;x<=148;x++);
32 1 }
33
34 /********************************************************************
35 * 名称 : delay()
36 * 功能 : 延时,延时时间大概为5US。
37 * 输入 : 无
38 * 输出 : 无
39 ***********************************************************************/
40
41 void delay()
42 {
43 1 _nop_();
44 1 _nop_();
45 1 _nop_();
46 1 _nop_();
47 1 _nop_();
48 1 }
49 /********************************************************************
50 * 名称 : bit Busy(void)
51 * 功能 : 这个是一个读状态函数,读出函数是否处在忙状态
52 * 输入 : 输入的命令值
53 * 输出 : 无
54 ***********************************************************************/
55 bit Busy(void)
C51 COMPILER V7.50 __阵键盘LCD 09/11/2011 16:39:17 PAGE 2
56 {
57 1 bit busy_flag = 0;
58 1 RS = 0;
59 1 RW = 1;
60 1 E = 1;
61 1 delay();
62 1 busy_flag = (bit)(P0 & 0x80);
63 1 E = 0;
64 1 return busy_flag;
65 1 }
66 /********************************************************************
67 * 名称 : wcmd(uchar del)
68 * 功能 : 1602命令函数
69 * 输入 : 输入的命令值
70 * 输出 : 无
71 ***********************************************************************/
72 void wcmd(uchar del)
73 {
74 1 while(Busy());
75 1 RS = 0;
76 1 RW = 0;
77 1 E = 0;
78 1 delay();
79 1 P0 = del;
80 1 delay();
81 1 E = 1;
82 1 delay();
83 1 E = 0;
84 1 }
85
86 /********************************************************************
87 * 名称 : wdata(uchar del)
88 * 功能 : 1602写数据函数
89 * 输入 : 需要写入1602的数据
90 * 输出 : 无
91 ***********************************************************************/
92
93 void wdata(uchar del)
94 {
95 1 while(Busy());
96 1 RS = 1;
97 1 RW = 0;
98 1 E = 0;
99 1 delay();
100 1 P0 = del;
101 1 delay();
102 1 E = 1;
103 1 delay();
104 1 E = 0;
105 1 }
106
107 /********************************************************************
108 * 名称 : L1602_init()
109 * 功能 : 1602初始化,请参考1602的资料
110 * 输入 : 无
111 * 输出 : 无
112 ***********************************************************************/
113 void L1602_init(void)
114 {
115 1 wcmd(0x38);
116 1 wcmd(0x0c);
117 1 wcmd(0x06);
C51 COMPILER V7.50 __阵键盘LCD 09/11/2011 16:39:17 PAGE 3
118 1 wcmd(0x01);
119 1 }
120
121 /********************************************************************
122 * 名称 : L1602_char(uchar hang,uchar lie,char sign)
123 * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
124 L1602_char(1,5,'b')
125 * 输入 : 行,列,需要输入1602的数据
126 * 输出 : 无
127 ***********************************************************************/
128 void L1602_char(uchar hang,uchar lie,char sign)
129 {
130 1 uchar a;
131 1 if(hang == 1) a = 0x80;
132 1 if(hang == 2) a = 0xc0;
133 1 a = a + lie - 1;
134 1 wcmd(a);
135 1 wdata(sign);
136 1 }
137
138 /********************************************************************
139 * 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
140 * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
141 L1602_string(1,5,"ab cd ef;")
142 * 输入 : 行,列,需要输入1602的数据
143 * 输出 : 无
144 ***********************************************************************/
145 void L1602_string(uchar hang,uchar lie,uchar *p)
146 {
147 1 uchar a,b=0;
148 1 if(hang == 1) a = 0x80;
149 1 if(hang == 2) a = 0xc0;
150 1 a = a + lie - 1;
151 1 while(1)
152 1 {
153 2 wcmd(a++);
154 2 b++;
155 2 if((*p == '\0')||(b==16)) break;
156 2 wdata(*p);
157 2 p++;
158 2 }
159 1 }
160
161 /********************************************************************
162 * 名称 : Keyscan()
163 * 功能 : 实现按键的读取。下面这个子程序是按处理 矩阵键盘 的基本方法处理的。
164 * 输入 : 无
165 * 输出 : 按键值
166 ***********************************************************************/
167 uchar Keyscan(void)
168 {
169 1 uchar i,j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7};
170 1 for(j=0; j<4; j++)
171 1 {
172 2 P1 = Buffer[j];
173 2 temp = 0x10;
-
174 2 for(i=0; i<4; i++)
175 2 {
176 3 if(!(P1 & temp))
177 3 {
178 4 return (i+j*4);
C51 COMPILER V7.50 __阵键盘LCD 09/11/2011 16:39:17 PAGE 4
179 4 }
180 3 temp <<= 1;
181 3 }
182 2 }
183 1 }
184
185 /********************************************************************
186 * 名称 : Main()
187 * 功能 : 主函数
188 * 输入 : 无
189 * 输出 : 无
190 ***********************************************************************/
191 void Main(void)
192 {
193 1 uchar Key_Value; //读出的键值
194 1 L1602_init();
195 1 L1602_string(1,1," 4*4 KeyBoard ");
196 1 L1602_string(2,1,"You Press The ");
197 1 while(1)
198 1 {
199 2 P1 = 0xf0;
200 2 if(P1 != 0xf0)
201 2 {
202 3 Delay_1ms(20); //按键消抖
203 3 if(P1 != 0xf0)
204 3 {
205 4 Delay_1ms(20); //按键消抖
206 4 if(P1 != 0xf0)
207 4 {
208 5 Key_Value = Keyscan();
209 5 }
210 4 }
211 3 }
212 2 L1602_char(2,15,Key_Value / 10 + 48);
213 2 L1602_char(2,16,Key_Value % 10 + 48);
214 2 }
215 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 335 ----
CONSTANT SIZE = 49 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 5
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -