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

📄 display.lst

📁 51单片机C语言常用模块与综合系统设计实例精讲
💻 LST
📖 第 1 页 / 共 2 页
字号:
 235   3                              /**下面把一行长度扩展一倍同时变成二行显示**/    
 236   3                              XBYTE[basex  ]=double_byte[frtemp[0]][0];
 237   3                              XBYTE[basex+1]=double_byte[frtemp[0]][1];
 238   3                              XBYTE[basex+2]=double_byte[frtemp[1]][0];
 239   3                              XBYTE[basex+3]=double_byte[frtemp[1]][1];
 240   3                              XBYTE[basex+4]=double_byte[frtemp[2]][0];
 241   3                              XBYTE[basex+5]=double_byte[frtemp[2]][1];
C51 COMPILER V7.06   DISPLAY                                                               10/13/2006 09:21:09 PAGE 5   

 242   3                              basex +=SCREEN_WIDTH;
 243   3                              XBYTE[basex  ]=double_byte[frtemp[0]][0];
 244   3                              XBYTE[basex+1]=double_byte[frtemp[0]][1];
 245   3                              XBYTE[basex+2]=double_byte[frtemp[1]][0];
 246   3                              XBYTE[basex+3]=double_byte[frtemp[1]][1];
 247   3                              XBYTE[basex+4]=double_byte[frtemp[2]][0];
 248   3                              XBYTE[basex+5]=double_byte[frtemp[2]][1];
 249   3                              basex +=SCREEN_WIDTH;
 250   3                      }
 251   2              }
 252   1      }
 253          /***在屏幕上显示大数字的图片,其为112x170,每个数字被安排在没4K字节的起始空间,所以不存在跨越16K边界的问题
             -**/
 254          void draw_storey(unsigned char orgx,unsigned int orgy,unsigned char num){//this is 112x170
 255   1              unsigned char row;
 256   1              unsigned int basex;
 257   1              unsigned int ladd;
 258   1              union SFADD offset;
 259   1              basex=0x8000+SCREEN_WIDTH*orgy+orgx;
 260   1              //draw picture from flash. 4kbyte per picture 
 261   1              offset.l=num;
 262   1              offset.l <<=12;//乘以4K,因为每个大数字图片占用4K字节的空间
 263   1              offset.l +=FLASH_ADD_STORY_START;
 264   1              ladd=offset.i[1];
 265   1              ladd &=FLASH_ADD_MASK;
 266   1              ladd |=FLASH_SPACE_START;//分离出flash的低位地址
 267   1              offset.l <<=2;
 268   1              FLASHADD=offset.c[1];//分离出flash的高位地址
 269   1              basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;//确定图片在屏幕上的位置
 270   1              for(row=0;row<STOREY_HEIGHT;row++){
 271   2                      memcpy((unsigned char *)basex,(unsigned char *)ladd,STOREY_WIDTH);
 272   2                      ladd +=STOREY_WIDTH;
 273   2                      basex +=SCREEN_WIDTH;
 274   2              }       
 275   1      }
 276          /**画向下的箭头图片为96x97点阵**/
 277          void draw_downarrow(unsigned char orgx,unsigned int orgy){
 278   1              unsigned char row;
 279   1              unsigned int temp;
 280   1              unsigned int basex;
 281   1              unsigned char *buf;
 282   1              buf=downarrow;//12x97
 283   1              basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
 284   1              /**箭头图片是存储在单片机的程序空间,可以直接寻址**/
 285   1              for(row=0;row<ARROW_HEIGHT;row++){
 286   2                      temp=row*ARROW_WIDTH;
 287   2                      memcpy((unsigned char *)basex,(unsigned char *)buf+temp,ARROW_WIDTH);
 288   2                      basex +=SCREEN_WIDTH;
 289   2              }
 290   1      }
 291          /**画向上的箭头图片为96x97点阵,是把向下的箭头图片上下颠倒一下就可以了**/
 292          void draw_uparrow(unsigned char orgx,unsigned int orgy){
 293   1              unsigned char row;
 294   1              unsigned int temp;
 295   1              unsigned int basex;
 296   1              unsigned char *buf;
 297   1              unsigned int top_num;
 298   1              top_num=ARROW_WIDTH*(ARROW_HEIGHT-1);
 299   1              buf=downarrow;//12x97
 300   1              basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
 301   1              for(row=0;row<ARROW_HEIGHT;row++){//ARROW_HEIGHT=97
 302   2                      temp=top_num-row*ARROW_WIDTH;
C51 COMPILER V7.06   DISPLAY                                                               10/13/2006 09:21:09 PAGE 6   

 303   2                      memcpy((unsigned char *)basex,(unsigned char *)buf+temp,ARROW_WIDTH);
 304   2                      basex +=SCREEN_WIDTH;
 305   2              }
 306   1      }
 307          /*画24x48的ASSCII字符,因为此字符不在汉字字库中,       存储的形式只有位码*/
 308          void draw_asc24x48(unsigned char orgx,unsigned int orgy,unsigned char wh){
 309   1              union SFADD offset;
 310   1              unsigned int ladd;
 311   1              unsigned int basex;
 312   1              unsigned char i;
 313   1              offset.l=wh;
 314   1              offset.l *=144;//每个字符是144个字节
 315   1              offset.l +=FLASH_ADD_ASC48X48_START;
 316   1              ladd=offset.i[1];
 317   1              ladd &=0x3fff;
 318   1              ladd |=FLASH_SPACE_START;
 319   1              offset.l <<=2;
 320   1              FLASHADD=offset.c[1];
 321   1              basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
 322   1              for(i=0;i<48;i++){
 323   2                      XBYTE[basex  ]=XBYTE[ladd];ladd++;
 324   2                      XBYTE[basex+1]=XBYTE[ladd];ladd++;
 325   2                      XBYTE[basex+2]=XBYTE[ladd];ladd++;
 326   2                      basex +=SCREEN_WIDTH;
 327   2              }
 328   1      }
 329          void draw_asc16x24(unsigned char orgx,unsigned int orgy,unsigned char wh){
 330   1              union SFADD offset;
 331   1              unsigned int ladd;
 332   1              unsigned int basex;
 333   1              unsigned char i;
 334   1              offset.l=wh+32;//英文的区位码减32为ASCII的数值。
 335   1              offset.l *=48;//perword is 48 bytes.
 336   1              offset.l +=FLASH_ADD_ASC16X24_START;
 337   1              ladd=offset.i[1];
 338   1              ladd &=FLASH_ADD_MASK;
 339   1              ladd |=FLASH_SPACE_START;
 340   1              offset.l <<=2;
 341   1              FLASHADD=offset.c[1];
 342   1              basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
 343   1              for(i=0;i<24;i++){
 344   2                      XBYTE[basex  ]=XBYTE[ladd];ladd++;
 345   2                      XBYTE[basex+1]=XBYTE[ladd];ladd++;
 346   2                      basex +=SCREEN_WIDTH;
 347   2              }
 348   1      }
 349          /**显示从串口传输过来的信息**/
 350          void show_elvinfo(struct NOTICE *info){
 351   1              unsigned char orgtemp,ad_len,cnt,temp,hzqh,hzwh;
 352   1              unsigned int cur_y;
 353   1              ad_len=info->len;/*表示显示汉字的长度*/
 354   1              ad_len >>=1;//由于一个汉字要一个区码和一个位码表示,所以整个要显示的汉字数为文字长度除2
 355   1              orgtemp=POS_NOTICE_ORGX;
 356   1              cur_y=POS_NOTICE_SINGEL_LINE_ORGY;
 357   1              for(cnt=0;cnt<ad_len;cnt++){// draw_hz24x24
 358   2                      temp=cnt<<1;//第一个区码,第二个是位码
 359   2                      hzqh=info->buf[temp];
 360   2                      if(hzqh<HZK24X24_QH_START){//IT IS OUT OF HZK24X24
 361   3                              if(hzqh==3){//是英文和数值区域。
 362   4                                      if((orgtemp+QW_ASSCII_SPACE)<SCREEN_WIDTH){//是空格
 363   5                                              draw_asc24x48(orgtemp,cur_y,info->buf[temp+1]);
 364   5                                              orgtemp +=QW_ASSCII_SPACE;
C51 COMPILER V7.06   DISPLAY                                                               10/13/2006 09:21:09 PAGE 7   

 365   5                                      }
 366   4                              }
 367   3                              else if(hzqh==10){//是控制字符
 368   4                                      hzwh=info->buf[temp+1];
 369   4                                      if((hzwh&0xf0)==0x20){//是空格空格
 370   5                                              hzwh &=0x0f;
 371   5                                              hzwh +=1;
 372   5                                              orgtemp +=QW_ASSCII_SPACE*hzwh;
 373   5                                      }
 374   4                                      else if(hzwh==0x0a){//是回车
 375   5                                              cur_y +=POS_NOTICE_LINE_HIGH;//换到下一行
 376   5                                              orgtemp=0;
 377   5                                      }
 378   4                              }
 379   3                      }
 380   2                      else{//是汉字
 381   3                              if((orgtemp+QW_HZ_SPACE)<SCREEN_WIDTH){
 382   4                                      draw_double_hz24x24(orgtemp,cur_y,hzqh,info->buf[temp+1]);//写汉字
 383   4                                      orgtemp +=QW_HZ_SPACE;//显示位置到下一个汉字
 384   4                              }
 385   3                      }
 386   2              }
 387   1      }
 388          /*在orgx,orgy处清除宽度为8高度为depth的区域*/
 389          void clr_wordw8(unsigned char orgx,unsigned int orgy,unsigned char depth){
 390   1              unsigned char row;
 391   1              unsigned int basex;
 392   1              basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
 393   1              for(row=0;row<depth;row++){
 394   2                      XBYTE[basex]=0;;
 395   2                      basex +=SCREEN_WIDTH;
 396   2              }
 397   1      }
 398          /*在orgx,orgy处清除宽度为16高度为depth的区域*/
 399          void clr_wordw16(unsigned char orgx,unsigned int orgy,unsigned char depth){
 400   1              unsigned char row;
 401   1              unsigned int basex;
 402   1              basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
 403   1              for(row=0;row<depth;row++){
 404   2                      memcpy((unsigned char *)basex,(unsigned char *)zero_buf,2);
 405   2                      basex +=SCREEN_WIDTH;
 406   2              }
 407   1      }
 408          /*在orgx,orgy处清除宽度为24高度为depth的区域*/
 409          void clr_wordw24(unsigned char orgx,unsigned int orgy,unsigned char depth){
 410   1              unsigned char row;
 411   1              unsigned int basex;
 412   1              basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
 413   1              for(row=0;row<depth;row++){
 414   2                      memcpy((unsigned char *)basex,(unsigned char *)zero_buf,3);
 415   2                      basex +=SCREEN_WIDTH;
 416   2              }
 417   1      }
 418          /*在orgx,orgy处清除宽度为32高度为depth的区域*/
 419          void clr_wordw32(unsigned char orgx,unsigned int orgy,unsigned char depth){
 420   1              unsigned char row;
 421   1              unsigned int basex;
 422   1              basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
 423   1              for(row=0;row<depth;row++){
 424   2                      memcpy((unsigned char *)basex,(unsigned char *)zero_buf,4);
 425   2                      basex +=SCREEN_WIDTH;
 426   2              }
C51 COMPILER V7.06   DISPLAY                                                               10/13/2006 09:21:09 PAGE 8   

 427   1      }
 428          /*在orgx,orgy处清除宽度为width高度为depth的区域,是通用的清除函数*/
 429          void clr_area(unsigned char org_x,unsigned int org_y,unsigned char width,unsigned char height){
 430   1              unsigned char row;
 431   1              unsigned char column;
 432   1              unsigned int tempa,tempb;
 433   1              for(row=0;row<height;row++){
 434   2                      tempa=VRAM_BASE+SCREEN_WIDTH*(org_y+row)+org_x;
 435   2                      tempb=width*row;
 436   2                      for(column=0;column<width;column++){
 437   3                              XBYTE[tempa+column]=0x00;
 438   3                      }
 439   2              }
 440   1      }
 441          /*在orgx,orgy处清除箭头*/
 442          void clr_arrow(unsigned char orgx,unsigned int orgy){
 443   1              unsigned char row;
 444   1              unsigned int basex;
 445   1              basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
 446   1              for(row=ARROW_HEIGHT;row>0;row--){
 447   2                      memcpy((unsigned char *)basex,(unsigned char *)zero_buf,ARROW_WIDTH);
 448   2                      basex +=SCREEN_WIDTH;
 449   2              }
 450   1      }
 451          /*清除显示信息的区域*/
 452          void clr_notice(void){
 453   1              unsigned int j,basex;
 454   1              basex=VRAM_BASE+SCREEN_WIDTH*POS_NOTICE_TOP+POS_NOTICE_ORGX;
 455   1              for(j=POS_NOTICE_TOP;j<SCREEN_HIGHT;j++){
 456   2                      memcpy((unsigned char *)basex,(unsigned char *)zero_buf,SCREEN_WIDTH-POS_NOTICE_ORGX);
 457   2                      basex +=SCREEN_WIDTH;
 458   2              }
 459   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   4777    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =    100     168
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   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 + -