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 + -
显示快捷键?