解放大官人rust开挂:S3C2440-LCD字符显示

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 07:51:17

LCD字符显示有两种方式,一个是通过字模提取软件,将字符转化成一个字节型的数组,另一个是使用字库。如果字符较多的时候,直接使用字库比较方便。现在说一下中英文字符的存储结构和编码方式。中英文的字符点阵结构有4*8,8*16,16*16,24*24,32*32,48*48等结构形势,不同点阵汉字的字体又有宋体,仿宋体,黑体,楷体等之分。在计算机中,相同点阵结构和相同字体的字符存放在同一字库中。本文使用的是16*16的宋体。16*16的点阵字库中,字符的信息结构采用以行排列的形式,共有16行,每行有16个点,分别存放在两个字节内。因此每个字符共占用16*16/2=32个字节。字节的存放顺序为从左到右,从上到下。将汉字变成字符模式,使用16*16个像素表示一个汉字。在字模提取的过程中,还要注意取模的顺序,顺序不同,得到的数组就不同,一般式从左向右,从上到下。取模方式,逐行式。ASCII型字符的宽度是汉字的一半,即8。

view plainprint?

  1. #define rGPCCON    (*(volatile unsigned *)0x56000020)      
  2. #define rGPCUP     (*(volatile unsigned *)0x56000028)      
  3. #define rGPDCON    (*(volatile unsigned *)0x56000030)      
  4. #define rGPDUP     (*(volatile unsigned *)0x56000038)      
  5. #define rLCDCON1    (*(volatile unsigned *)0x4d000000)        
  6. #define rLCDCON2    (*(volatile unsigned *)0x4d000004)        
  7. #define rLCDCON3    (*(volatile unsigned *)0x4d000008)        
  8. #define rLCDCON4    (*(volatile unsigned *)0x4d00000c)        
  9. #define rLCDCON5    (*(volatile unsigned *)0x4d000010)        
  10. #define rLCDSADDR1  (*(volatile unsigned *)0x4d000014)        
  11. #define rLCDSADDR2  (*(volatile unsigned *)0x4d000018)      
  12. #define rLCDSADDR3  (*(volatile unsigned *)0x4d00001c)      
  13. #define rLCDINTMSK  (*(volatile unsigned *)0x4d00005c)      
  14. #define rTPAL       (*(volatile unsigned *)0x4d000050)      
  15. #define rGPGCON    (*(volatile unsigned *)0x56000060)   //Port G control      
  16. #define rGPGDAT    (*(volatile unsigned *)0x56000064)   //Port G data      
  17. #define rGPGUP     (*(volatile unsigned *)0x56000068)   //Pull-up control G      
  18. #define rLCDINTMSK  (*(volatile unsigned *)0x4d00005c)      
  19. #define rTCONSEL     (*(volatile unsigned *)0x4d000060)   //LPC3600 Control --- edited by junon       
  20. //垂直同步信号的脉宽、后肩和前肩      
  21. #define VSPW       15      
  22. #define VBPD       3      
  23. #define VFPD       5       
  24. //水平同步信号的脉宽、后肩和前肩      
  25. #define HSPW       8      
  26. #define HBPD       58      
  27. #define HFPD      15      
  28. #define CLKVAL 10      
  29. #define HOZVAL 319      
  30. #define LINEVAL 239      
  31. #define PWREN 1      
  32. #define MMODE 0      
  33. #define PNRMODE 3      
  34. #define BPPMODE 13      
  35. #define INVVCLK 0      
  36. #define INVVD 0      
  37. #define INVVDEN 0       
  38. #define U32 unsigned int       
  39. #define M5D(n) ((n) & 0x1fffff)      
  40. #define PAGEWIDTH 320      
  41. #define OFFSIZE 0      
  42. #define LCD_XSIZE 320      
  43. #define LCD_YSIZE 240      
  44. #define SCR_XSIZE 320      
  45. #define SCR_YSIZE 240      
  46. #define INVVLINE  1          
  47. #define INVVFRAME 1           
  48. #define BPP24BL 0      
  49. #define BSWP 0      
  50. #define HWSWP 0       
  51. volatile U32 LCD_BUFFER[240][320];       
  52.       
  53. unsigned char li[]={        
  54. 0x01,0x00,0x01,0x00,0x7F,0xFC,0x03,0x80,0x05,0x40,0x09,0x30,0x31,0x0E,0xDF,0xE4,       
  55. 0x00,0x80,0x01,0x00,0x7F,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00};   //"李",0       
  56. unsigned char wan[]={       
  57. 0x00,0x00,0x7F,0xFE,0x02,0x00,0x02,0x00,0x02,0x10,0x03,0xF8,0x02,0x10,0x04,0x10,       
  58. 0x04,0x10,0x04,0x10,0x08,0x10,0x08,0x10,0x10,0x10,0x20,0xE0,0x40,0x40,0x00,0x00};    //"万",1       
  59. unsigned char peng[]={       
  60. 0x00,0x10,0x77,0x20,0x55,0x7C,0x55,0x64,0x77,0x54,0x55,0x54,0x55,0x4C,0x55,0x40,       
  61. 0x77,0x7E,0x55,0x02,0x55,0x02,0x55,0xFA,0x55,0x02,0xB9,0x14,0x13,0x08,0x00,0x00};     //"鹏",2      
  62.     
  63. unsigned char L[]={0X00,0X00,0X00,0XE0,0X40,0X40,0X40,0X40,0X40,0X40,0X40,0X40,0X42,0XFE,0X00,0X00}; //L    
  64. unsigned char I[]={0X00,0X00,0X00,0X7C,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X7C,0X00,0X00}; //I    
  65. unsigned char N[]={0X00,0X00,0X00,0XC7,0X62,0X62,0X52,0X52,0X4A,0X4A,0X4A,0X46,0X46,0XE2,0X00,0X00}; //N    
  66. unsigned char U[]={0X00,0X00,0X00,0XE7,0X42,0X42,0X42,0X42,0X42,0X42,0X42,0X42,0X42,0X3C,0X00,0X00}; //U    
  67. unsigned char X[]={0X00,0X00,0X00,0XE7,0X42,0X24,0X24,0X18,0X18,0X18,0X24,0X24,0X42,0XE7,0X00,0X00}; //X    
  68. unsigned char AND[]={0X00,0X00,0X00,0X30,0X48,0X48,0X48,0X50,0X6E,0XA4,0X94,0X88,0X89,0X76,0X00,0X00}; //&    
  69. unsigned char A[]={0X00,0X00,0X00,0X10,0X10,0X18,0X28,0X28,0X24,0X3C,0X44,0X42,0X42,0XE7,0X00,0X00}; //A    
  70. unsigned char R[]={0X00,0X00,0X00,0XFC,0X42,0X42,0X42,0X7C,0X48,0X48,0X44,0X44,0X42,0XE3,0X00,0X00}; //R    
  71. unsigned char M[]={0X00,0X00,0X00,0XEE,0X6C,0X6C,0X6C,0X6C,0X54,0X54,0X54,0X54,0X54,0XD6,0X00,0X00}; //M    
  72.        
  73. void Init_LCD(){    
  74. rLCDCON1=(CLKVAL<<8)|(MMODE<<7)|(PNRMODE<<5)|(BPPMODE<<1)|0;   //设置CLKVAL,VCLK=HCLK/[(CLKVAL+1)*2],决定VM的触发方式,选择显示模式和BPP模式,暂时不要开启LCD,因为还没有设置好  
  75.        rLCDCON2=(VBPD<<24)|(LINEVAL<<14)|(VFPD<<6)|(VSPW);    //rLCDCON2,rLCDCON3和rLCDCON4主要设置时序    
  76.        rLCDCON3=(HBPD<<19)|(HOZVAL<<8)|(HFPD);    
  77.        rLCDCON4=(HSPW);    
  78.        rLCDCON5 = (BPP24BL<<12) | (INVVCLK<<10) | (INVVLINE<<9) | (INVVFRAME<<8) | (0<<7) | (INVVDEN<<6) | (PWREN<<3)  |(BSWP<<1) | (HWSWP);                         //INVVLINE和INVVFRAME需要进行翻转,因为CPU发出的是正脉冲,LCD使用的是负脉冲,所以要改变极性,PWREN使能电源信号  
  79.        rLCDSADDR1=(((U32)LCD_BUFFER>>22)<<21)|M5D((U32)LCD_BUFFER>>1);    
  80.        rLCDSADDR2=M5D(((U32)LCD_BUFFER+(SCR_XSIZE*SCR_YSIZE*4))>>1 );    
  81.        rLCDSADDR3=PAGEWIDTH*32/16;    
  82.        rLCDINTMSK|=(3);          
  83.        rTCONSEL = 0;               
  84.        rGPCUP = 0x0;    
  85.        rGPDCON = 0xaaaaaaaa;    
  86.        rGPCCON = 0xaaaa02a9;    
  87.        rGPDUP = 0x0;    
  88.        rGPGUP=rGPGUP&(~(1<<4))|(1<<4);          
  89.        rGPGCON=rGPGCON&(~(3<<8))|(3<<8);     
  90.        rLCDCON1 |= 1;   //使能数据输出和LCD控制信号  
  91. }       
  92.       
  93. void Paint_text(U32 x, U32 y, U32 color, unsigned char ch[]){       
  94.     int i, j, test, s, t = 0;       
  95.     for(i = 0; i < 16; i++){       
  96.         test = 0x80;       
  97.         for(j = 0; j < 16; j++){       
  98.             if(j == 8){       
  99.                 test = 0x80;       
  100.                 t++;       
  101.             }       
  102.             if(ch[t] & test)       
  103.                 LCD_BUFFER[x+i][y+j] = color;       
  104.             test >>= 1;          
  105.         }       
  106.         t++;       
  107.     }       
  108. }       
  109. void Paint_text_8(U32 x, U32 y, U32 color, unsigned char ch[]){    
  110.     int i, j, test;    
  111.     for(i = 0; i < 16; i++){    
  112.         test = 0x80;    
  113.         for(j = 0; j < 8; j++){    
  114.             if(test & ch[i])    
  115.                 LCD_BUFFER[x+i][y+j] = color;    
  116.             test >>= 1;    
  117.         }    
  118.     }    
  119. }      
  120.       
  121. void Paint_background(U32 c){       
  122.     unsigned int i, j;       
  123.     for(j = 0; j < LCD_YSIZE; j++)       
  124.         for(i = 0; i < LCD_XSIZE; i++)       
  125.             LCD_BUFFER[j][i] = c;       
  126. }       
  127.       
  128. int LcdMain(){       
  129.     Init_LCD();       
  130.     Paint_background(0xFFFFFF);       
  131.     Paint_text(100,100,0x000000,li);       
  132.     Paint_text(100,116,0x000000,wan);       
  133.     Paint_text(100,132,0x000000,peng);    
  134.     Paint_text_8(116,100,0x000000,L);    
  135.     Paint_text_8(116,108,0x000000,I);    
  136.     Paint_text_8(116,116,0x000000,N);    
  137.     Paint_text_8(116,124,0x000000,U);    
  138.     Paint_text_8(116,132,0x000000,X);    
  139.     Paint_text_8(116,140,0x000000,AND);    
  140.     Paint_text_8(116,148,0x000000,A);     
  141.     Paint_text_8(116,156,0x000000,R);    
  142.     Paint_text_8(116,164,0x000000,M);       
  143.     while(1);       
  144. }      

