upsd3300_lcd.lst

来自「增强型8位单片机upsd33xx系列芯片PWM结合ADC例程」· LST 代码 · 共 1,169 行 · 第 1/4 页

LST
1,169 行
字号
 831          
 832          
 833          /*---------------------------------------------------------------------------------------
 834          Function:
 835                  this function is used to converts low nibble of unsigned byte.
 836          Parameters:
 837                  byte: this unsigned byte is ready to converting.
 838          Note:
 839                  none
 840          
 841          ----------------------------------------------------------------------------------------*/
 842          char htoa_hi(unsigned char byte)         // converts hi nibble of unsigned byte
 843                                                   // (0-F hex) to ascii   
 844          {
 845   1              {
 846   2              byte = byte & 0xF0;     // keep upper nibble only   
 847   2              byte = byte >> 4;
C51 COMPILER V7.50   UPSD3300_LCD                                                          07/11/2005 15:30:33 PAGE 15  

 848   2              if (byte <= 0x09)
 849   2                      return(byte + 0x30);
 850   2              else
 851   2                      return (byte + 0x37);
 852   2              }
 853   1      }
 854          
 855          /*---------------------------------------------------------------------------------------
 856          printfLCD(chr_ptr) 
 857          
 858          This function is used to display a string of Chinese words and standard ASCII codes on
 859          the LCD display.
 860          
 861          chr_ptr - unsigned char*
 862                          - pointer to string to display on LCD.
 863          ----------------------------------------------------------------------------------------*/
 864          void printfLCD(unsigned char *ptr, ...) 
 865          {
 866   1              unsigned char c1,c2;
 867   1              unsigned int  c3;
 868   1      
 869   1              //unsigned char *var_ptr=&ptr+1;
 870   1              unsigned char var;
 871   1              unsigned char orig_buscon;
 872   1              #ifdef __RC51__ //use ANSI stdarg
                      va_list var_ptr;
                      va_start(var_ptr,0);
                      #else   
 876   1              unsigned char *var_ptr=&ptr+1;
 877   1              #endif
 878   1         orig_buscon = BUSCON;   // Save buscon value
 879   1         BUSCON |= 0x3C;           // Set Xdata Read/Write to max wait states
 880   1      
 881   1      
 882   1              if(ulayer >3)  //if page exceed the range 0 to 3,force it to 0.
 883   1                      ulayer = 0;
 884   1      
 885   1              while (*ptr != NULL) 
 886   1              {
 887   2                      c1 = *ptr;
 888   2                      c2 = *(ptr+1);
 889   2                      c3 = c1;
 890   2                      c3 = (c3<<8)|c2;
 891   2                      if(c1 <= 128)   // deal with asc code , if c1<=128 ,it will deal with asc code,otherwise Chinese word.
 892   2                      {
 893   3                              if ( *ptr == '\r')
 894   3                              {
 895   4                                      ptr++;
 896   4                                      ucol = 0;
 897   4                              }
 898   3                              else if( *ptr == '\n')
 899   3                              {
 900   4                                      ptr++;
 901   4                                      ucol = 0;
 902   4                                      ulayer++;
 903   4                              }
 904   3                              else if( *ptr == '%')
 905   3                              {
 906   4                                      ptr++;
 907   4                                      
 908   4                                      if (*ptr == 'd')
 909   4                                      {
C51 COMPILER V7.50   UPSD3300_LCD                                                          07/11/2005 15:30:33 PAGE 16  

 910   5                                              ptr++;
 911   5                                              #ifdef __RC51__ //use ANSI stdarg
                                                      var = *var_ptr--;
                                                      var_ptr--;
                                  #else       
 915   5                                              var = *var_ptr++;
 916   5                                              #endif
 917   5                                              c1 = (var & 0x0F)+'0';
 918   5                                              disp_one_asc(ucol,ulayer,c1,mode);
 919   5                                              ucol+=7;
 920   5                                      }
 921   4                                      else if (*ptr == 'x')
 922   4                                      {  
 923   5                                              #ifdef __RC51__ //use ANSI stdarg
                                                      var = *var_ptr--;
                                                      var_ptr--;
                                  #else       
 927   5                                              var = *var_ptr++;
 928   5                                              #endif
 929   5                                              c1 = htoa_hi(var);
 930   5                                              disp_one_asc(ucol,ulayer,c1,mode);
 931   5                                              ucol+=7;
 932   5                                              c1 = htoa_lo(var);
 933   5                                              disp_one_asc(ucol,ulayer,c1,mode);
 934   5                                              ucol+=7;
 935   5                                              ptr++;
 936   5                                      }
 937   4                                      else if (*ptr == 'w')
 938   4                                      {
 939   5                                              ptr++;
 940   5                                              #ifdef __RC51__ //use ANSI stdarg
                                                      var_ptr--;
                                                      var = *var_ptr;
                                                      
                                                      #else   
 945   5                                              var = *var_ptr++;
 946   5                                              #endif
 947   5                                              c1 = htoa_hi(var);
 948   5                                              disp_one_asc(ucol,ulayer,c1,mode);
 949   5                                              ucol+=7;
 950   5                                              c1 = htoa_lo(var);
 951   5                                              disp_one_asc(ucol,ulayer,c1,mode);
 952   5                                              ucol+=7;
 953   5                                              #ifdef __RC51__ //use ANSI stdarg
                                                      var_ptr++;
                                                      var = *var_ptr;
                                                      var_ptr-=2;                     
                                                      #else   
 958   5                                              var = *var_ptr++;
 959   5                                              #endif
 960   5                                              c1 = htoa_hi(var);
 961   5                                              disp_one_asc(ucol,ulayer,c1,mode);
 962   5                                              ucol+=7;
 963   5                                              c1 = htoa_lo(var);
 964   5                                              disp_one_asc(ucol,ulayer,c1,mode);
 965   5                                              ucol+=7;
 966   5      
 967   5                                      }
 968   4                                      else 
 969   4                                      {
 970   5                                              c1 = *ptr;
 971   5                                              disp_one_asc(ucol,ulayer,c1,mode);
C51 COMPILER V7.50   UPSD3300_LCD                                                          07/11/2005 15:30:33 PAGE 17  

 972   5                                              ucol+=7;
 973   5                                              ptr++;
 974   5                                      }
 975   4                              }
 976   3                              else
 977   3                              {                               
 978   4                                      disp_one_asc(ucol,ulayer,c1,mode);
 979   4                                      ucol+=7;
 980   4                                      ptr++;    // one asc need one byte in computer system
 981   4                              }
 982   3                      
 983   3                       }
 984   2                      #ifdef ENGLISH_CHINESE_FONT
                               else    //deal with Chinese, if c1<=128 ,it will deal with asc code, otherwise Chinese word.
                               {
              
                                      if(mode) 
                                              disp_one_ch(ucol,ulayer,c3,1);
                                      else    
                                              disp_one_ch(ucol,ulayer,c3,0);
                                      ucol+=16;  //16*16 Chinese dot matrix
                                      ptr += 2;  //one Chinese word need two byte in computer system
                              
                                }
                              #endif
 997   2              }
 998   1              BUSCON = orig_buscon;  // Restore buscon value
 999   1      }
