📄 x.lst
字号:
C51 COMPILER V8.05a X 08/04/2008 12:25:33 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE X
OBJECT MODULE PLACED IN x.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE x.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <c8051f020.h>
2
3 /*
4
5 LCD_
6 RS <P4.0>
7 WR <P4.1>
8 E <P4.2>
9 要求:P4.0,4.1,4.2设置为推拉输出;
10 P5口设置为带弱上拉的漏极输出,3.3V电平标准即可
11
12 */
13 #define uchar unsigned char
14 #define uint unsigned int
15
16 unsigned char code dig[]={"0123456789"};
17
18
19 /***************************时钟配置*****************************/
20 void SYSCLK_Init (void)
21 {
22 1 int i; // delay counter
23 1 OSCXCN = 0x67; // start external oscillator with // 22.1184MHz crystal
24 1 for (i=0; i < 512; i++) ; // Wait for osc. to start up
25 1 while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
26 1 OSCICN = 0x88; // 选择外部时针
27 1 }
28
29 /***************************端口设置*****************************/
30 void port_init(void)
31 {
32 1 XBR0|= 0x04; // 串口能用
33 1 XBR1= 0x00;
34 1 XBR2= 0x40; // Enable crossbar and weak pull-ups
35 1 ////
36 1 P0MDOUT |= 0x3D;
37 1 P3MDOUT = 0xff; //P3.0 P3.2为开漏输出 ad7650用
38 1 P1MDOUT = 0xff; //P1口设置为push-pull输出
39 1 P2MDOUT = 0xff; //P2口设置为push-pull输出
40 1 //P7=0X0F;
41 1 }
42
43 void lcd_delay()
44 { unsigned char delayTime;
45 1 for(delayTime=50;delayTime>0;delayTime--);
46 1 }
47
48 /* 返回值Status: 当前地址计数器的值. */
49 unsigned char LCDBusyWait() //等待LCD就绪
50 {
51 1 unsigned char Status;
52 1 P4&=0xfe; //11111110,LCD_RS=0
53 1 lcd_delay();
54 1
55 1 P4|=0x02;//00000010,LCD_RW=1
C51 COMPILER V8.05a X 08/04/2008 12:25:33 PAGE 2
56 1 lcd_delay();
57 1
58 1 P5 = 0xFF;
59 1 P4|=0x04;//00000100,LCD_E=1
60 1
61 1 lcd_delay();
62 1 Status=P5;
63 1 P4&=0xfB;//11111011,LCD_E=0
64 1
65 1 while(Status & 0x80)
66 1 {
67 2 lcd_delay();
68 2 P4|=0x04;//00000100,LCD_E=1
69 2 lcd_delay();
70 2 Status=P5;
71 2 lcd_delay();
72 2 P4&=0xfB;//11111011,LCD_E=0
73 2
74 2 }
75 1 P4&=0xfd;//11111101,LCD_RW=0
76 1
77 1 return Status;
78 1 }
79
80 void WriteLCD_Data(unsigned char Data) //向LCD写入一个字节的数据
81 {
82 1 LCDBusyWait();
83 1 P4|=0x01;//00000001,LCD_RW=0,LCD_RS=1
84 1
85 1 lcd_delay();
86 1 P5 = Data;
87 1 lcd_delay();
88 1 P4|=0x04;//00000100,LCD_E=1
89 1
90 1 lcd_delay();
91 1 P4&=0xfB;//11111011,LCD_E=0
92 1
93 1 }
94
95 void WriteLCD_Command(unsigned char Command) //向LCD写入一个字节的命令
96 {
97 1 LCDBusyWait();
98 1 P4&=0xFE;//11111110,LCD_RS=0
99 1
100 1 lcd_delay();
101 1 P5 = Command;
102 1 lcd_delay();
103 1 P4|=0x04;//00000100,LCD_E=1
104 1
105 1 lcd_delay();
106 1 P4&=0xfB;//11111011,LCD_E=0
107 1
108 1 }
109
110 //改变地址,实现了逐行显示
111 unsigned char ChangeAddress(unsigned char StartAddress)
112 {
113 1 switch(StartAddress)
114 1 {
115 2 case 0x87:WriteLCD_Command(0x90);StartAddress=0x90;break;
116 2 case 0x8F:WriteLCD_Command(0x98);StartAddress=0x98;break;
117 2 case 0x97:WriteLCD_Command(0x88);StartAddress=0x88;break;
C51 COMPILER V8.05a X 08/04/2008 12:25:33 PAGE 3
118 2 default:StartAddress+=1;
119 2 }
120 1 return StartAddress;
121 1 }
122
123 /*****************************显示字符串***************************************/
124
125 void WriteLCD(unsigned char StartAddress,unsigned char Size,unsigned char Charactors[])
126 {
127 1 unsigned char *i=Charactors; //字符串的首地址
128 1 WriteLCD_Command(StartAddress);
129 1 if(Size) //Size不为0
130 1 {
131 2 // bit Over=0;
132 2 while(i<(Charactors+Size)) //判断字符串结尾
133 2 {
134 3
135 3 WriteLCD_Data(*i);
136 3 i++;
137 3 //WriteLCD_Data(*i);
138 3 //i++;
139 3 StartAddress=ChangeAddress(StartAddress); //改变地址,实现了逐行显示
140 3 }
141 2 }
142 1 else //Size为0
143 1 {
144 2 while(*i) //判断字符串结尾,*i为0代表结束
145 2 {
146 3 WriteLCD_Data(*i);
147 3 i++;
148 3 WriteLCD_Data(*i);
149 3 i++;
150 3 StartAddress=ChangeAddress(StartAddress);
151 3 }
152 2 }
153 1 }
154 /****************************显示数字********************************/
155
156 void Show_num(unsigned char address,unsigned int num)
157 {
158 1 unsigned char k,j,i=0;
159 1 unsigned char w_data[5];
160 1 WriteLCD_Command(address);
161 1 do
162 1 {
163 2 w_data[i++]=num%10;
164 2 num=num/10;
165 2 j=i;
166 2 }while(num!=0);
167 1
168 1 for(k=j;j>0;j--)
169 1 {
170 2 WriteLCD_Data(dig[w_data[j-1]]);
171 2 }
172 1 }
173
174 void main()
175 {
176 1 SYSCLK_Init ();
177 1 port_init();
178 1 WriteLCD_Command(0x30); //功能设置---8BIT控制界面,基本指令集
179 1 WriteLCD_Command(0x0C); //显示打开,光标关,反白显示关
C51 COMPILER V8.05a X 08/04/2008 12:25:33 PAGE 4
180 1 WriteLCD_Command(0x01); //清除屏幕显示,将DDRAM的地址计数器归零
181 1 WriteLCD(0x81,0,"DDS AD9852");
182 1 while(1)
183 1 {
184 2 Show_num(0x90,6140);
185 2 }
186 1
187 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 427 ----
CONSTANT SIZE = 22 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 14
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 + -