📄 hd.lst
字号:
C51 COMPILER V7.50 HD 10/28/2007 17:02:39 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE HD
OBJECT MODULE PLACED IN hd.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE hd.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <c8051f410.H>
2 #define uchar unsigned char
3 #define uint unsigned int
4 #define ulon unsigned long
5 #define LCD_DATA_PORT P1 // 液晶BD0~BD7与P0口相连
6 sbit LCD_RS =P0^7; // 液晶 RS 引脚与P2.0相接
7 sbit LCD_RW =P0^6; // 液晶 R/W 引脚与P2.1相接
8 sbit LCD_E =P0^5; // 液晶 E 引脚与P2.2相接
9 sbit LCD_BF =P1^7; // 液晶 DB7 引脚与P0.7相接 Busy Flag
10
11 sbit pul =P2^3;
12 sbit clr =P2^4;
13 ulon cont,cont1;
14
15 // 本地函数
16
17 void lcd_delay_us(unsigned char us) // 延时微秒@12M,ms最大值255
18 {
19 1 while(--us)
20 1 {
21 2 ;
22 2 }
23 1 }
24
25 void lcd_delay_ms(unsigned char ms) // 延时毫秒@12M,ms最大值255
26 {
27 1 unsigned char i;
28 1 while(ms--)
29 1 {
30 2 for(i = 0; i < 124; i++)
31 2 {
32 3 ;
33 3 }
34 2 }
35 1 }
36
37
38 // 产生一个使能脉冲
39
40 void lcd_e_toggle(void)
41 {
42 1 LCD_E = 1;
43 1 lcd_delay_us(3);
44 1 LCD_E = 0;
45 1 }
46
47
48
49 // 循环检测LCD忙标志(BF),直到其值为0,方可执行下一指令
50
51 void lcd_wait_until_finish(void)
52 {
53 1 LCD_RW = 1; // RW置1,状态为读
54 1 LCD_RS = 0; // RS置0,读状态时RS需置低电平
55 1 LCD_E = 1; // E 置1,读取信息
C51 COMPILER V7.50 HD 10/28/2007 17:02:39 PAGE 2
56 1 lcd_delay_us(100);
57 1 while(LCD_BF) // 循环直至BF=0
58 1 {
59 2 ;
60 2 }
61 1 LCD_E = 0; // E重置为0
62 1 }
63
64
65 // 公共函数
66
67 // 向LCD写命令字
68
69 void lcd_command(unsigned char cmd)
70 { while(LCD_BF);
71 1 LCD_RW = 0; // RW置0,状态为写
72 1 LCD_RS = 0; // RS置0,写入命令字
73 1 LCD_E = 0;
74 1 LCD_DATA_PORT = cmd; // 将命令字cmd送入LCD的数据端口
75 1 lcd_e_toggle(); // 产生使能脉冲,在下降沿开始执行,将命令字读入
76 1 lcd_wait_until_finish(); // 等待执行完毕
77 1
78 1 }
79
80
81 // 设置显示位置(即写入显示地址),x,y均从0开始
82
83 void lcd_goto_xy(unsigned char x, unsigned char y)
84 {
85 1 unsigned char p; // p为字符显示位置,即DDRAM中的地址
86 1 if (y==0)
87 1 {
88 2 p = 0x00 + x; // (0,0)显示位置为0x00
89 2 }
90 1 else
91 1 {
92 2 p = 0x40 + x; // (0,1)显示位置为0x40
93 2 }
94 1
95 1 lcd_command(p + 0x80); // 写入显示地址时DB7须为高电平,加0x80
96 1
97 1 }
98
99
100 // 写字符(传入的参数实际为所需显示字符的地址,即液晶字符产生器中字符的地址)
101
102 void lcd_putc(unsigned char c)
103 {
104 1 LCD_RW = 0; // RW置0,状态为写
105 1 LCD_RS = 1; // RS置1,写入数据
106 1 LCD_E = 0;
107 1 LCD_DATA_PORT = c; // 将字符c(实际上是字符的地址)送入LCD数据端口
108 1 lcd_e_toggle(); // 使能脉冲
109 1 lcd_wait_until_finish(); // 等待完成
110 1 }
111
112
113 // 指定位置写字符
114
115 void lcd_xy_putc(unsigned char x, unsigned char y, unsigned char c)
116 {
117 1 lcd_goto_xy(x,y);
C51 COMPILER V7.50 HD 10/28/2007 17:02:39 PAGE 3
118 1 lcd_putc(c);
119 1 }
120
121
122 // 写字符串
123
124 void lcd_puts(unsigned char *s)
125 {
126 1 while(*s)
127 1 {
128 2 lcd_putc(*s);
129 2 s++;
130 2 }
131 1 }
132
133
134 // 指定位置写字符串
135
136 void lcd_xy_puts(unsigned char x, unsigned char y, unsigned char *s)
137 {
138 1 lcd_goto_xy(x, y);
139 1 lcd_puts(s);
140 1 }
141
142 // LCD初始化
143
144 void lcd_init(void)
145 {
146 1 lcd_delay_ms(12); // 上电后适当延时
147 1 lcd_command(0x38); // 设为8位接口模式,显示2行字符
148 1 lcd_delay_ms(12); // 上电后适当延时
149 1 lcd_command(0x38); // 设为8位接口模式,显示2行字符
150 1 lcd_delay_ms(12); // 上电后适当延时
151 1 lcd_command(0x38); // 设为8位接口模式,显示2行字符
152 1 lcd_delay_ms(12); // 上电后适当延时
153 1 lcd_command(0x38); // 设为8位接口模式,显示2行字符
154 1 lcd_command(0x06); // 写入新数据后光标右移
155 1 lcd_command(0x0c); // 显示功能开,不显示光标
156 1 lcd_command(0x01); // 清屏
157 1
158 1 }
159
160
161 swi(uchar swd)
162 {switch(swd)
163 1 {
164 2 case 0: lcd_puts("0"); break;
165 2 case 1: lcd_puts("1");break;
166 2 case 2: lcd_puts("2");break;
167 2 case 3: lcd_puts("3");break;
168 2 case 4: lcd_puts("4");break;
169 2 case 5: lcd_puts("5");break;
170 2 case 6: lcd_puts("6");break;
171 2 case 7: lcd_puts("7");break;
172 2 case 8: lcd_puts("8");break;
173 2 case 9: lcd_puts("9");break;
174 2 case 10: lcd_puts("10");break;
175 2 case 11: lcd_puts(".");break;
176 2 }
177 1 }
178
179 display()
C51 COMPILER V7.50 HD 10/28/2007 17:02:39 PAGE 4
180 {uchar buf;
181 1 lcd_goto_xy(0,1); // 字符位置:(0,1)
182 1 buf=cont1/100000;
183 1 swi(buf);
184 1 buf=(cont1%100000)/10000;
185 1 swi(buf);
186 1
187 1 swi(0x0b);
188 1
189 1 buf=((cont1%100000)%10000)/1000;
190 1 swi(buf);
191 1 buf=(((cont1%100000)%10000)%1000)/100;
192 1 swi(buf);
193 1 buf=((((cont1%100000)%10000)%1000)%100)/10;
194 1 swi(buf);
195 1 buf=((((cont1%100000)%10000)%1000)%100)%10;
196 1 swi(buf);
197 1 }
198 void main(void)
199 {
200 1 XBR1=0X40;
201 1 PCA0MD=0X00;
202 1 OSCICN|=0x03;
203 1 lcd_delay_ms(10);
204 1
205 1 P0=0;P1=0;P2=0;
206 1 lcd_init(); // 初始化LCD
207 1 lcd_goto_xy(0,0); // 字符位置:(0,0)
208 1
209 1 lcd_puts("87694112");
210 1 display();
211 1 while(1)
212 1 {
213 2 if(pul==0){cont++;cont1=(cont*25)/8;while(pul==0){ display();}}
214 2
215 2 if(clr==0){cont=0;cont1=0; display();}
216 2 }
217 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 829 ----
CONSTANT SIZE = 34 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 ----
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 + -