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

📄 display.lst

📁 51单片机C语言常用模块与综合系统设计实例精讲
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.06   DISPLAY                                                               10/13/2006 09:21:09 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE DISPLAY
OBJECT MODULE PLACED IN display.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE display.c LARGE BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include <stdio.h>
   2          #include <absacc.h>
   3          #include <./Atmel/at89x52.h>
   4          #include <string.h>
   5          #include <intrins.h>
   6          #include "source.h"
   7          //#include <intrins.h>
   8          /*输入的X为以8个点为单位,Y以一个点为单位,宽度也是以8个点为单位的,高度以一个点为单位的.*/
   9          unsigned char zero_buf[100]={//为全0的数据,在清除某行的时候用
  10                  0,0,0,0,0,0,0,0,0,0,
  11                  0,0,0,0,0,0,0,0,0,0,
  12                  0,0,0,0,0,0,0,0,0,0,
  13                  0,0,0,0,0,0,0,0,0,0,
  14                  0,0,0,0,0,0,0,0,0,0,
  15                  0,0,0,0,0,0,0,0,0,0,
  16                  0,0,0,0,0,0,0,0,0,0,
  17                  0,0,0,0,0,0,0,0,0,0,
  18                  0,0,0,0,0,0,0,0,0,0,
  19                  0,0,0,0,0,0,0,0,0,0,
  20          };
  21          void clear_all(void){
  22   1              unsigned int cnt;
  23   1              for(cnt=VRAM_BASE;cnt<VRAM_LEN;cnt++){
  24   2                      XBYTE[cnt]=0X00;
  25   2              }
  26   1      }
  27          /**在orgx,orgy的位置上显示宽度为8,高度为depth的图片**/
  28          void draw_wordw8(unsigned char orgx,unsigned int orgy,unsigned char depth,unsigned char *buf){
  29   1              unsigned char row;
  30   1              unsigned int basex;
  31   1              basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
  32   1              for(row=0;row<depth;row++){
  33   2                      XBYTE[basex]=buf[row];
  34   2                      basex +=SCREEN_WIDTH;
  35   2              }
  36   1      }
  37          /**在orgx,orgy的位置上显示宽度为16,高度为depth的图片**/
  38          void draw_wordw16(unsigned char orgx,unsigned int orgy,unsigned char depth,unsigned char *buf){
  39   1              unsigned char row;
  40   1              unsigned int temp;
  41   1              unsigned int basex;
  42   1              basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
  43   1              for(row=0;row<depth;row++){
  44   2                      temp=row<<1;
  45   2                      XBYTE[basex]=buf[temp];
  46   2                      XBYTE[basex+1]=buf[temp+1];
  47   2                      basex +=SCREEN_WIDTH;
  48   2              }
  49   1      }
  50          /**在orgx,orgy的位置上显示宽度为24,高度为depth的图片**/
  51          void draw_wordw24(unsigned char orgx,unsigned int orgy,unsigned char depth,unsigned char *buf){
  52   1              unsigned char row;
  53   1              unsigned int temp;
  54   1              unsigned int basex;
  55   1              basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
C51 COMPILER V7.06   DISPLAY                                                               10/13/2006 09:21:09 PAGE 2   

  56   1              for(row=0;row<depth;row++){
  57   2                      temp=row<<1;
  58   2                      temp +=row;//temp=3*row
  59   2                      XBYTE[basex]=buf[temp];
  60   2                      XBYTE[basex+1]=buf[temp+1];
  61   2                      XBYTE[basex+2]=buf[temp+2];
  62   2                      basex +=SCREEN_WIDTH;
  63   2              }
  64   1      }
  65          /**在orgx,orgy的位置上显示宽度为32,高度为depth的图片**/
  66          void draw_wordw32(unsigned char orgx,unsigned int orgy,unsigned char depth,unsigned char *buf){
  67   1              unsigned char row;
  68   1              unsigned int temp;
  69   1              unsigned int basex;
  70   1              basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
  71   1              for(row=0;row<depth;row++){
  72   2                      temp=row<<2;
  73   2                      XBYTE[basex  ]=buf[temp  ];
  74   2                      XBYTE[basex+1]=buf[temp+1];
  75   2                      XBYTE[basex+2]=buf[temp+2];
  76   2                      XBYTE[basex+3]=buf[temp+3];
  77   2                      basex +=SCREEN_WIDTH;
  78   2              }
  79   1      }
  80          /**在orgx,orgy的位置上显示宽度为48,高度为depth的图片**/
  81          void draw_wordw48(unsigned char orgx,unsigned int orgy,unsigned char depth,unsigned char *buf){
  82   1              unsigned char row;
  83   1              unsigned int temp;
  84   1              unsigned int basex;
  85   1              basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
  86   1              for(row=0;row<depth;row++){
  87   2                      temp=row<<2;
  88   2                      temp +=row<<1;
  89   2                      XBYTE[basex  ]=buf[temp  ];
  90   2                      XBYTE[basex+1]=buf[temp+1];
  91   2                      XBYTE[basex+2]=buf[temp+2];
  92   2                      XBYTE[basex+3]=buf[temp+3];
  93   2                      XBYTE[basex+4]=buf[temp+4 ];
  94   2                      XBYTE[basex+5]=buf[temp+5];
  95   2                      basex +=SCREEN_WIDTH;
  96   2              }
  97   1      }
  98          /**在orgx,orgy的位置上显示宽度为24,高度为24的图片**/
  99          void draw_wordw24x24(unsigned char orgx,unsigned int orgy,unsigned char *buf){
 100   1              unsigned char row;
 101   1              unsigned int temp;
 102   1              unsigned int basex;
 103   1              basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
 104   1              for(row=0;row<3;row++){
 105   2                      temp=row<<1;
 106   2                      temp +=row;
 107   2                      XBYTE[basex]=buf[temp];
 108   2                      XBYTE[basex+1]=buf[temp+1];
 109   2                      XBYTE[basex+2]=buf[temp+2];
 110   2                      basex +=SCREEN_WIDTH;
 111   2              }       
 112   1      }
 113          /**在orgx,orgy点阵为24x24,区码为qh,位码为wh的汉字**/
 114          void draw_hz24x24(unsigned char orgx,unsigned int orgy,unsigned char qh,unsigned char wh){
 115   1              union SFADD offset;
 116   1              unsigned int ladd;
 117   1              unsigned int basex;
C51 COMPILER V7.06   DISPLAY                                                               10/13/2006 09:21:09 PAGE 3   

 118   1              unsigned char i;
 119   1              if(qh<16){//汉字库的区码从15开始
 120   2                      return;
 121   2              }
 122   1              offset.l=(94*(qh-16)+(wh-1));//区位码与flash的对应关系
 123   1              offset.l *=72;
 124   1              offset.l +=FLASH_ADD_HZK24X24_START;//把其转换为flash可以寻址的范围
 125   1              ladd=offset.i[1];
 126   1              ladd &=FLASH_ADD_MASK;
 127   1              ladd |=FLASH_SPACE_START;//分离出flash的低位地址
 128   1              offset.l <<=2;
 129   1              FLASHADD=offset.c[1];//分离出flash的高位地址
 130   1              basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;//确定图片在屏幕上的位置
 131   1              if(ladd>=(FLASH_SPACE_END-3*24)){//因为每个汉字使用72个字节,表明其跨越了flash的高位地址.
 132   2                      for(i=0;i<24;i++){
 133   3                              XBYTE[basex  ]=XBYTE[ladd];
 134   3                              if(ladd==FLASH_SPACE_END){//高位地址跨越16K字节,高位要进一
 135   4                                      FLASHADD=offset.c[1]+1;//高位地址进一
 136   4                                      ladd=0;
 137   4                              }
 138   3                              else{//没有跨越16K字节地址
 139   4                                              ladd++;//低位地址加一
 140   4                              }
 141   3                              XBYTE[basex+1]=XBYTE[ladd];
 142   3                              if(ladd==FLASH_SPACE_END){
 143   4                                      FLASHADD=offset.c[1]+1;
 144   4                                      ladd=0;
 145   4                              }
 146   3                              else{
 147   4                                              ladd++;
 148   4                              }
 149   3                              XBYTE[basex+2]=XBYTE[ladd];     
 150   3                              if(ladd==FLASH_SPACE_END){
 151   4                                      FLASHADD=offset.c[1]+1;
 152   4                                      ladd=0;
 153   4                              }
 154   3                              else{
 155   4                                              ladd++;
 156   4                              }                                               
 157   3                              basex +=SCREEN_WIDTH;
 158   3                      }
 159   2              }
 160   1              else{//没有跨越16K字节地址
 161   2                      for(i=0;i<24;i++){
 162   3                              memcpy((unsigned char *)basex,(unsigned char *)ladd,3);//字节显示
 163   3                              ladd +=3;//FLASH地址加3
 164   3                              basex +=SCREEN_WIDTH;//换下一行
 165   3                      }
 166   2              }
 167   1      }
 168          /**在orgx,orgy点阵为24x24汉字字库扩展为48x48,区码为qh,位码为wh的汉字**/
 169          void draw_double_hz24x24(unsigned char orgx,unsigned int orgy,unsigned char qh,unsigned char wh){
 170   1              union SFADD offset;
 171   1              unsigned char frtemp[3];
 172   1              unsigned int ladd;
 173   1              unsigned int basex;
 174   1              unsigned char i;
 175   1              if(qh<16){//汉字库的区码从15开始
 176   2                      return;
 177   2              }
 178   1              offset.l=(94*(qh-16)+(wh-1));//区位码与flash的对应关系
 179   1              offset.l *=72;
C51 COMPILER V7.06   DISPLAY                                                               10/13/2006 09:21:09 PAGE 4   

 180   1              offset.l +=FLASH_ADD_HZK24X24_START;//把其转换为flash可以寻址的范围
 181   1              ladd=offset.i[1];
 182   1              ladd &=FLASH_ADD_MASK;
 183   1              ladd |=FLASH_SPACE_START;//分离出flash的低位地址
 184   1              offset.l <<=2;
 185   1              FLASHADD=offset.c[1];//分离出flash的高位地址
 186   1              basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;//确定图片在屏幕上的位置
 187   1              if(ladd>=(FLASH_SPACE_END-3*24)){//因为每个汉字使用72个字节,表明其跨越了flash的高位地址.
 188   2                      for(i=0;i<24;i++){      
 189   3                              frtemp[0]=XBYTE[ladd];//取出第一字节的数据
 190   3                              if(ladd==FLASH_SPACE_END){//高位地址跨越16K字节,高位要进一
 191   4                                      FLASHADD=offset.c[1]+1;//高位地址进一
 192   4                                      ladd=0;
 193   4                              }
 194   3                              else{//没有跨越16K字节地址
 195   4                                              ladd++;//低位地址加一
 196   4                              }
 197   3                              frtemp[1]=XBYTE[ladd];//取出第二字节的数据
 198   3                              if(ladd==FLASH_SPACE_END){
 199   4                                      FLASHADD=offset.c[1]+1;
 200   4                                      ladd=0;
 201   4                              }
 202   3                              else{
 203   4                                              ladd++;
 204   4                              }
 205   3                              frtemp[2]=XBYTE[ladd];//取出第三字节的数据
 206   3                              if(ladd==FLASH_SPACE_END){
 207   4                                      FLASHADD=offset.c[1]+1;
 208   4                                      ladd=0;
 209   4                              }
 210   3                              else{
 211   4                                              ladd++;
 212   4                              }       
 213   3                              /**下面把一行长度扩展一倍同时变成二行显示**/                    
 214   3                              XBYTE[basex  ]=double_byte[frtemp[0]][0];
 215   3                              XBYTE[basex+1]=double_byte[frtemp[0]][1];
 216   3                              XBYTE[basex+2]=double_byte[frtemp[1]][0];
 217   3                              XBYTE[basex+3]=double_byte[frtemp[1]][1];
 218   3                              XBYTE[basex+4]=double_byte[frtemp[2]][0];
 219   3                              XBYTE[basex+5]=double_byte[frtemp[2]][1];
 220   3                              basex +=SCREEN_WIDTH;
 221   3                              XBYTE[basex  ]=double_byte[frtemp[0]][0];
 222   3                              XBYTE[basex+1]=double_byte[frtemp[0]][1];
 223   3                              XBYTE[basex+2]=double_byte[frtemp[1]][0];
 224   3                              XBYTE[basex+3]=double_byte[frtemp[1]][1];
 225   3                              XBYTE[basex+4]=double_byte[frtemp[2]][0];
 226   3                              XBYTE[basex+5]=double_byte[frtemp[2]][1];
 227   3                              basex +=SCREEN_WIDTH;
 228   3                      }
 229   2              }
 230   1              else{
 231   2                      for(i=0;i<24;i++){
 232   3                              frtemp[0]=XBYTE[ladd];ladd++;
 233   3                              frtemp[1]=XBYTE[ladd];ladd++;
 234   3                              frtemp[2]=XBYTE[ladd];ladd++;

⌨️ 快捷键说明

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