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

📄 12232driver.lst

📁 单片机课程设计指导--源程序 89C52单片机+GSM模块
💻 LST
📖 第 1 页 / 共 3 页
字号:
 257   1      A = 0;                  //指令
 258   1      RW = 0;                 //写触发 
 259   1      data=instruction;       //指令码
 260   1      E2 = 0;                 //关Slaver
 261   1      }
 262          
 263          ////////////////////////////////////////////////////////////////////////////////
 264          //调用方式:void send_sd(uchar data)
 265          //函数说明:发数据data到从窗口(内函数,私有,用户不直接调用)
 266          ////////////////////////////////////////////////////////////////////////////////
 267          void send_sd(uchar c)
 268          {
 269   1      E1 = 0;                 //关Master
 270   1      E2 = 1;                 //开Slaver
 271   1      wait_ready();           //判断忙
 272   1      A = 1;                  //数据
 273   1      RW = 0;                 //写触发 
 274   1      data = c;               //数据
 275   1      E2 = 0;                 //关Slaver
 276   1      }
 277          
 278          ////////////////////////////////////////////////////////////////////////////////
 279          //等待ready:等待LCD内部操作完成,判忙
 280          ////////////////////////////////////////////////////////////////////////////////
 281          void wait_ready(void)
 282          {
 283   1      A = 0;                  //指令
 284   1      RW = 1;                 //读
 285   1      _nop_();                //空操作,产生汇编里面的nop
 286   1      while(data & status_busy); //读入LCD状态,1=忙,一直等待LCD内部操作完成
 287   1      }
 288          
 289          ////////////////////////////////////////////////////////////////////////////////
 290          //调用方式:void lcd_init(void)
 291          //函数说明:122x32LCD初始化,开机后仅调用一次
 292          ////////////////////////////////////////////////////////////////////////////////
 293          void lcd_init(void)
 294          {
 295   1      send_mi(reset);         //复位m-left,s-right
 296   1      send_si(reset);
 297   1      
 298   1      send_mi(disp_off);      //关闭显示
 299   1      send_si(disp_off);
 300   1      
 301   1      send_mi(dynamic_driver);//动态驱动
 302   1      send_si(dynamic_driver);
 303   1      
C51 COMPILER V7.09   12232DRIVER                                                           10/07/2004 17:58:58 PAGE 6   

 304   1      send_mi(clk32);         //1/32占空比
 305   1      send_si(clk32);
 306   1      
 307   1      send_mi(adc_select);    //clockwise
 308   1      send_si(adc_select);
 309   1      
 310   1      send_mi(modeRWite);     //写模式结束
 311   1      send_si(modeRWite);
 312   1      
 313   1      send_mi(col_addr_set);  //归回零列,设定显示起始行首
 314   1      send_mi(disp_start_line); 
 315   1      send_si(col_addr_set);
 316   1      send_si(disp_start_line);
 317   1      
 318   1      send_mi(disp_on);       //开显示
 319   1      send_si(disp_on); 
 320   1      }
 321          
 322          ////////////////////////////////////////////////////////////////////////////////
 323          //调用方式:void lcd_clr(void)
 324          //函数说明:清屏
 325          ////////////////////////////////////////////////////////////////////////////////
 326          void lcd_clr(void)
 327          {
 328   1      uchar i, page;
 329   1      for (page=0;page<4;page++)
 330   1        {
 331   2          send_mi(page_addr_set|page);//设置页从0-3
 332   2          send_si(page_addr_set|page);
 333   2          send_mi(0);         //主窗口设置为0列
 334   2          send_si(0);         //从窗口设置为0列 
 335   2          for (i=0;i<62;i++)  //全部写入0x00
 336   2            {
 337   3              send_md(0x00);
 338   3              send_sd(0x00);
 339   3            }
 340   2        }
 341   1      } 
 342          
 343          ////////////////////////////////////////////////////////////////////////////////
 344          //调用方式:void set_page(uchar page)
 345          //函数说明:同时设置主(右)从(左)显示页为0-3页
 346          ////////////////////////////////////////////////////////////////////////////////
 347          void set_page(uchar page)
 348          {
 349   1      send_mi(page_addr_set|page);
 350   1      send_si(page_addr_set|page);
 351   1      }
 352          
 353          ////////////////////////////////////////////////////////////////////////////////
 354          //调用方式:void SetAddress(uchar address)
 355          //函数说明:同时设置主(右)从(左)列地址为0-61列
 356          ////////////////////////////////////////////////////////////////////////////////
 357          void set_address(uchar address)
 358          {
 359   1      send_mi(address&0x7F); //&0x7F,考虑到防止越限
 360   1      send_si(address&0x7F);
 361   1      }
 362          
 363          ////////////////////////////////////////////////////////////////////////////////
 364          //调用方式:void putchar_l(uchar c)
 365          //函数说明:在左页(主窗口)当前地址画一个字节(8点)
