⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 340_lcd.lst

📁 与320*240相连的DS1302时钟程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 218          
 219           void writecode(uchar ins)                                  //向液晶控制模块写命令
 220               {
 221   1            uchar xdata t;
 222   1                uint xdata j;
 223   1              
 224   1                for(j=0;j<500;j++);   
 225   1                virt_port|=ins&0xf0;                                  //取高字节向1602写数据 
 226   1                writelcd(virt_port);                                  //先写高4位后再写低4位 这是在选择四个数据线的时候
 227   1           
 228   1                virt_port|=0x08;                                                
 229   1                writelcd(virt_port);                                  //使能E脚为高电平
 230   1            virt_port&=~0x08;                                 
 231   1                writelcd(virt_port);                                  //使能E脚为低电平
 232   1      
 233   1            t=ins<<4;             
 234   1            virt_port|=t&0xf0;                                //取低字节向1602写数据
 235   1                writelcd(virt_port);
 236   1            virt_port|=0x08;                                          //使能E脚为高电平
 237   1                writelcd(virt_port);
 238   1            virt_port&=~0x08;                                     //使能E脚为低电平
 239   1                writelcd(virt_port);
C51 COMPILER V8.05a   340_LCD                                                              05/16/2009 15:36:50 PAGE 5   

 240   1            virt_port=0;
 241   1                writelcd(virt_port);
 242   1           }
 243          
 244          void writedata(uchar d)                                    //写数据到1602
 245               {
 246   1            uchar xdata i,t;
 247   1                uint xdata j;
 248   1      
 249   1            for(j=0;j<500;j++);               
 250   1            virt_port|=0x02;                                     //光标返回指令
 251   1                writelcd(virt_port);
 252   1            virt_port|=d&0xf0;                                   //取高字节数据给数据寄存器
 253   1                writelcd(virt_port);
 254   1            virt_port|=0x08;                     //使能E脚为高电平
 255   1                writelcd(virt_port);
 256   1            virt_port&=0xf7;                             //使能E脚为低电平
 257   1                writelcd(virt_port);
 258   1            virt_port&=0x07;                                     //设置光标右移,文字也右移
 259   1            writelcd(virt_port);
 260   1                     
 261   1            t=d&0x0f;
 262   1            virt_port|=t<<4;                                     //取低字节数据给数据寄存器
 263   1                writelcd(virt_port);
 264   1      
 265   1                virt_port|=0x08;                                 //使能E脚为高电平
 266   1                writelcd(virt_port);
 267   1            for(i=3;i>0;i--); 
 268   1            virt_port&=0xf7;                     //使能E脚为低电平
 269   1                writelcd(virt_port);
 270   1            virt_port=0;                                                 //数据清零
 271   1                writelcd(virt_port);
 272   1          }
 273           void lcdchar (void)
 274          {
 275   1              uint xdata i,j,k;
 276   1              for(j=0;j<5000;j++);                  //数据读、写操作,画面不动
 277   1              for(k=0;k<5000;k++);
 278   1              for(i=0;i<2;i++)
 279   1              {
 280   2                      writedata(time_data[i]);
 281   2                      for(j=0;j<5000;j++);                  //数据读、写操作,画面不动
 282   2              for(k=0;k<5000;k++);
 283   2                      
 284   2              }
 285   1      
 286   1      
 287   1      }
 288          
 289           
 290          void lcdinit()
 291          {
 292   1           uint xdata i;
 293   1              
 294   1            virt_port=0x00;
 295   1                writelcd(virt_port);       //RS脚为零写指令寄存器      RW为低电平
 296   1            virt_port|=0x08;               //使能脚E=1
 297   1                writelcd(virt_port);
 298   1                virt_port&=0xf7;               //使E=0使能脚发生跳变高--低
 299   1                writelcd(virt_port);
 300   1                for(i=1000;i>0;i--);       //3次延时,重要!
 301   1                for(i=8000;i>0;i--);           //用延时代替查询         
C51 COMPILER V8.05a   340_LCD                                                              05/16/2009 15:36:50 PAGE 6   

 302   1      
 303   1          
 304   1            virt_port=0;                               //写入20码,设置为4位总线方式,非常重要!!!!!
 305   1                writelcd(virt_port);
 306   1            virt_port|=0x20;                   //只写高字节
 307   1                writelcd(virt_port);
 308   1            virt_port|=0x08;           //E=1
 309   1                writelcd(virt_port);
 310   1                for(i=20;i>0;i--);             //使命令执行
 311   1            virt_port&=0xf7;           //E=0
 312   1                writelcd(virt_port);
 313   1                for(i=10;i>0;i--);
 314   1            virt_port=0;
 315   1                writelcd(virt_port);
 316   1               
 317   1               
 318   1      
 319   1            writecode(0x38);          //设两行显示,4线方式5*10字符显示
 320   1            for(i=50;i>0;i--);
 321   1                  writecode(0x06);                    //光标右移
 322   1            for(i=50;i>0;i--);
 323   1               
 324   1                
 325   1                writecode(0x0c);                  //开显示指令
 326   1            for(i=50;i>0;i--);
 327   1            
 328   1               
 329   1            writecode(0x02);                  //光标返回指令
 330   1            for(i=50;i>0;i--);
 331   1                       
 332   1                writecode(0x01);                      //清屏指令
 333   1                for(i=50;i>0;i--);
 334   1      }
 335          void port_init()
 336          {
 337   1           P0MDOUT=0xff;
 338   1           XBR0      = 0x02;
 339   1           XBR1      = 0x40;
 340   1           P1MDOUT|= 0xDf;                    // /WR and /RD are push-pull
 341   1           P2MDOUT|= 0xFF;
 342   1           P3MDOUT  =0xFD;
 343   1           P4MDOUT |= 0xFF;
 344   1      
 345   1      
 346   1      }
 347          
 348          void main(void)
 349          {
 350   1         uint j;
 351   1      
 352   1         PCA0MD &= ~0x40;     //关闭看门狗定时器
 353   1         OSCICN |= 0x03;      //内部高频振荡器12M晶振做为系统时钟
 354   1         port_init();            //端口初始化
 355   1         EMIF_Init ();
 356   1         ether_reset_low();
 357   1         for(j=0;j<5000;j++);
 358   1         ether_reset_high ();
 359   1         INT0EN = 0x00;                         
 360   1         INT1EN = 0x00;
 361   1         SPI_Init();
 362   1         time_int_DS1302();
 363   1         IE = 0x40;
C51 COMPILER V8.05a   340_LCD                                                              05/16/2009 15:36:50 PAGE 7   

 364   1         EA=1;        
 365   1              lcdinit();
 366   1       //while(1) {
 367   1                
 368   1                         //液晶初始化
 369   1       while(1)
 370   1       { //
 371   2        EA=0;
 372   2        time_display_DS1302();
 373   2        EA=1;
 374   2        lcdchar();
 375   2        delay(60000);          
 376   2        delay(60000);
 377   2        delay(60000);
 378   2        delay(60000);
 379   2        delay(60000);
 380   2        delay(60000);  
 381   2        delay(60000);  
 382   2        delay(60000);  
 383   2        delay(60000);
 384   2          delay(60000);  delay(60000);  delay(60000);  delay(60000);  delay(60000);  delay(60000);  delay(60000)
             -;  delay(60000);      
 385   2        //time_display_DS1302();
 386   2        }
 387   1       
 388   1       }
 389          
 390          //}
 391          
 392          void spi_isr(void) interrupt 6 
 393          {
 394   1              if(SPIF)                
 395   1                      {
 396   2                      SPIF=0;
 397   2                      SPI_BUSY=0;
 398   2                      }
 399   1                      
 400   1      
 401   1              if(WCOL)
 402   1                      {
 403   2                      WCOL=0;
 404   2                      }
 405   1      }
 406          
 407           
 408          void ether_reset_low()
 409          {
 410   1         P1 &= ~0x01;               // Pull reset low
 411   1      }
 412          void ether_reset_high (void)
 413          {
 414   1         P1 |= 0x01;               // Allow /RST to rise
 415   1         while(!(P1 & 0x01));      // Wait for /RST to go high
 416   1      
 417   1      }
 418           
 419          void EMIF_Init (void)
 420          {
 421   1         EMI0CF = 0x1B;             // non-muxed mode; split mode
 422   1                                    // with bank select
 423   1         EMI0TC = EMIF_TIMING;      // This constant may be modified
 424   1                                    // according to SYSCLK to meet the
C51 COMPILER V8.05a   340_LCD                                                              05/16/2009 15:36:50 PAGE 8   

 425   1                                    // timing requirements for the CP2200
 426   1         EMI0CN = BASE_ADDRESS;     // Page of XRAM accessed by EMIF
 427   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1353    ----
   CONSTANT SIZE    =      8    ----
   XDATA SIZE       =     18      20
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     27       8
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -