📄 12.lst
字号:
C51 COMPILER V6.12 12 09/10/2008 07:48:40 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE 12
OBJECT MODULE PLACED IN .\12.OBJ
COMPILER INVOKED BY: D:\Program Files\keil2\C51\BIN\C51.EXE .\12.c DEBUG OBJECTEXTEND
stmt level source
1 #include <reg52.h>
2 #include <math.h>
3 #define timer0_count 0xfc18 //64536 65536-64536=1000us=1ms
4 int sum=0,sec=0,min=0,hour=0;
5 int i=0;
6 void lcd_init(void); //LCD初如化
7 void clr_lcd(void); //清显示
8 void send_com(unsigned char cmd); //写指令
9 void send_data(unsigned char dat); //写数据
10 void chek_busy(void); //检测忙
11 void set_xy(unsigned char xpos,unsigned char ypos); //认定显示位置
12 void print(unsigned char x,unsigned char y,char* str);
13 void printstr(unsigned char xpos,unsigned char ypos,unsigned char str[],unsigned char k);
14 //int m=0;
15 char code int2charLCD[]="0123456789";
16 //unsigned char code buf[4] ={0xbb,0xb6,0xd3,0xad};//欢迎
17 //unsigned char code buf1[2] ={0x00,0x00};
18 //unsigned char buf1[2]={0x00,1};
19 #define DATA P0 //定义P0为DATA
20 #define CONTROL P2 //定义P2为控制口
21 #define E 2 //并行的使能信号 sbit E = P2^2
22 #define RW 1 //并行的读写信号 sbit RW = P2^1
23 #define RS 0 //并行的指令数据选择信号 sbit RS = P2^0
24 #define PSB 3 //并/串行接口选择 sbit PSB = P2^3
25 #define RST 5 //复位 低电平有效 sbit RST = P2^5
26 #define SETB(x,y) (x|=(1<<y))
27 #define CLRB(x,y) (x&=(~(1<<y)))
28 #define CHKB(x,y) (x&(1<<y))
29 /********定时器t0初始化**************************/
30 void timer0_initialize(void)
31 {
32 1 EA=0;
33 1 // timer0_tick=0;
34 1 TR0=0;
35 1 TMOD&=0xf0;
36 1 TMOD|=0x01;
37 1 TL0=(timer0_count&0xff) ;
38 1 TH0=(timer0_count>>8);
39 1 PT0=0;
40 1 ET0=1;
41 1 TR0=1;
42 1 EA=1;
43 1 }
44
45
46 /*********定时器中断服务子程序***************************/
47 static void time0_isr(void) interrupt 1 using 1
48 {
49 1 // int buf1=0;
50 1
51 1 TR0=0;
52 1 TL0=(timer0_count&0xff); //将18H放入TL0
53 1 TH0=(timer0_count>>8); //右移8位,将fcH放入TH0中
54 1 TR0=1;
55 1 i+=1;
C51 COMPILER V6.12 12 09/10/2008 07:48:40 PAGE 2
56 1 if(i>=100)
57 1 { i=0;
58 2
59 2 sum=sum+1;
60 2 if(sum==10)
61 2 {
62 3 sum=0;
63 3 sec++;
64 3 if(sec==60)
65 3 {
66 4 sec=0;
67 4 min++;
68 4 if(min==60)
69 4 { min=0;
70 5 hour++;
71 5 if(hour==24)
72 5 hour=0;
73 5 } }
74 3 }
75 2 }
76 1 // buf1[1]=sum;
77 1 }
78 // }
79
80
81 /********************测忙碌**********************/
82 //测忙碌子程序
83 //RS=0,RW=1,E=H,D0-D7=状态字
84 /************************************************/
85 void chek_busy(void)
86 { unsigned char temp1;//状态信息(判断是否忙)
87 1 CLRB(CONTROL,RS); // RS = 0;
88 1 SETB(CONTROL,RW); // RW = 1;
89 1 SETB(CONTROL,E); // E = 1;
90 1 do{temp1 = DATA;DATA=0xFF;} while(temp1&0x80);
91 1 SETB(CONTROL,E); // E = 1;
92 1 DATA=0xFF;
93 1 }
94 /********************写命令**********************/
95 //写命令子程序
96 //
97 /************************************************/
98 void send_com(unsigned char cmd)/*写命令*/
99 {
100 1 chek_busy();
101 1 CLRB(CONTROL,RS); //RS = 0;
102 1 CLRB(CONTROL,RW); //RW = 0;
103 1 DATA = cmd;
104 1 SETB(CONTROL,E); //E = 1;
105 1 CLRB(CONTROL,E); //E = 0;
106 1 }
107 /********************写数据**********************/
108 //写数据子程序
109 //
110 /************************************************/
111 void send_data(unsigned char dat)
112 {
113 1 chek_busy();
114 1 SETB(CONTROL,RS); //RS = 1;
115 1 CLRB(CONTROL,RW); //RW = 0;
116 1 DATA = dat;
117 1 SETB(CONTROL,E); //E = 1;
C51 COMPILER V6.12 12 09/10/2008 07:48:40 PAGE 3
118 1 CLRB(CONTROL,E); //E = 0;
119 1 }
120 /********************初始化**********************/
121 //复位、通讯方式选择
122 /************************************************/
123 void lcd_init(void)
124 {
125 1 SETB(CONTROL,RST);//复位RST=1
126 1 SETB(CONTROL,PSB); //通讯方式为并口PSB = 1
127 1 //send_com(0x34);//34H--扩充指令操作
128 1 send_com(0x30);//功能设置,一次送8位数据,基本指令集
129 1 send_com(0x0C);//0000,1100 整体显示,游标off,游标位置off
130 1 send_com(0x01);//0000,0001 清DDRAM
131 1 send_com(0x02);//0000,0010 DDRAM地址归位
132 1 send_com(0x80);//1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC
133 1 }
134
135 /*******************************************************************/
136 // 设置显示位置 xpos(1~16),tpos(1~4)
137 /*******************************************************************/
138 void set_xy(unsigned char xpos,unsigned char ypos)
139 {
140 1 switch(ypos)
141 1 {
142 2 case 1:
143 2 send_com(0X80|xpos);break;
144 2 case 2:
145 2 send_com(0X90|xpos);break;
146 2 case 3:
147 2 send_com(0X88|xpos);break;
148 2 case 4:
149 2 send_com(0X98|xpos);break;
150 2 default:break;
151 2 }
152 1 }
153 /*******************************************************************/
154 // 在指定位置显示字符串
155 /*******************************************************************/
156 void print(unsigned char x,unsigned char y,char* str)
157 {
158 1 unsigned char lcd_temp;
159 1 set_xy(x,y);
160 1 lcd_temp=*str;
161 1 while(lcd_temp != 0x00)
162 1 {
163 2 send_data(lcd_temp);
164 2 lcd_temp=*(++str);
165 2 }
166 1 }
167
168 /********************写字符串******************/
169 //写字符串子程序
170 //xpos1取0~7共八列,ypos1取0~3共四行。
171 /**********************************************/
172 void printstr(unsigned char xpos,unsigned char ypos,unsigned char str[],unsigned char k)
173 { unsigned char n;
174 1 switch (ypos)
175 1 { case 1: xpos |= 0x80;break; //第一行
176 2 case 2: xpos |= 0x90;break; //第二行
177 2 case 3: xpos |= 0x88;break; //第三行
178 2 case 4: xpos |= 0x98;break; //第四行
179 2 default: break;
C51 COMPILER V6.12 12 09/10/2008 07:48:40 PAGE 4
180 2 }
181 1
182 1 send_com(xpos); //此处的Xpos已转换为LCM的显示寄存器实际地址
183 1 for(n=0;n < k;n++)
184 1 {
185 2 send_data(str[n]);//显示汉字时注意码值,连续两个码表示一个汉字
186 2 }
187 1 }
188 /************************************/
189 //在指定位置显示数字
190 /***************************************/
191 void display_LCD_number(unsigned char xpos,unsigned char ypos,unsigned char number)
192 {
193 1 unsigned char x,y;
194 1 switch (ypos)
195 1 { case 1: xpos |= 0x80;break; //第一行
196 2 case 2: xpos |= 0x90;break; //第二行
197 2 case 3: xpos |= 0x88;break; //第三行
198 2 case 4: xpos |= 0x98;break; //第四行
199 2 default: break;
200 2 }
201 1 send_com(xpos); //此处的Xpos已转换为LCM的显示寄存器实际地址
202 1 // unsigned char ;
203 1 // x=number/100;
204 1 // y=(number-x*100)/10;
205 1 // z=number%10;
206 1 x=number/10;
207 1 y=number-x*10;
208 1 send_data(int2charLCD[x]);
209 1 send_data(int2charLCD[y]);
210 1 // send_data(int2charLCD[z]);
211 1 }
212 /********************清屏************************/
213 //清屏
214 /************************************************/
215 void clr_lcd(void)
216 {
217 1 send_com(0x01);
218 1 //send_com(0x34);
219 1 //send_com(0x30);
220 1 }
221
222 /**************主函数***********************/
223 void main ()
224 {
225 1 timer0_initialize();
226 1 lcd_init(); //设定液晶工作方式
227 1 //printstr(1,1,buf,4);
228 1 //printstr(2,1,"数字时钟",8);
229 1 print(3,1,"时钟");
230 1 print(1,2,":");
231 1 print(3,2,":");
232 1 //printstr(6,2,buf1,1);
233 1 //print(0,3," SEEGU百度空间");
234 1 //print(7,2,buf1);
235 1 while(1)
236 1 {
237 2 //display_LCD_number(0,2,hour);
238 2 //display_LCD_number(2,2,min);
239 2 display_LCD_number(4,2,sec);
240 2 }
241 1 }
C51 COMPILER V6.12 12 09/10/2008 07:48:40 PAGE 5
242
243
244
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 528 ----
CONSTANT SIZE = 18 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 10 9
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 + -