C51 COMPILER V7.09   12232DRIVER                                                           10/07/2004 17:58:58 PAGE 7   

 366          ////////////////////////////////////////////////////////////////////////////////
 367          void putchar_l(uchar c)
 368          {
 369   1      send_md(c);
 370   1      }
 371          
 372          ////////////////////////////////////////////////////////////////////////////////
 373          //调用方式:void putchar_r(uchar c)
 374          //函数说明:在右页(从主窗口)当前地址画一个字节(8点)
 375          ////////////////////////////////////////////////////////////////////////////////
 376          void putchar_r(uchar c)
 377          {
 378   1      send_sd(c);
 379   1      } 
 380          
 381          ////////////////////////////////////////////////////////////////////////////////
 382          //调用方式:void draw_bmp(uchar col,uchar layer,uchar width,uchar *bmp)
 383          //函数说明:画一个图,横坐标是col,layer表示上下层,width是图形的宽,高固定16
 384          // bmp是图形指针
 385          // 使用Zimo3Pro软件,采用纵向取模,字节倒序得到数据。
 386          // col 图型的起始位置0~121
 387          // layer 图形的位置(Y坐标)0-上半部分 非0-下半部分
 388          // width 图形宽度8,16可选
 389          // bmp 图形数据指针
 390          ////////////////////////////////////////////////////////////////////////////////
 391          void draw_bmp(uchar col,uchar layer,uchar width,uchar *bmp)
 392          {
 393   1      uchar x; 
 394   1      uchar address;                  //address表示显存的物理地址
 395   1      uchar p=0; 
 396   1      uchar page=0;
 397   1      uchar window=0;                 //page表示上下两页,window表示左右窗口(0左,1右)
 398   1      if (layer) page=2;              //左-主窗口,右-从窗口
 399   1      
 400   1      for (x=col; x<col+width; x++)
 401   1      { 
 402   2        if (x>121)return;             //防止显示乱码
 403   2        if (x>60)                     //左右窗口定位
 404   2          {
 405   3            window=1;                         //右-从窗口
 406   3            address=x%61;
 407   3          }
 408   2        else
 409   2        {
 410   3          address=x;
 411   3        }                     //主窗口输出 
 412   2      
 413   2        set_page(page);               //上层数据输出
 414   2        set_address(address);
 415   2      
 416   2        if (window) 
 417   2          {
 418   3            putchar_r(bmp[p]); 
 419   3          }
 420   2        else
 421   2        {
 422   3          putchar_l(bmp[p]);
 423   3        } 
 424   2      
 425   2        set_page(page+1);             //下层数据输出
 426   2        set_address(address);                 //列保持不变 
 427   2      
C51 COMPILER V7.09   12232DRIVER                                                           10/07/2004 17:58:58 PAGE 8   

 428   2        if (window) 
 429   2           {
 430   3             putchar_r(bmp[p+width]); 
 431   3           }
 432   2        else
 433   2          {
 434   3            putchar_l(bmp[p+width]); 
 435   3           }
 436   2        p++;
 437   2        }
 438   1      }
 439          
 440          
 441          
 442          
 443          /*------------------------------------------------------------------------------
 444                            延时程序:入口unsinged char i ,延时i毫秒
 445          -------------------------------------------------------------------------------*/            
 446          
 447          delay(uchar i) 
 448          {
 449   1        uchar j;
 450   1        for(i=i<<1;i>0;i--)
 451   1        for(j=0xf3;j>0;j--)
 452   1        {}
 453   1      }
 454          
 455          //////////////////////////////////////////////////////////////////////////////
 456          //键盘扫描程序,有键按下,修改key值
 457          //////////////////////////////////////////////////////////////////////////////
 458          keywork(void)
 459          { 
 460   1        if(!(up&&down))       //是否有键按下
 461   1        {
 462   2           delay(20);         //延时5MS
 463   2           if(up&&down)       //再次判断是否有键按下,没有返回
 464   2           {
 465   3             return;
 466   3            }
 467   2           if(!up)            //查up键
 468   2             {
 469   3               while(!up);    //等待up键释放
 470   3               key ++;        //key值加1
 471   3               LED = 0;       //亮背光
 472   3               TR0 = 1;       //开定时器0,背光亮10S
 473   3               time_counter = 0;//清定时器软件计数器,从按键以后亮背光10S
 474   3               if (key == 3)  //key值超上限,置下限
 475   3                 {
 476   4                   key = 0;
 477   4                 }
 478   3               return;   
 479   3              }
 480   2           if(!down)          //查down键
 481   2             {
 482   3               while(!down);  //等待down键释放
 483   3               key --;        //key值减1
 484   3               LED = 0;       //亮背光
 485   3               TR0 = 1;       //开定时器0,背光亮10S
 486   3               time_counter = 0;//清定时器软件计数器,从按键以后亮背光10S
 487   3               if (key ==255)
 488   3                 {
 489   4                  key = 2;    ////key值超上限,置下限
C51 COMPILER V7.09   12232DRIVER                                                           10/07/2004 17:58:58 PAGE 9   

 490   4                 }
 491   3               return;
 492   3              }
 493   2          }
 494   1        
 495   1        
 496   1      }
 497          
 498          disp_transit()
 499          {
 500   1        uchar j, row = 0 ,temp;
 501   1        temp = (serial_buff[25]*10+serial_buff[26])*3/5;      //经度最后.XX分转换位秒
 502   1        serial_buff[25] = temp/10;
 503   1        serial_buff[26] = temp%10; 
 504   1        temp = (serial_buff[12]*10+serial_buff[13])*3/5;      //纬度最后.XX分转换为秒
 505   1        serial_buff[12] = temp/10;
 506   1        serial_buff[13] = temp%10;
 507   1        lcd_clr();                                    //清屏
 508   1        draw_bmp(0,0,16,azimuth[serial_buff[30]-20]); //判断东、西,并显示
 509   1        draw_bmp(16,0,16,jing);                       //显示'经'
 510   1        draw_bmp(32,0,8,num[13]);                     //显示':'
 511   1        for(j = 19;j<28;j++)                          //显示经度
 512   1          {
 513   2           if (j == 22)
 514   2             {
 515   3               draw_bmp(40+row*8,0,8,num[11]);        //显示数字度符号
 516   3               row++;
 517   3             }
 518   2           if (j == 24)
 519   2             {
 520   3               draw_bmp(40+row*8,0,8,num[12]);        //显示'''(分)
 521   3               row++;

⌨️ 快捷键说明

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