如果使用字库,每个汉字的地址由两个字节表示。一个是区号,一个是区中的位置,即位号。16*16的点阵字库中,每个字符占32个字节,每94个字符为一个区,共87个区,其中1~15区为常用符号区(包括数字0~9及大小写英文字母),16~86为常用汉字,其排列是以汉语拼音为序,从一声到四声,第87区为生僻汉字。汉字的起始地址是0xA1A1,A1+94=255,所以一个区有94个字符。区和位的起始号都是1,数组是从0开始,所以如果想在字库中定位一个字符,(94*(qu-1)+wei)*32。如果中文字符和ASCII码混合在一样,如何区分它们呢?其实也很简单,ASCII码的最高位是0,而中文的最高位是1,因此当读取到的一个字节的最高位是0,则该字节为ASCII码,它的下一个字节与这个字节无关;当取得到的字节的最高位是1,则表示的是中文字符,并且该字节与它的下一个字节组合在一起表示完整的一个汉字。

 

 

view plainprint?

  1. #include "Font_Libs.h"    
  2. #define rGPCCON    (*(volatile unsigned *)0x56000020)      
  3. #define rGPCUP     (*(volatile unsigned *)0x56000028)      
  4. #define rGPDCON    (*(volatile unsigned *)0x56000030)      
  5. #define rGPDUP     (*(volatile unsigned *)0x56000038)      
  6. #define rLCDCON1    (*(volatile unsigned *)0x4d000000)        
  7. #define rLCDCON2    (*(volatile unsigned *)0x4d000004)        
  8. #define rLCDCON3    (*(volatile unsigned *)0x4d000008)        
  9. #define rLCDCON4    (*(volatile unsigned *)0x4d00000c)        
  10. #define rLCDCON5    (*(volatile unsigned *)0x4d000010)        
  11. #define rLCDSADDR1  (*(volatile unsigned *)0x4d000014)        
  12. #define rLCDSADDR2  (*(volatile unsigned *)0x4d000018)      
  13. #define rLCDSADDR3  (*(volatile unsigned *)0x4d00001c)      
  14. #define rLCDINTMSK  (*(volatile unsigned *)0x4d00005c)      
  15. #define rTPAL       (*(volatile unsigned *)0x4d000050)      
  16. #define rGPGCON    (*(volatile unsigned *)0x56000060)   //Port G control      
  17. #define rGPGDAT    (*(volatile unsigned *)0x56000064)   //Port G data      
  18. #define rGPGUP     (*(volatile unsigned *)0x56000068)   //Pull-up control G      
  19. #define rLCDINTMSK  (*(volatile unsigned *)0x4d00005c)      
  20. #define rTCONSEL     (*(volatile unsigned *)0x4d000060)   //LPC3600 Control --- edited by junon       
  21. //垂直同步信号的脉宽、后肩和前肩      
  22. #define VSPW       15      
  23. #define VBPD       3      
  24. #define VFPD       5       
  25. //水平同步信号的脉宽、后肩和前肩      
  26. #define HSPW       8      
  27. #define HBPD       58      
  28. #define HFPD      15      
  29. #define CLKVAL 10      
  30. #define HOZVAL 319      
  31. #define LINEVAL 239      
  32. #define PWREN 1      
  33. #define MMODE 0      
  34. #define PNRMODE 3      
  35. #define BPPMODE 13      
  36. #define INVVCLK 0      
  37. #define INVVD 0      
  38. #define INVVDEN 0       
  39. #define U32 unsigned int       
  40. #define M5D(n) ((n) & 0x1fffff)      
  41. #define PAGEWIDTH 320      
  42. #define OFFSIZE 0      
  43. #define LCD_XSIZE 320      
  44. #define LCD_YSIZE 240      
  45. #define SCR_XSIZE 320      
  46. #define SCR_YSIZE 240      
  47. #define INVVLINE  1          
  48. #define INVVFRAME 1           
  49. #define BPP24BL 0      
  50. #define BSWP 0      
  51. #define HWSWP 0       
  52. volatile U32 LCD_BUFFER[240][320];       
  53.       
  54. void Init_LCD(){    
  55. rLCDCON1=(CLKVAL<<8)|(MMODE<<7)|(PNRMODE<<5)|(BPPMODE<<1)|0;   //设置CLKVAL,VCLK=HCLK/[(CLKVAL+1)*2],决定VM的触发方式,选择显示模式和BPP模式,暂时不要开启LCD,因为还没有设置好  
  56.        rLCDCON2=(VBPD<<24)|(LINEVAL<<14)|(VFPD<<6)|(VSPW);    //rLCDCON2,rLCDCON3和rLCDCON4主要设置时序    
  57.        rLCDCON3=(HBPD<<19)|(HOZVAL<<8)|(HFPD);    
  58.        rLCDCON4=(HSPW);    
  59.        rLCDCON5 = (BPP24BL<<12) | (INVVCLK<<10) | (INVVLINE<<9) | (INVVFRAME<<8) | (0<<7) | (INVVDEN<<6) | (PWREN<<3)  |(BSWP<<1) | (HWSWP);                         //INVVLINE和INVVFRAME需要进行翻转,因为CPU发出的是正脉冲,LCD使用的是负脉冲,所以要改变极性,PWREN使能电源信号  
  60.        rLCDSADDR1=(((U32)LCD_BUFFER>>22)<<21)|M5D((U32)LCD_BUFFER>>1);    
  61.        rLCDSADDR2=M5D(((U32)LCD_BUFFER+(SCR_XSIZE*SCR_YSIZE*4))>>1 );    
  62.        rLCDSADDR3=PAGEWIDTH*32/16;    
  63.        rLCDINTMSK|=(3);          
  64.        rTCONSEL = 0;               
  65.        rGPCUP = 0x0;    
  66.        rGPDCON = 0xaaaaaaaa;    
  67.        rGPCCON = 0xaaaa02a9;    
  68.        rGPDUP = 0x0;    
  69.        rGPGUP=rGPGUP&(~(1<<4))|(1<<4);          
  70.        rGPGCON=rGPGCON&(~(3<<8))|(3<<8);     
  71.        rLCDCON1 |= 1;   //使能数据输出和LCD控制信号  
  72. }       
  73.       
  74. void Paint_text16(U32 x, U32 y, U32 color, unsigned char ch[]){       
  75.     int i, j, test, t = 0;       
  76.     for(i = 0; i < 16; i++){       
  77.         test = 0x80;       
  78.         for(j = 0; j < 16; j++){       
  79.             if(j == 8){       
  80.                 test = 0x80;       
  81.                 t++;       
  82.             }       
  83.             if(ch[t] & test)       
  84.                 LCD_BUFFER[x+i][y+j] = color;       
  85.             test >>= 1;          
  86.         }       
  87.         t++;       
  88.     }       
  89. }       
  90. void Paint_Ascii(U32 x, U32 y, U32 color, unsigned char ch[]){    
  91.     int i, j, test;    
  92.     for(i = 0; i < 16; i++){    
  93.         test = 0x80;    
  94.         for(j = 0; j < 8; j++){    
  95.             if(test & ch[i])    
  96.                 LCD_BUFFER[x+i][y+j] = color;    
  97.             test >>= 1;    
  98.         }    
  99.     }    
  100. }      
  101.       
  102. void Paint_background(U32 c){       
  103.     unsigned int i, j;       
  104.     for(j = 0; j < LCD_YSIZE; j++)       
  105.         for(i = 0; i < LCD_XSIZE; i++)       
  106.             LCD_BUFFER[j][i] = c;       
  107. }       
  108.       
  109. int LcdMain(){       
  110.     int qu, wei, i, test = 0x80, t;    
  111.     unsigned char * head;    
  112.     unsigned char fuck[] = "李万鹏专注于linux+arm";    
  113.     Init_LCD();       
  114.     Paint_background(0xFFFFFF);      
  115.     for(i = 0,t = 0; i < sizeof(fuck); i++){    
  116.         if(test & fuck[i]){    
  117.             qu = fuck[i] - 0xA0;    
  118.             wei = fuck[i+1] - 0xA0;    
  119.             head = &__HZK[((qu-1)*94+wei-1)*32];    
  120.             Paint_text16(100, 100+t*16, 0x000000, head);    
  121.             i++;                
  122.         }    
  123.         else{    
  124.             head = &__ASCII[fuck[i]*16];    
  125.             Paint_Ascii(100, 100+i*8 , 0x000000, head);    
  126.         }    
  127.         t++;    
  128.     }     
  129.     while(1);       
  130. }