📄 text1.lst
字号:
C51 COMPILER V7.20 TEXT1 07/24/2007 21:33:14 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE TEXT1
OBJECT MODULE PLACED IN Text1.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE Text1.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg51.h>
2 #include<intrins.h>
3 #define uint unsigned int
4 #define uchar unsigned char
5 #define ulong unsigned long
6 //数据口定义
7 #define lcd1602_bus P3
8 #define data P1 //the data interface between 51 and DDS(ad9850)
9 sbit W_CLK= P2^1;
10 sbit PQ_UD= P2^2;
11
12
13 //引脚定义
14 sbit rs_1602=P2^5;
15 sbit rw_1602=P2^6;
16 sbit e_1602=P2^7;
17 sbit alarm=P0^0;
18
19
20 /*********延时子程序**********/
21 void delay_1ms(uint t)
22 {
23 1 uint i,j;
24 1 for(i=0;i<t;i++)
25 1 for(j=0;j<120;j++);
26 1 }
27
28 void delay(uchar t)
29 {
30 1 uchar i;
31 1 while(t--)
32 1 {
33 2 /* 对于11.0592M时钟,约延时1ms */
34 2 for (i=0;i<125;i++)
35 2 {}
36 2 }
37 1 }
38
39
40
41
42
43
44
45 /***********忙判断标志,返回一个位BF********************/
46 bit lcd1602_busy(void)
47 {
48 1 uchar busy_flag;
49 1 rs_1602=0;
50 1 rw_1602=1;
51 1 _nop_();
52 1 e_1602=1;
53 1 _nop_();
54 1 lcd1602_bus=0xff;
55 1 busy_flag=lcd1602_bus; //e在高电平时读
C51 COMPILER V7.20 TEXT1 07/24/2007 21:33:14 PAGE 2
56 1 e_1602=0;
57 1 return (bit)(busy_flag&0x80); //BF=1; BUSY 返回一个位
58 1 }
59
60
61 /********写命令,有两个参数,一个是要写的命令控制字,
62 第二个是用来控制是否进行忙标志的判断。
63 busyflag=1;
64 判断: 为0
65 ***************/
66 void lcd1602_wrcmd(unsigned char lcdcmd)
67 {
68 1 while(lcd1602_busy()); //等待空闲
69 1 lcd1602_bus=lcdcmd;
70 1 rs_1602=0;
71 1 rw_1602=0;
72 1 _nop_();
73 1 e_1602=1;
74 1 _nop_();
75 1 _nop_();
76 1 e_1602=0; //产生一个下沿
77 1 }
78
79
80
81 /***************向液晶写数据******************/
82 void lcd1602_wrdata(uchar lcddata)
83 {
84 1 while(lcd1602_busy()); //等待空闲
85 1 lcd1602_bus=lcddata; //在下沿的时候写数据
86 1 rs_1602=1;
87 1 rw_1602=0;
88 1 _nop_();
89 1 e_1602=1;
90 1 _nop_();
91 1 _nop_();
92 1 e_1602=0;
93 1 //lcd_bus=0xff;
94 1 }
95
96
97 /************液晶的清屏************/
98 void lcd1602_clear(void)
99 {
100 1 lcd1602_wrcmd(0x01); //液晶清屏控制字 并延时>40us
101 1 delay(1);
102 1 }
103
104 /***********1602液晶的初始化***************/
105 void lcd1602_init(void)
106 {
107 1 lcd1602_wrcmd(0x38); //功能设置-----8位数据接口,两行显示,5*7点阵字符显示
108 1 delay(1);
109 1 lcd1602_wrcmd(0x0e); //显示开关控制----显示开关开,光标开关关,闪烁开关关
110 1 delay(1);
111 1 lcd1602_wrcmd(0x06); //输入方式设置,AC自增1, S=0;
112 1 delay(1);
113 1 lcd1602_wrcmd(0x01); //清屏
114 1 delay(1);
115 1 }
116
117
C51 COMPILER V7.20 TEXT1 07/24/2007 21:33:14 PAGE 3
118 /**********4*4矩阵键盘****************/
119 /************
120 矩阵键盘
121 D---------P1.0
122 C---------P1.1
123 B---------P1.2
124 A---------P1.3
125 1---------P1.4
126 2---------P1.5
127 3---------P1.6
128 4---------P1.7
129 按键值的分布
130 D C B A
131 1〔15 14 13 12〕
132 2〔11 10 9 8〕
133 3〔 7 6 5 4〕
134 4〔 3 2 1 0〕
135 利用已有的那个按键程序 */
136
137
138
139
140
141
142 uchar getkey_ii()
143
144 {
145 1 unsigned char keycode=0xff,temp,i;
146 1 P1=0x0f;
147 1 temp=P1&0x0f;
148 1 if(temp!=0x0f) //判是否有键按下
149 1 {
150 2 // beep=0;
151 2 P1=0xef; //自第0行开始扫描输出,自列读入键值
152 2 for(i=0;i<4;i++)
153 2 {
154 3 temp=P1&0x0f;
155 3 if(temp==0x07) //判断第0列是否有键按下
156 3 {
157 4 keycode=i*4+0;
158 4 break;
159 4 }
160 3 else if(temp==0x0b)//判断第1列是否有键按下
161 3 {
162 4 keycode=i*4+1;
163 4 break;
164 4 }
165 3 else if(temp==0x0d)//判断第2列是否有键按下
166 3 {
167 4 keycode=i*4+2;
168 4 break;
169 4 }
170 3 else if(temp==0x0e)//判断第3列是否有键按下
171 3 {
172 4 keycode=i*4+3;
173 4 break;
174 4 }
175 3 P1=(P1<<1)|0x1;
176 3 }
177 2
178 2 while((P1&0x0f)!=0x0f) //等待释放
179 2 {
C51 COMPILER V7.20 TEXT1 07/24/2007 21:33:14 PAGE 4
180 3 P1=0x0f;
181 3 }
182 2 // beep=1;
183 2
184 2 }
185 1 return keycode;
186 1 }
187
188
189
190 void xianshu(unsigned long a)
191 { unsigned long c,p=0;
192 1 if (a!=0)
193 1 {
194 2
195 2 c=a/1000000000;
196 2 if(c!=0)
197 2 {lcd1602_wrdata(c+0x30);
198 3 p=1;
199 3 }
200 2 c=(a%1000000000)/100000000;
201 2 if(c!=0 || p==1)
202 2 {lcd1602_wrdata(c+0x30);
203 3 }
204 2 c=(a%100000000)/10000000;
205 2 if(c!=0 || p==1)
206 2 {lcd1602_wrdata(c+0x30);
207 3 }
208 2
209 2 c=(a%10000000)/1000000;
210 2 if(c!=0 || p==1)
211 2 {lcd1602_wrdata(c+0x30);
212 3 }
213 2 c=(a%1000000)/100000;
214 2 if(c!=0 || p==1)
215 2 {lcd1602_wrdata(c+0x30);
216 3 }
217 2 c=(a%100000)/10000;
218 2 if(c!=0 || p==1)
219 2 {lcd1602_wrdata(c+0x30);
220 3 }
221 2 c=(a%10000)/1000;
222 2 if(c!=0 || p==1)
223 2 {lcd1602_wrdata(c+0x30);
224 3 }
225 2
226 2 c=(a%1000)/100;
227 2 if(c!=0 || p==1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -