大理水控初始版本
diff --git a/zk/gb2312_16.c b/zk/gb2312_16.c
new file mode 100644
index 0000000..579a90a
--- /dev/null
+++ b/zk/gb2312_16.c
@@ -0,0 +1,227 @@
+#include "glcd.h"
+//#include "timer.h"
+#include "../nec_hardware.h"
+#include "gb2312_16.h"
+#include "string.h"
+#include "stdio.h"
+
+uint8_t gb2312_16x16_draw_char(uint8_t x, uint8_t y, uint8_t buf[32])
+{
+    uint8_t i,j;
+    
+    for(i=0;i<16;i++)
+    {
+        for(j=0;j<2;j++)
+        {
+            uint8_t dat,bit;
+            
+            dat = buf[2*i+j];
+			
+			if(glcd_get_reverse_sta())
+				dat = ~dat;
+			
+            for(bit=0;bit<8;bit++)
+            {
+                if (dat & (0x80>>bit)) 
+                {
+                    glcd_set_pixel(x+j*8+bit, y+i, BLACK);
+                } 
+                else
+                {
+                    glcd_set_pixel(x+j*8+bit, y+i,WHITE);
+                }
+            }
+        }
+    } 
+
+    return 16;
+}
+
+void gb2312_16x16_get_data(uint8_t xy[2], uint8_t buf[32])
+{
+    uint32_t offset;
+    
+    if((xy[0]<0xa1) || (xy[1])<0xa1)
+        return;
+    
+    offset = (94*(xy[0] - 0xa1) + (xy[1] - 0xa1))*32ul;
+    
+    HW_Flash_Read(offset+256, 32, buf);
+}
+
+uint8_t gb2312_16x8_draw_char(uint8_t x, uint8_t y, uint8_t buf[16])
+{
+    uint8_t i;
+    
+    for(i=0;i<16;i++)
+    {
+        uint8_t dat,bit;
+            
+        dat = buf[i];
+			
+		if(glcd_get_reverse_sta())
+			dat = ~dat;
+        for(bit=0;bit<8;bit++)
+        {
+            if (dat & (0x80>>bit)) 
+            {
+                glcd_set_pixel(x+bit, y+i, BLACK);
+            } 
+            else
+            {
+                glcd_set_pixel(x+bit, y+i,WHITE);
+            }
+        }
+    } 
+
+    return 8;
+}
+
+void gb2312_16x8_get_data(uint8_t c, uint8_t buf[16])
+{
+    uint32_t offset;
+    
+    offset = c*16ul + 0x43000;
+    
+    HW_Flash_Read(offset, 16, buf);    
+}
+
+void gb2312_16x16_test(void)
+{
+    uint32_t i,j;
+    
+    HW_Flash_Init();
+    glcd_init();
+    glcd_clear();
+    
+    for(i=0xa1;i<0xfe;i++)
+    {
+        uint8_t xy[2];
+            
+        xy[0] = i;
+        for(j=0xa1;j<0xfe;j++)
+        {
+            uint8_t buf[32];
+            
+            xy[1] = j;
+            
+            gb2312_16x16_get_data(xy, buf);            
+            gb2312_16x16_draw_char(0, 0, buf);
+            glcd_write();
+            delay_ms(100);
+        }    
+    }
+}
+
+
+void gb2312_16x8_test(void)
+{
+    uint32_t i;
+    
+    HW_Flash_Init();
+    glcd_init();
+    glcd_clear();
+    
+    for(i=0;i<256;i++)
+    {
+        uint8_t buf[32];
+        
+        gb2312_16x8_get_data(i, buf);            
+        gb2312_16x8_draw_char(0, 0, buf);
+        glcd_write();
+        delay_ms(50);   
+    }
+}
+
+uint8_t gb2312_16_get_ver(uint8_t ver[3])
+{
+	uint8_t temp_buff[20];
+	
+	if(HW_Flash_Read(0, sizeof(temp_buff), temp_buff))
+		return 1;
+	
+	if(memcmp(temp_buff, sk_font_id, 9))
+		return 2;
+	
+	memcpy(ver, temp_buff+9, 3);
+	ver[0] -= '0';
+	ver[1] -= '0';
+	
+	return 0;
+}
+
+void gb2312_16_draw_str(uint8_t x, uint8_t y, char* s)
+{
+    uint8_t i=0,j=0;
+    
+    while(*s)
+    {
+        uint8_t buf[32]; 
+        
+#if 1    
+        if(x>=GLCD_LCD_WIDTH || y>=GLCD_LCD_HEIGHT)
+            return ;     
+#else        
+        if(x+i >= GLCD_LCD_WIDTH)
+        {
+            j += 16;  //»»ÐÐ
+            i  = 0;   //»Ø³µ
+        }
+        if(y+j >= GLCD_LCD_HEIGHT)
+        {
+            j = 0;
+            i = 0;
+        }
+#endif        
+        if((uint8_t)(*s)<128)
+        { 
+            gb2312_16x8_get_data((uint8_t)*s, buf);
+            i += gb2312_16x8_draw_char(x+i, y+j, buf);            
+        }
+        else
+        {
+            gb2312_16x16_get_data((uint8_t *)s, buf);            
+            i += gb2312_16x16_draw_char(x+i, y+j, buf);
+            s ++;
+        }
+        s ++;
+    }
+}
+
+uint8_t gb2312_16_verify(void)
+{
+	const uint8_t font_01[32] = 
+	{
+		0x01, 0x00, 0x01, 0x00, 0x01, 0x08, 0x01, 0x10, 0x7D, 0x20, 0x05, 0xC0, 0x05, 0x40, 0x09, 0x20, 
+		0x09, 0x20, 0x11, 0x10, 0x11, 0x18, 0x21, 0x0E, 0xC1, 0x04, 0x01, 0x00, 0x05, 0x00, 0x02, 0x00
+	};
+	const uint8_t font_02[32] = 
+	{
+		0x10, 0x00, 0x10, 0x20, 0x10, 0x10, 0xFD, 0xFE, 0x11, 0x04, 0x10, 0x50, 0x14, 0x8C, 0x19, 0x04, 
+		0x30, 0x00, 0xD1, 0xFC, 0x10, 0x20, 0x10, 0x20, 0x10, 0x20, 0x10, 0x20, 0x53, 0xFE, 0x20, 0x00
+	};
+	const uint8_t font_03[16] = 
+	{
+		0x00, 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00
+	};
+	const uint8_t font_04[16] = 
+	{
+		0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x66, 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00
+	};
+	uint8_t buf[32];
+	
+	gb2312_16x16_get_data("ˮ", buf);
+	if(memcmp(buf, font_01, sizeof(font_01)))
+		return 1;
+	gb2312_16x16_get_data("¿Ø", buf);
+	if(memcmp(buf, font_02, sizeof(font_02)))
+		return 2;
+	gb2312_16x8_get_data('A', buf);
+	if(memcmp(buf, font_03, sizeof(font_03)))
+		return 3;
+	gb2312_16x8_get_data('B', buf);
+	if(memcmp(buf, font_04, sizeof(font_04)))
+		return 4;
+	
+	return 0;
+}