C51 COMPILER V8.02 1602_MIAOBIAO 06/29/2010 13:14:05 PAGE 1 C51 COMPILER V8.02, COMPILATION OF MODULE 1602_MIAOBIAO OBJECT MODULE PLACED IN 1602-miaobiao.OBJ COMPILER INVOKED BY: D:\处理软件\keil\C51\BIN\C51.EXE 1602-miaobiao.c BROWSE DEBUG OBJECTEXTEND line level source 1 /*************************************************************** 2 “天祥电子” 倾情奉献 3 www.txmcu.com 4 www.txmcu.cn 5 ***************************************************************** 6 ****************************************************************** 7 * 工作芯片:STC89C516 晶振频率:11.0592MHz * 8 * * 9 * 作者: 郭天祥 (Email: txmcu@163.com) * 10 * 网站: www.tx-power.com(天祥电子) * 11 * 邮箱: txmcu@163.com * 12 * * 13 *【版权】Copyright(C)天祥电子 www.tx-power.com All Rights Reserved * 14 *【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! * 15 * * 16 ************************************************************************* 17 * * 18 * 描述: * 19 * * 20 * 上电后液晶屏先显示网站等信息,接着按下S4,定时开始,再次按下 * 21 * * 22 * S4暂停,第3次按下显示累积计时,第4次按下暂停计时,任何时候按下S5* 23 * * 24 * 计数清零。 * 25 * * 26 * * 27 ************************************************************************/ 28 29 #include 30 #include 31 32 #define uchar unsigned char 33 #define uint unsigned int 34 35 uchar KeyCount=0; 36 37 sbit K3 = P3^6; 38 sbit K4 = P3^7; 39 40 sbit BEEP = P2^3; //蜂鸣器 41 42 uchar code cdis1[ ] = {" STOPWATCH 0 "}; 43 uchar code cdis2[ ] = {"www.tx-power.com"}; 44 uchar code cdis3[ ] = {"TIME "}; 45 46 uchar code cdis4[ ] = {" BEGIN COUNT 1 "}; 47 uchar code cdis5[ ] = {" PAUSE COUNT 2 "}; 48 uchar code cdis6[ ] = {" BEGIN COUNT 3 "}; 49 uchar code cdis7[ ] = {" PAUSE COUNT 4 "}; 50 uchar code cdis8[ ] = {" "}; 51 52 sbit LCD_RS = P3^5; 53 //sbit LCD_RW = P2^1; 54 sbit LCD_EN = P3^4; 55 C51 COMPILER V8.02 1602_MIAOBIAO 06/29/2010 13:14:05 PAGE 2 56 #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; 57 58 uchar display[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00}; 59 uchar display2[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; 60 61 /********************************************************* 62 延时函数 63 *********************************************************/ 64 65 void Delay(uint num)//延时函数 66 { 67 1 while( --num ); 68 1 } 69 70 /********************************************************* 71 蜂鸣器响一声 72 **********************************************************/ 73 void beep() 74 { 75 1 unsigned char y; 76 1 for (y=0;y<180;y++) 77 1 { 78 2 BEEP=!BEEP; //BEEP取反 79 2 Delay(70); 80 2 } 81 1 BEEP=1; //关闭蜂鸣器 82 1 } 83 84 /********************************************************* 85 延时函数1 86 *********************************************************/ 87 void delay1(int ms) 88 { 89 1 unsigned char n; 90 1 while(ms--) 91 1 { 92 2 for(n = 0; n<250; n++) 93 2 { 94 3 _nop_(); 95 3 _nop_(); 96 3 _nop_(); 97 3 _nop_(); 98 3 } 99 2 } 100 1 } 101 102 /********************************************************** 103 * * 104 * 检查LCD忙状态 * 105 * lcd_busy为1时,忙,等待。 * 106 * lcd-busy为0时,闲,可写指令与数据。 * 107 * * 108 **********************************************************/ 109 bit lcd_busy() 110 { 111 1 bit result; 112 1 LCD_RS = 0; 113 1 // LCD_RW = 1; 114 1 LCD_EN = 1; 115 1 delayNOP(); 116 1 result = (bit)(P0&0x80); 117 1 LCD_EN = 0; C51 COMPILER V8.02 1602_MIAOBIAO 06/29/2010 13:14:05 PAGE 3 118 1 return(result); 119 1 } 120 121 /********************************************************** 122 * * 123 *写指令数据到LCD * 124 *RS=L,RW=L,E=高脉冲,D0-D7=指令码。 * 125 * * 126 **********************************************************/ 127 void lcd_wcmd(uchar cmd) 128 { 129 1 // while(lcd_busy()); 130 1 LCD_RS = 0; 131 1 // LCD_RW = 0; 132 1 LCD_EN = 0; 133 1 _nop_(); 134 1 _nop_(); 135 1 P0 = cmd; 136 1 delayNOP(); 137 1 LCD_EN = 1; 138 1 delayNOP(); 139 1 LCD_EN = 0; 140 1 Delay(10); 141 1 } 142 143 /********************************************************** 144 * * 145 *写显示数据到LCD * 146 *RS=H,RW=L,E=高脉冲,D0-D7=数据。 * 147 * * 148 **********************************************************/ 149 void lcd_wdat(uchar dat) 150 { 151 1 // while(lcd_busy()); 152 1 LCD_RS = 1; 153 1 // LCD_RW = 0; 154 1 LCD_EN = 0; 155 1 P0 = dat; 156 1 delayNOP(); 157 1 LCD_EN = 1; 158 1 delayNOP(); 159 1 LCD_EN = 0; 160 1 Delay(10); 161 1 } 162 163 /********************************************************** 164 * * 165 * LCD初始化设定 * 166 * * 167 **********************************************************/ 168 void lcd_init() 169 { 170 1 delay1(15); 171 1 lcd_wcmd(0x01); //清除LCD的显示内容 172 1 lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据 173 1 delay1(5); 174 1 lcd_wcmd(0x38); 175 1 delay1(5); 176 1 lcd_wcmd(0x38); 177 1 delay1(5); 178 1 179 1 lcd_wcmd(0x0c); //开显示,不显示光标 C51 COMPILER V8.02 1602_MIAOBIAO 06/29/2010 13:14:05 PAGE 4 180 1 delay1(5); 181 1 182 1 lcd_wcmd(0x01); //清除LCD的显示内容 183 1 delay1(5); 184 1 } 185 186 /********************************************************** 187 * * 188 * 设定显示位置 * 189 * * 190 **********************************************************/ 191 192 void lcd_pos(uchar pos) 193 { 194 1 lcd_wcmd(pos | 0x80); //数据指针=80+地址变量 195 1 } 196 197 /******************************************************** 198 显示函数 199 *********************************************************/ 200 void play() 201 { 202 1 uchar i; 203 1 for(i=0;i<6;i++) 204 1 { 205 2 display2[i]=display[i]+0x30; 206 2 } 207 1 208 1 display2[7]=display[6]/10+0x30; //时单位数据处理 209 1 display2[6]=display[6]%10+0x30; 210 1 211 1 lcd_pos(0x45); 212 1 lcd_wdat(display2[7]); //显示时 213 1 lcd_wdat(display2[6]); 214 1 lcd_wdat(0x3a); //显示':' 215 1 216 1 lcd_wdat(display2[5]); //显示分 217 1 lcd_wdat(display2[4]); 218 1 lcd_wdat(0x3a); //显示':' 219 1 220 1 lcd_wdat(display2[3]); //显示秒 221 1 lcd_wdat(display2[2]); 222 1 lcd_wdat(0x3a); //显示':' 223 1 224 1 lcd_wdat(display2[1]); //显示毫秒 225 1 lcd_wdat(display2[0]); 226 1 } 227 228 /******************************************************** 229 主函数 230 *********************************************************/ 231 main() 232 { 233 1 uchar m; 234 1 235 1 TMOD=0x01; 236 1 TH0=0xdc; TL0=0x00; //50ms定时 237 1 EA=1; ET0=1; 238 1 239 1 lcd_init(); 240 1 241 1 lcd_pos(0x00); //设置显示位置为第一行 C51 COMPILER V8.02 1602_MIAOBIAO 06/29/2010 13:14:05 PAGE 5 242 1 for(m=0;m<16;m++) 243 1 lcd_wdat(cdis1[m]); //显示字符 244 1 245 1 lcd_pos(0x40); //设置显示位置为第二行 246 1 for(m=0;m<16;m++) 247 1 { 248 2 lcd_wdat(cdis2[m]); //显示字符 249 2 delay1(60); 250 2 } 251 1 252 1 delay1(1000); 253 1 254 1 lcd_pos(0x40); //设置显示位置为第二行 255 1 for(m=0;m<16;m++) 256 1 lcd_wdat(cdis3[m]); 257 1 258 1 while(1) 259 1 { 260 2 if(K3==0) 261 2 { 262 3 KeyCount++; //计数 263 3 beep(); 264 3 delay1(100); 265 3 266 3 switch (KeyCount) 267 3 { 268 4 case 1: 269 4 TR0=1; //启动中断 270 4 lcd_pos(0x00); 271 4 for(m=0;m<16;m++) 272 4 lcd_wdat(cdis4[m]); 273 4 break; 274 4 275 4 case 2: 276 4 TR0=0; //停止中断 277 4 lcd_pos(0x00); 278 4 for(m=0;m<16;m++) 279 4 lcd_wdat(cdis5[m]); 280 4 break; 281 4 282 4 case 3: 283 4 TR0=1; //启动中断 284 4 lcd_pos(0x00); 285 4 for(m=0;m<16;m++) 286 4 lcd_wdat(cdis6[m]); 287 4 break; 288 4 289 4 case 4: 290 4 TR0=0; //停止中断 291 4 lcd_pos(0x00); 292 4 for(m=0;m<16;m++) 293 4 lcd_wdat(cdis7[m]); 294 4 break; 295 4 296 4 default: 297 4 TR0=0; //停止中断 298 4 break; 299 4 } 300 3 } 301 2 if(K4==0) 302 2 { 303 3 TR0=0; //停止中断 C51 COMPILER V8.02 1602_MIAOBIAO 06/29/2010 13:14:05 PAGE 6 304 3 KeyCount=0; 305 3 for(m=0;m<8;m++) 306 3 display[m]=0x00; //计时单元清零 307 3 lcd_pos(0x00); //设置显示位置为第一行 308 3 for(m=0;m<16;m++) 309 3 lcd_wdat(cdis1[m]); 310 3 beep(); 311 3 delay1(100); 312 3 } 313 2 314 2 play(); 315 2 } 316 1 } 317 318 /********************************************************* 319 * * 320 * Time0中断函数 * 321 * * 322 **********************************************************/ 323 void Time0(void) interrupt 1 using 0 324 { 325 1 TH0=0xdc; //10ms定时 326 1 TL0=0x00; 327 1 328 1 display[0]++; //0.01S 329 1 330 1 if(display[0]==10) 331 1 { 332 2 display[0]=0; 333 2 display[1]++; //0.1S 334 2 } 335 1 if(display[1]==10) 336 1 { 337 2 display[1]=0; 338 2 display[2]++; //秒个位 339 2 } 340 1 if(display[2]==10) 341 1 { 342 2 display[2]=0; 343 2 display[3]++; //秒十位 344 2 } 345 1 if(display[3]==6) 346 1 { 347 2 display[3]=0; 348 2 display[4]++; //分个位 349 2 } 350 1 if(display[4]==10) 351 1 { 352 2 display[4]=0; 353 2 display[5]++; //分十位 354 2 } 355 1 if(display[5]==6) 356 1 { 357 2 display[5]=0; 358 2 display[6]++; //时 359 2 } 360 1 if(display[6]==24) 361 1 { 362 2 display[6]=0; 363 2 } 364 1 } 365 C51 COMPILER V8.02 1602_MIAOBIAO 06/29/2010 13:14:05 PAGE 7 366 /*********************************************************/ MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 634 ---- CONSTANT SIZE = 136 ---- XDATA SIZE = ---- ---- PDATA SIZE = ---- ---- DATA SIZE = 16 ---- IDATA SIZE = ---- ---- BIT SIZE = ---- 1 END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)