左骁卫大将军和平辽王:驱动ST7565显示汉字以及画点

来源:百度文库 编辑:中财网 时间:2024/04/27 15:16:47
  1. //汉字 16*16 的定义   
  2. unsigned int CHINESE_16_16[] = {32/*数据总数*/,16/*宽*/,16/*高*/};  
  3. //汉字 24*24 的定义   
  4. unsigned int CHINESE_24_24[] = {72/*数据总数*/,24/*宽*/,24/*高*/};  
  5. //ASCII 16*8 的定义   
  6. unsigned int ASCII_W8_H16[] = {16/*数据总数*/,8/*宽*/,16/*高*/};  
  7. //ASCII 24*12 的定义   
  8. unsigned int ASCII_W12_H24[] = {36/*数据总数*/,12/*宽*/,24/*高*/};  
  9. // *****************************************************   
  10. //画字函数   
  11. //参数x:X轴坐标,0~127   
  12. //参数y_pag:纵向页数,0~7,每一页等于8个纵向像素   
  13. //参数font:font的样式:{数据总数,高,宽}   
  14. //参数p:字模数组,当p=LCD_CLEAR,则是清除指定区域   
  15. // *****************************************************   
  16. void LCD_PutChar(unsigned char x,unsigned char y_pag,unsigned int *font,unsigned char *p)  
  17. {  
  18.   unsigned int size=font[0];//整个数组的大小   
  19.   unsigned int width=font[1];//字符的宽度   
  20.     //unsigned int height=font[2]; 留着以后有用   
  21.   unsigned int pagindex=1;//记录LCD页指针去到的页数   
  22.   unsigned int nextpage = width;  
  23.     
  24.   unsigned char i,pag,colh,coll;  
  25.   pag = y_pag+0xb0;  
  26.   colh = x>>4; /*取y_pag的高4位*/  
  27.   colh = colh | 0xf0;  
  28.   colh = colh & 0x1f;  
  29.   coll = x & 0x0f; /*取y_pag的低4位*/  
  30.   SPI_Write(colh,LCD_CMD);  
  31.   SPI_Write(coll,LCD_CMD);  
  32.   SPI_Write(pag,LCD_CMD);  
  33.    
  34.   for (i=0;i
  35.   {  
  36.       if (i == nextpage)//当前页画完,则跳转到下一页继续画   
  37.       {  
  38.         SPI_Write(pag+pagindex,LCD_CMD);  
  39.         SPI_Write(colh,LCD_CMD);  
  40.         SPI_Write(coll,LCD_CMD);  
  41.      
  42.         pagindex++;//换到下一页   
  43.         nextpage = pagindex * width;//定义下一页在size中的位置   
  44.       }  
  45.        
  46.       if(p==0x00)  
  47.         SPI_Write(0X00,LCD_CANVAS);  
  48.       else  
  49.         SPI_Write(*p++,LCD_CANVAS);  
  50.   }  
  51. }  
  52. // *****************************************************   
  53. //画点函数   
  54. //原理:x直接设置列,Y/8=页数,Y%8=点在纵8格的位置,Y=0,Y|=BIT7,Y=Y>>(7-Y%8)   
  55. //举例:(5,6),在列5,Y坐标在第0页的最后一点,即Y=0100 0000(倒向的二进制) 等价于 Y=0,Y|=BIT7,Y左移1位   
  56. //参数x:X轴坐标,0~127   
  57. //参数y:Y轴坐标,0~63   
  58. //参数ph:点的高度,为0时则为清除点   
  59. // *****************************************************   
  60. void LCD_DrawPoint(unsigned char x,unsigned char y,unsigned int ph)  
  61. {  
  62.   unsigned char i,pag,colh,coll;   
  63.   pag = y/8;//判断Y所在的页   
  64.   pag = pag  +0xb0;  
  65.     
  66.   colh = x>>4; /*取x的高4位*/  
  67.   colh = colh | 0xf0;  
  68.   colh = colh & 0x1f;  
  69.   coll = x & 0x0f; /*取x的低4位*/  
  70.   SPI_Write(colh,LCD_CMD);  
  71.   SPI_Write(coll,LCD_CMD);  
  72.   SPI_Write(pag,LCD_CMD);  
  73.     
  74.   if(ph==LCD_CLEAR)  
  75.   {  
  76.     SPI_Write(LCD_CLEAR,LCD_CANVAS);  
  77.     return;  
  78.   }  
  79.       
  80.   unsigned int point=0;  
  81.   for(i=0;i
  82.     point|=(BIT7>>i);//点加高   
  83.   point=point>>(8-ph-y%8);//加高之后移位    
  84.   SPI_Write(point,LCD_CANVAS);  
  85. }  
  86. unsigned char hz16_16[]={//"你"    
  87. 0x40,0x20,0xF8,0x07,0x40,0x20,0x18,0x0F,0x08,0xC8,0x08,0x08,0x28,0x18,0x00,0x00,  
  88. 0x00,0x00,0xFF,0x00,0x00,0x08,0x04,0x43,0x80,0x7F,0x00,0x01,0x06,0x0C,0x00,0x00  
  89. };  
  90. unsigned char hz24_24[]={//"好"   
  91. 0x00,0x40,0x40,0x40,0xFF,0xFE,0x42,0x40,0xE0,0xE0,0x40,0x00,0x08,0x08,0x08,0x08,  
  92. 0xC8,0x88,0x68,0x38,0x1C,0x08,0x00,0x00,0x00,0x00,0x70,0x7F,0xCF,0x80,0x00,0xF0,  
  93. 0x7F,0x0F,0x10,0x10,0x10,0x10,0x10,0x10,0xFF,0xFF,0x10,0x10,0x18,0x18,0x10,0x00,  
  94. 0x00,0x40,0x20,0x10,0x0C,0x07,0x03,0x07,0x1E,0x1C,0x00,0x00,0x20,0x20,0x60,0xE0,  
  95. 0x7F,0x3F,0x00,0x00,0x00,0x00,0x00,0x00};  
  96. unsigned char ascii8_16[]={// -G-   
  97. 0xF0,0xF8,0x0C,0x84,0x84,0x8C,0x98,0x00,0x03,0x07,0x0C,0x08,0x08,0x07,0x0F,0x00  
  98. };  
  99. unsigned char ascii12_24[]={// -V-     
  100. 0x04,0xFC,0xFC,0x04,0x00,0x00,0x00,0x04,0xFC,0xFC,0x04,0x00,0x00,0x00,0x3F,0xFF,    
  101. 0xC0,0x00,0xC0,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x1F,0x3C,0x1F,0x03,  
  102. 0x00,0x00,0x00,0x00,  
  103. };  
  104. unsigned char  *hzcode;   
  105.      
  106. void main()  
  107. {  
  108.   WDTCTL=WDTPW+WDTHOLD;        //停止WDT    
  109.   LCD_Init();//初使化   
  110.   LCD_SetDisplay(LCD_CLEAR);          
  111.     
  112.   //显示“你”   
  113.   hzcode= hz16_16;  
  114.   LCD_PutChar(0,0,CHINESE_16_16,hzcode);  
  115.   //显示“好”     
  116.   hzcode= hz24_24;  
  117.   LCD_PutChar(16,1,CHINESE_24_24,hzcode);  
  118.     
  119.   //显示分割线   
  120.   for(int x=0;x<127;x++)  
  121.     LCD_DrawPoint(x,32,1);  
  122.    
  123.     
  124.   //显示“G”   
  125.   hzcode= ascii8_16;  
  126.   LCD_PutChar(100,5,ASCII_W8_H16,hzcode);  
  127.   //显示“V”    
  128.   hzcode= ascii12_24;  
  129.   LCD_PutChar(108,5,ASCII_W12_H24,hzcode);  
  130.      }