📄 1602液晶按键输入显示.lst
字号:
C51 COMPILER V7.06 1602襙____键蔩入_允_ 07/13/2010 13:32:02 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE 1602襙____键蔩入_允_
OBJECT MODULE PLACED IN .\obj\1602液晶按键输入显示.obj
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE 1602液晶按键输入显示.c BROWSE DEBUG OBJECTEXTEND PRINT(.\obj\1602液晶按键输
-入显示.lst) OBJECT(.\obj\1602液晶按键输入显示.obj)
stmt level source
1 /*-----------------------------------------------
2 名称:LCD1602
3 论坛:www.doflye.net
4 编写:shifang
5 日期:2009.5
6 修改:无
7 内容:通过矩阵键盘输入,依次显示0-F16中字符
8 引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK
9 ------------------------------------------------*/
10 #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
11 #include<intrins.h>
12
13 sbit RS = P2^4; //定义端口
14 sbit RW = P2^5;
15 sbit EN = P2^6;
16
17 #define RS_CLR RS=0
18 #define RS_SET RS=1
19
20 #define RW_CLR RW=0
21 #define RW_SET RW=1
22
23 #define EN_CLR EN=0
24 #define EN_SET EN=1
25
26 #define DataPort P0
27 #define KeyPort P1
28
29 unsigned char code dofly_code[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};//转换成
-液晶显示的字符
30 /*------------------------------------------------
31 uS延时函数,含有输入参数 unsigned char t,无返回值
32 unsigned char 是定义无符号字符变量,其值的范围是
33 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
34 长度如下 T=tx2+5 uS
35 ------------------------------------------------*/
36 void DelayUs2x(unsigned char t)
37 {
38 1 while(--t);
39 1 }
40 /*------------------------------------------------
41 mS延时函数,含有输入参数 unsigned char t,无返回值
42 unsigned char 是定义无符号字符变量,其值的范围是
43 0~255 这里使用晶振12M,精确延时请使用汇编
44 ------------------------------------------------*/
45 void DelayMs(unsigned char t)
46 {
47 1
48 1 while(t--)
49 1 {
50 2 //大致延时1mS
51 2 DelayUs2x(245);
52 2 DelayUs2x(245);
53 2 }
C51 COMPILER V7.06 1602襙____键蔩入_允_ 07/13/2010 13:32:02 PAGE 2
54 1 }
55 /*------------------------------------------------
56 判忙函数
57 ------------------------------------------------*/
58 bit LCD_Check_Busy(void)
59 {
60 1 DataPort= 0xFF;
61 1 RS_CLR;
62 1 RW_SET;
63 1 EN_CLR;
64 1 _nop_();
65 1 EN_SET;
66 1 return (bit)(DataPort & 0x80);
67 1 }
68 /*------------------------------------------------
69 写入命令函数
70 ------------------------------------------------*/
71 void LCD_Write_Com(unsigned char com)
72 {
73 1 while(LCD_Check_Busy()); //忙则等待
74 1 RS_CLR;
75 1 RW_CLR;
76 1 EN_SET;
77 1 DataPort= com;
78 1 _nop_();
79 1 EN_CLR;
80 1 }
81 /*------------------------------------------------
82 写入数据函数
83 ------------------------------------------------*/
84 void LCD_Write_Data(unsigned char Data)
85 {
86 1 while(LCD_Check_Busy()); //忙则等待
87 1 RS_SET;
88 1 RW_CLR;
89 1 EN_SET;
90 1 DataPort= Data;
91 1 _nop_();
92 1 EN_CLR;
93 1 }
94
95 /*------------------------------------------------
96 清屏函数
97 ------------------------------------------------*/
98 void LCD_Clear(void)
99 {
100 1 LCD_Write_Com(0x01);
101 1 DelayMs(5);
102 1 }
103 /*------------------------------------------------
104 写入字符串函数
105 ------------------------------------------------*/
106 void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
107 {
108 1 if (y == 0)
109 1 {
110 2 LCD_Write_Com(0x80 + x);
111 2 }
112 1 else
113 1 {
114 2 LCD_Write_Com(0xC0 + x);
115 2 }
C51 COMPILER V7.06 1602襙____键蔩入_允_ 07/13/2010 13:32:02 PAGE 3
116 1 while (*s)
117 1 {
118 2 LCD_Write_Data( *s);
119 2 s ++;
120 2 }
121 1 }
122 /*------------------------------------------------
123 写入字符函数
124 ------------------------------------------------*/
125 void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
126 {
127 1 if (y == 0)
128 1 {
129 2 LCD_Write_Com(0x80 + x);
130 2 }
131 1 else
132 1 {
133 2 LCD_Write_Com(0xC0 + x);
134 2 }
135 1 LCD_Write_Data( Data);
136 1 }
137 /*------------------------------------------------
138 初始化函数
139 ------------------------------------------------*/
140 void LCD_Init(void)
141 {
142 1 LCD_Write_Com(0x38); /*显示模式设置*/
143 1 DelayMs(5);
144 1 LCD_Write_Com(0x38);
145 1 DelayMs(5);
146 1 LCD_Write_Com(0x38);
147 1 DelayMs(5);
148 1 LCD_Write_Com(0x38);
149 1 LCD_Write_Com(0x08); /*显示关闭*/
150 1 LCD_Write_Com(0x01); /*显示清屏*/
151 1 LCD_Write_Com(0x06); /*显示光标移动设置*/
152 1 DelayMs(5);
153 1 LCD_Write_Com(0x0C); /*显示开及光标设置*/
154 1 }
155
156 /*------------------------------------------------
157 按键扫描函数,返回扫描键值
158 ------------------------------------------------*/
159 unsigned char KeyScan(void) //键盘扫描函数,使用行列反转扫描法
160 {
161 1 unsigned char cord_h,cord_l;//行列值中间变量
162 1 KeyPort=0x0f; //行线输出全为0
163 1 cord_h=KeyPort&0x0f; //读入列线值
164 1 if(cord_h!=0x0f) //先检测有无按键按下
165 1 {
166 2 DelayMs(10); //去抖
167 2 if((KeyPort&0x0f)!=0x0f)
168 2 {
169 3 cord_h=KeyPort&0x0f; //读入列线值
170 3 KeyPort=cord_h|0xf0; //输出当前列线值
171 3 cord_l=KeyPort&0xf0; //读入行线值
172 3
173 3 while((KeyPort&0xf0)!=0xf0);//等待松开并输出
174 3
175 3 return(cord_h+cord_l);//键盘最后组合码值
176 3 }
177 2 }return(0xff); //返回该值
C51 COMPILER V7.06 1602襙____键蔩入_允_ 07/13/2010 13:32:02 PAGE 4
178 1 }
179 /*------------------------------------------------
180 按键值处理函数,返回扫键值
181 ------------------------------------------------*/
182 unsigned char KeyPro(void)
183 {
184 1 switch(KeyScan())
185 1 {
186 2 case 0x7e:return 0;break;//0 按下相应的键显示相对应的码值
187 2 case 0x7d:return 1;break;//1
188 2 case 0x7b:return 2;break;//2
189 2 case 0x77:return 3;break;//3
190 2 case 0xbe:return 4;break;//4
191 2 case 0xbd:return 5;break;//5
192 2 case 0xbb:return 6;break;//6
193 2 case 0xb7:return 7;break;//7
194 2 case 0xde:return 8;break;//8
195 2 case 0xdd:return 9;break;//9
196 2 case 0xdb:return 10;break;//a
197 2 case 0xd7:return 11;break;//b
198 2 case 0xee:return 12;break;//c
199 2 case 0xed:return 13;break;//d
200 2 case 0xeb:return 14;break;//e
201 2 case 0xe7:return 15;break;//f
202 2 default:return 0xff;break;
203 2 }
204 1 }
205
206 /*------------------------------------------------
207 主函数
208 ------------------------------------------------*/
209 void main(void)
210 {
211 1 unsigned char i,j,num;
212 1
213 1 LCD_Init();
214 1 LCD_Write_Com(0x0F);//光标开,光标闪烁开
215 1
216 1 LCD_Write_String(0,0,"Press the key !");
217 1
218 1 while (1)
219 1 {
220 2 num=KeyPro();
221 2 if(num!=0xff)
222 2 {
223 3 if((i==0)&&(j==0))//回到第一个字符时清屏
224 3 LCD_Clear();//清屏
225 3 LCD_Write_Char(0+i,0+j,dofly_code[num]);//依次显示输入字符
226 3 i++;
227 3 if(i==16)//如果第一行显示满,转到第二行
228 3 {
229 4 i=0;j++;
230 4 if(j==2)//如果2行都显示满,清屏后重新从第一行显示
231 4 {
232 5 j=0;
233 5 }
234 4 }
235 3 }
236 2 }
237 1 }
238
C51 COMPILER V7.06 1602襙____键蔩入_允_ 07/13/2010 13:32:02 PAGE 5
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 430 ----
CONSTANT SIZE = 32 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 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 + -