1000          
1001          
1002          unsigned char font_detection(void) 
1003          {
1004   1              unsigned char xdata j,a,b;      
1005   1              unsigned char xdata *ascii;
1006   1      
1007   1              #ifdef ENGLISH_CHINESE_FONT
                      unsigned char xdata c,d;        
                      unsigned char xdata *chchar;
                  #endif
1011   1      
1012   1              extern xdata PSD_REGS PSD_reg;
1013   1      
1014   1              j = PSD_reg.PAGE;  // page number  will be changed in fetching ASC font data,so reserve page number first
1015   1      
1016   1              #ifndef ENGLISH_CHINESE_FONT
1017   1              ascii = (unsigned char xdata *)(FONT_BASE_ADDRESS);
1018   1              PSD_reg.PAGE =ENGLISH_FONT_PAGE; 
1019   1              a = ascii[0];
1020   1              b = ascii[1];
1021   1              #else
                      ascii = (unsigned char xdata *)(FONT_BASE_ADDRESS);
                      chchar = (unsigned char xdata *)(FONT_BASE_ADDRESS);
                      PSD_reg.PAGE =ENGLISH_FONT_PAGE; 
                      a = ascii[0];
                      b = ascii[1];
                      PSD_reg.PAGE =CHINESE_FONT_PAGE;
                      c = chchar[0];
                      d = chchar[1];
                      #endif
1031   1      
1032   1      
1033   1          // If the font is not detected in the flash 
C51 COMPILER V7.50   UPSD3300_LCD                                                          07/11/2005 15:30:33 PAGE 18  

1034   1          // then display a bitmapped "no font" message on the LCD
1035   1      
1036   1              #ifndef ENGLISH_CHINESE_FONT
1037   1                      if ((a == E_FONT_DETECT_BYTE_0) && (b == E_FONT_DETECT_BYTE_1)) 
1038   1              #else
                              if (  (a == E_FONT_DETECT_BYTE_0) && (b == E_FONT_DETECT_BYTE_1)  && 
                                      (c == C_FONT_DETECT_BYTE_0) && (d == C_FONT_DETECT_BYTE_1) )  
                      #endif
1042   1      
1043   1              {
1044   2                      return(0);        // Indicate the font was detected.
1045   2              }
1046   1          else              // Font not detected, so display bitmapped messaged.
1047   1              { 
1048   2                      DrawBmp(0,0,7,nn);    // n    
1049   2                      DrawBmp(8,0,7,oo);    // o
1050   2      
1051   2                      DrawBmp(24,0,7,ff);   // f
1052   2                      DrawBmp(32,0,7,oo);   // o   
1053   2                      DrawBmp(40,0,7,nn);   // n
1054   2                      DrawBmp(48,0,7,tt);   // t
1055   2      
1056   2                      return(1);    // Indicate the font was not detected.
1057   2              }
1058   1      } 
1059          
1060          /*---------------------------------------------------------------------------------------
1061          Function:
1062                  this function is used to merge LCD initialization and set display start line and column address. 
1063          Parameters:
1064                  ptr: none
1065          Note:
1066                  this function only used once just before user start using void printfLCD(unsigned char *ptr, ...).
1067          
1068          ----------------------------------------------------------------------------------------*/
1069          
1070          void lcd_init(void)  
1071          {
1072   1              unsigned char orig_buscon;
1073   1          orig_buscon = BUSCON;   // Save buscon value
1074   1          BUSCON |= 0x3C;           // Set Xdata Read/Write to max wait states 
1075   1              ///////////////////////LCD initialization/////////
1076   1              BusyCheck();
1077   1              LcdConfig ( );  
1078   1              lcd_clear ( );  
1079   1              //////////////////////////set display start line and column address/////////
1080   1              OutMasterCom ( 0xC0 );
1081   1              OutSlaveCom ( 0xC0 );
1082   1              OutMasterCom ( 0x00 );
1083   1              OutSlaveCom ( 0x00 );
1084   1      
1085   1          if (font_detection())  // If font not detected,
1086   1              {
1087   2              while(1);              // wait here forever.
1088   2              }
1089   1              BUSCON = orig_buscon;  // Restore buscon value
1090   1      }
1091          
1092          
1093          
1094          
1095          
C51 COMPILER V7.50   UPSD3300_LCD                                                          07/11/2005 15:30:33 PAGE 19  



MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1089    ----
   CONSTANT SIZE    =     56    ----
   XDATA SIZE       =   ----       3
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     17      44
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       2
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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