基於AT89C51單片機的貪吃蛇電子游戲(仿真)


  有關貪吃蛇的歷史發展可以看一下這個網址,貪吃蛇最初的設計和現在並不相同。。http://www.techweb.com.cn/internet/2013-02-21/1278055.shtml

  該項目設計硬件平台選擇了簡單易用的AT89C51單片機,顯示屏選擇的是AMPIRE128X64液晶屏幕顯示器,按照一定順序連接后,如下圖:

  

 

  軟件方面采用了C51編寫代碼,代碼編寫模塊如下圖:

 

 

  除去網上已有的圖形驅動代碼外,其核心代碼主要為游戲處理、信息處理和按鍵處理。

  編寫游戲的功能代碼,先定義游戲的數據結構和常量。

#define uchar unsigned char
#define uint  unsigned int

sbit  P00 = P0 ^ 0;                //
sbit  P01 = P0 ^ 1;                //
sbit  P02 = P0 ^ 2;                //
sbit  P03 = P0 ^ 3;                //
sbit  P04 = P0 ^ 4;                //    開始/暫停

#define RIGHT 1
#define LEFT  2
#define UP    3
#define DOWN  4

#define ERASE     0
#define REWRITTEN 1

#define NO  0
#define YES 1

#define FALSE 0
#define TRUE  1

bit ESC = TRUE;                   //    開始 暫停標志位

uchar gameSpeed = 20;             //    游戲速度調節
uchar level = 1;                  //    難度
uchar s1[] = "1";                 //    保存顯示難度的漢子

//    uchar = unsigned char
//    食物的結構體
struct Food
{
   uchar x;                        //    食物的橫坐標
   uchar y;                        //    食物的縱坐標
}food;    

//    貪吃蛇主體的結構體
struct Snake
{
   uchar x[39];
   uchar y[39];
   uchar node;                    //    蛇的節數
   uchar direction;               //    蛇移動方向
}snake;

  其中食物的數據結構采用結構體定義,兩個unsigned char變量分別定義為食物的橫縱坐標;蛇的身體定義為長度最大值為39的數組,游戲中貪吃蛇長度達到39,游戲通關結束。

 

  游戲處理模塊為貪吃蛇在游玩過程中遇到的需要被處理的情況,主要實現的功能包括以下四個方面,即移動、食物、死亡和更新。

  1. 移動

     

      流程與運行仿真如上圖,按下“開始”鍵后,游戲開始啟動,初始化完畢后,屏幕會顯示“貪吃蛇”、“食物”和游戲的邊界框,“貪吃蛇”在固定的周期內會向前移動一格,此時“貪吃蛇”身體從尾巴至頭部每一個后序節點會向前序節點移動,后序節點移動完畢后,頭部會根據此時按鍵的方向對相應的橫縱坐標進行加減。

  2. 食物

      “貪吃蛇”向前移動后,此時要判斷蛇頭是否與“食物”的橫縱坐標一一對應,如果不是則退出該模塊,進入下一模塊;如果是,則“貪吃蛇”的節數增加一。節數增加后判斷蛇的節數是否為10的倍數,如果是則提升“貪吃蛇”的等級,並對游戲增加難度,加快貪吃蛇移動的速度。退出了游戲升級的模塊后將進入創建新的“食物”模塊,為了避免“食物”與“貪吃蛇”的節點坐標重復,“食物”在創建后要與“貪吃蛇”的每個節點的坐標一一比較,如果重合則重新創建“食物”的坐標,直到創建成功為止。

  3. 結束

     

      “貪吃蛇”在向前移動后,有可能撞到牆壁或自己的身體,也有可能吃到食物,或者只是向前移動一格,移動完畢后如果吃到了食物,如果“貪吃蛇”的node(節數)達到了最大值(39),那么玩家將會通關游戲,並且游戲退出,此時需要判斷游戲是否結束,一共有三種判別,前兩種為失敗結局,即撞到了牆壁或自己的身體,最后一種為通關結局,將在屏幕上打印“Congratulations”祝賀玩家成功通關游戲。

  4. 更新

      游戲在判斷結束后,如果沒有結束,那么更新屏幕上的“貪吃蛇”的狀態。

 

  四個模塊的核心代碼如下:

//    運行游戲的具體實現
void gamePlay(void)
{    
    bit hero = FALSE;                   //    完成游戲
            
    while(1) {
        EA = 1;
        if (ESC == FALSE) {
            gameSpeed = 20;
               level = 1;
            s1[0] = '1';
            start();            
        }

        while(ESC == FALSE) {
            EA = 1;            

            move();                                                               //    貪吃蛇向前移動

            if(snake.x[0] == food.x && snake.y[0] == food.y) {                    //    判斷蛇頭吃到食物以后    
                RectArea(food.x, food.y, food.x + 2, food.y + 2, ERASE);          //    把畫面上的食物去掉
                snake.node++;                                                     //    蛇的身體長一節

                if (increaseLevel()) {                                            //    根據難度變化判斷是否要重新開始
                    restart();
                    continue;
                }

                while (!createNewFood()) {                                        //    如果創建失敗則繼續創建,直到成功
                    ;
                }
                
                RectArea(food.x, food.y, food.x + 2, food.y + 2, REWRITTEN);      //    在畫面上顯示食物
            }
            
                                                 
            if (isOver()) {                                                       //    判斷游戲是否結束
                if(snake.node == 39) 
                    hero = TRUE;
                }
                ESC = TRUE;
                hero = gameOver(hero);        
                break;
            }        
                
            //    打印貪吃蛇
            updataSnakeHead();                //    更新頭部
            delay(gameSpeed);                 //    速度設置
            eraseSnakeTail();                 //    刪除尾巴
        }   //    退出循環(!ESC)
    }
}

 

  其余的函數代碼編寫如下:

//    隨機數產生
int rand(void)
{    
    int i;    
    i = ((TH0 << 8) | TL0) & 0x7fff;    
    return(i);
}

//    延時   
void delay(uchar ms)       //    10毫秒
{
    uchar i, j, k;
        
    while(ms--) {
        for(i = 5; i > 0; i--) {
            for(j = 4; j > 0; j--) {
                for(k = 248; k > 0; k--)
                    ;
            }  
        }
    }
}

void mulDelay(int s)     //    1秒
{
    int i;
    uchar j;

    for (i = 0; i < s; ++i) {
        for (j = 0; j < 100; ++j) {
            delay(1);     
        }
    }
}

//    鍵掃描函數 
void KeyScan()
{
    P0 = 0xff;


    if(P00 == 0 && snake.direction != LEFT) {
        snake.direction = RIGHT;
    }
                
    if(P01 == 0 && snake.direction != RIGHT) {
        snake.direction = LEFT;
    }
             
    if(P02 == 0 && snake.direction != DOWN) {
        snake.direction = UP;
    }         
         
    if(P03 == 0 && snake.direction != UP) {
        snake.direction = DOWN;
    }
     
    if(P04 == 0) {
        ESC = ~ESC;
    }  
}

void int_0(void) interrupt 0
{
    EA = 0;
    KeyScan();
}

void snakeInit()
{         
    snake.direction = RIGHT;            //    方向往右

    snake.x[0] = 9;                     //    蛇頭坐標
    snake.y[0] = 33;    

    snake.x[1] = 6;                     //    蛇尾坐標
    snake.y[1] = 33;

    snake.node = 2;                     //    節數
}

void init(void) 
{
    EX0 = 1;                            //    開中斷
    IT0 = 1;                            //    設置電平觸發方式
    EA = 1;                             //    開所有中斷
    TMOD = 0x01;
    TH0 = 65536 / 256;
    TL0 = 65536 % 256;
    TR0 = 1;

    
    hz_disp(3, 40, 3, snaker, 1);
    snakeInit();
}

//    需要出現新食物
bit createNewFood()
{
    uchar i;
    uchar size = snake.node;
    bit flag = TRUE;                         //    標記創建的新事物與貪吃蛇的身體沖突
    
    food.x = rand() % 114 + 6;
    food.y = rand() % 51 + 6;
    
    //    食物的坐標必須為3的倍數才會在顯示屏先被顯示
    for (; food.x % 3 != 0; ++food.x) {      
        ;
    }
    
    for (; food.y % 3 != 0; ++food.y) {       
        ;
    }
    
    for (i = 0; i < size; ++i) {
        if (food.x == snake.x[i] && food.y == snake.y[i]) {
            flag = FALSE;
            break;
        }
    }    

    return flag;
}

void start()
{
    ClearLCD(); 
    hz_disp(3, 40, 2, gameLevel, REWRITTEN);                         //    顯示漢子“難度”
    en_disp(3, 80, 1, Asc, s1, REWRITTEN);                           //    顯示s1數組的內容
    delay(150);
    ClearLCD();
    
    rectBoundary(5, 5, 123, 60, REWRITTEN);                          //    顯示邊框
    
    while (!createNewFood()) {                                       //    如果創建失敗則繼續創建,直到成功
        ;
    }
                
    RectArea(food.x, food.y, food.x + 2, food.y + 2, REWRITTEN);     //    在畫面上顯示食物
}

//    重新開始
void restart()
{            
    start();
}

//    是否增加難度
//    如果是,那么要重新開始
bit increaseLevel() 
{
    bit res = NO;
    //    每次蛇的長度超過10個增加一次難度,level最高4級
    if(snake.node % 10 == 0) {     
        level += 1;
        switch (level) {
            case 2:
                s1[0] = '2';
                gameSpeed = 15;
                break;
            case 3:
                s1[0] = '3';
                gameSpeed = 10;
                break;
            case 4:
                s1[0] = '4';
                gameSpeed = 5;
                break;
        }
        res = YES;
    }

    return res;
}



//    貪吃蛇移動
void move()
{
    uchar i;

    //    將蛇從最后個節點向前一個節點移動
    for(i = snake.node - 1; i > 0; i--) {                    
        snake.x[i] = snake.x[i - 1];
        snake.y[i] = snake.y[i - 1];
    }
    
    //    根據此時貪吃蛇的方向,設置蛇頭的位置            
    switch(snake.direction)    {                  
        case RIGHT: 
            snake.x[0] += 3;
            break;
        case LEFT: 
            snake.x[0] -= 3;
            break;
        case UP: 
            snake.y[0] -= 3;
            break;
        case DOWN: 
            snake.y[0] += 3;
            break;
    }
}
 
//    游戲是否結束
bit isOver()
{
    bit overFlag = 0;
    uchar i;

    //    判斷蛇是否吃到自己了
    //    從蛇的第四節開始判斷是否撞到自己了
    for (i = 3; i < snake.node; i++)    {            
        if (snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0]) {
            overFlag = 1;    
            break;
        }
    }
            
    if(snake.x[0] < 6 || snake.x[0] > 120
    || snake.y[0] < 6 || snake.y[0] > 57) {                //    判斷蛇是否撞到牆壁    
        overFlag = 1;                                    
    }
    
    if(snake.node == 39) {
        overFlag = 1;
    }

    return overFlag;
}


void congratulations()
{
    idata uchar str[] = "Congratulations";
    uchar tmp[1];
    uchar len = 15;
    uchar i;
    s1[0] = 's';
    for (i = 0; i < 15; ++i) {
        tmp[0] = str[i];
        en_disp(3, i * 8 + 1, 1, Asc, tmp, REWRITTEN);
        //    en_disp(3, 80, 1, Asc, s1, REWRITTEN);
    }    
}

//    游戲結束后的畫面
void theEndGraph()
{
    uchar i, j;

    for (i = 0; i < 2; ++i) {
        for (j = 0; j < 6; ++j) {
            hz_disp(i * 2, j * 21, 1, mySchool[i*6+j], 1);
        }
    }

    for (i = 0; i < 6; ++i) {
        hz_disp(6, i * 21, 1, myName[i], 1);
    }
}

//    游戲結束
bit gameOver(bit hero)
{
    //    ClearLCD();

    if (hero == TRUE) {                    //    當玩家貪吃蛇的節點達到了39個后顯示恭喜通關畫面
        hero = FALSE;        
        congratulations();
        mulDelay(2);
    } else {        
        hz_disp(3, 25, 4, theEnd, 1);
        mulDelay(2);    
    }
    
    ClearLCD();
    theEndGraph();                        //    打印“畢業設計“
    snakeInit();                          //    重新初始化游戲的參數
    return hero;
}

//    更新貪吃蛇的頭部
void updataSnakeHead()
{
    RectArea(snake.x[0], snake.y[0], snake.x[0] + 2, snake.y[0] + 2, REWRITTEN);         //    繪制當前的頭部
    RectArea(snake.x[1], snake.y[1], snake.x[1] + 2, snake.y[1] + 2, REWRITTEN);         //    將上一次的頭部重新繪制以補全邊角

    //    根據蛇的方向擦除蛇的頭部中間的一點以確認貪吃蛇的頭部
    switch (snake.direction) {
        case RIGHT:
            Dot(snake.x[0] + 2, snake.y[0] + 1, ERASE);            
            break;

        case LEFT:
            Dot(snake.x[0], snake.y[0] + 1, ERASE);            
            break;
                    
        case UP:
            Dot(snake.x[0] + 1, snake.y[0], ERASE);
            break;

        case DOWN:
            Dot(snake.x[0] + 1, snake.y[0] + 2, ERASE);
            break;
    }
}

//    去除蛇的的最后一節
void eraseSnakeTail()
{
     RectArea(snake.x[snake.node - 1], snake.y[snake.node - 1], snake.x[snake.node - 1] + 2, snake.y[snake.node - 1] + 2, ERASE);
}

  

  測試函數放在最后

void main (void)
{
    LCD12864_init();
    ClearLCD();
    init();

    gamePlay();
    while(1) {
        ;    
    }      
}

 

  以上是貪吃蛇游戲的實現snake.c,游戲的圖形驅動12864.h和打印的字符代碼asc.h如下:

//    12864.h
/*-----------------------------------------------------------*/
#define LCD_OFF 0x3E
#define LCD_ON  0x3F
#define Add_X     0xB8     //    the start address of the page 0 ;(0~7)
#define Add_Y     0x40     //    the start address of the Y counter ; (0~64)
#define Add_Z     0xC0     //    the start address of the DDRAM ; (0~64)
/*-----------------------------------------------------------*/
#define  LCD12864_DATA_PORT  P1
typedef unsigned char uchar;

sbit  LCD12864_EN         = P2 ^ 0;
sbit  LCD12864_RW         = P2 ^ 1;       //    0:write ; 1:read 
sbit  LCD12864_RS         = P2 ^ 2;       //    0:the command .1:the data
sbit  LCD12864_CS_L       = P2 ^ 3;       //    select the left of the lcd when 1
sbit  LCD12864_CS_R       = P2 ^ 4;  

/*--------------------------函數列表-------------------------*/
void LCDSel(uchar sel);                        //    片選 0全選 1左 2右
void WaitLCD();                                //    忙等待
void WriteDatToLCD12864(uchar dat);            //    寫數據
void WriteCmdToLCD12864(uchar cmd);            //    寫命令
uchar ReadDatFromLCD12864(void);               //    讀數據

void SetX(uchar x);                            //    設置頁地址0 - 7
void SetY(uchar y);                            //    設置列地址0 - 127
void SetZ(uchar z);                            //    設置首地址0-63

void ClearLCD();                               //    清屏 

void Dot(char x, char y, bit flag);            //    x:0~63~127    y:0~63    flag :0:擦除某個點 1:顯示某個點
void Line(uchar x1, uchar y1, uchar x2, uchar y2, bit flag);                           //    (x1,y1) (x2,y2)作直線   flag :0:擦除線 1:顯示線
void Rect(uchar x1, uchar y1, uchar x2, uchar y2, bit flag);                           //    (x1,y1) (x2,y2)作矩形框  flag :0:擦除框 1:顯示框
void RectArea(uchar x1, uchar y1, uchar x2, uchar y2, bit flag);                       //    (x1,y1) (x2,y2)填充矩形  flag :0:擦除矩形 1:顯示矩形
void hz_disp(uchar x, uchar y, uchar n, uchar code * hz, bit flag);                    //    x:行0~7  y:列0~127  顯示n個漢字 flag:0 反白  16*16
void en_disp(uchar x, uchar y, uchar n, uchar code *asc, uchar *string, bit flag);     //    x:行0~7  y:列0~127  asc:指向標准交換碼  string:指向要顯示的字符串  flag:0 反白顯示

/*--------------------------select the LCD--------------------*/
void LCDSel(uchar sel)
{
    switch(sel) {
        case 0: 
            LCD12864_CS_L = 0;
            LCD12864_CS_R = 0;
            break;      
        case 1: 
            LCD12864_CS_L = 1;
            LCD12864_CS_R = 0;
            break;       //left 
        case 2: 
            LCD12864_CS_L = 0;
            LCD12864_CS_R = 1;
            break;        //right
        default:
            ;
    }
}

/*------------------------------------------------------------*/
void WaitLCD()
{
    uchar flag;
    LCD12864_DATA_PORT = 0xFF;
    LCD12864_RW = 1;
    LCD12864_RS = 0;
    LCD12864_EN = 1;
    LCD12864_EN = 1;
    LCD12864_EN = 0;
    LCD12864_DATA_PORT = 0xFF;
    LCD12864_RW = 1;
    LCD12864_RS = 0;
    LCD12864_EN=1;

    do {
        flag=LCD12864_DATA_PORT;
    } while(!((flag & 0x80) == 0x80));
    
    LCD12864_EN=0;
}
                
/*-------------------------------------------------------------*/
void WriteDatToLCD12864(uchar dat)
{
    WaitLCD();
    LCD12864_RS = 1;
    LCD12864_RW = 0;
    LCD12864_DATA_PORT = dat;
    
    LCD12864_EN = 1;
    LCD12864_EN = 0;
}

/*-------------------------------------------------------------*/
void WriteCmdToLCD12864(uchar cmd)
{
    WaitLCD();
    LCD12864_RS = 0;
    LCD12864_RW = 0;
    LCD12864_DATA_PORT = cmd;
       
    LCD12864_EN = 1;
    LCD12864_EN = 0;
}
/*-------------------------------------------------------------*/
uchar ReadDatFromLCD12864(void)
{
    uchar dat;
    WaitLCD();

    LCD12864_DATA_PORT = 0xFF;              
    LCD12864_RS = 1;
    LCD12864_RW = 1;
    LCD12864_EN = 1;
    LCD12864_EN = 1;
    LCD12864_EN = 0;

    LCD12864_DATA_PORT = 0xFF;
    LCD12864_RS = 1;
    LCD12864_RW = 1;
    LCD12864_EN = 1;
    LCD12864_EN = 1;

    dat = LCD12864_DATA_PORT;
    LCD12864_EN = 0;

    return dat;
}
    

//x:0~7
void SetX(uchar x)
{
    WriteCmdToLCD12864(Add_X + x);
}


//y:0~127
void SetY(uchar y)
{
    WriteCmdToLCD12864(Add_Y + y);
}
/*------------------------------------------------------------*/
//z:0~63
void SetZ(uchar z)
{
    WriteCmdToLCD12864(Add_Z + z);
}

//    12864顯示器初始化
void LCD12864_init(void)
{
    LCDSel(0);                       

    WriteCmdToLCD12864(0x3E);              //    分別初始化左半屏和右半屏
    WriteCmdToLCD12864(0X3F);
}

//    清屏
void ClearLCD()
{
    int i, j;

    LCDSel(0);
    for(j = 0; j < 8; j++) {
        WriteCmdToLCD12864(LCD_ON);
        SetX(j);  
        WriteCmdToLCD12864(Add_Y);
        SetZ(0);

        for (i = 0; i < 64; i++) {
            WriteDatToLCD12864(0x00);
        }
    }    
}

/*------------------------------------------------------------*/
//左上角第一個點為原點,垂直向下為Y軸,水平向右為X軸
//x:0~63~127    y:0~63
//flag :  0:擦除某個點
//        1:顯示某個點 
uchar code Tab[] = {
    0x01, 0x02, 0x04, 0x08,
    0x10, 0x20, 0x40, 0x80
};

void Dot(char x,char y,bit flag)
{
    unsigned char dat;
    //    y=63-y;                                  
    //    坐標軸的移動和反轉
    if (x < 64) {
        LCDSel(1);
        SetX(y / 8);           //    set the page address
        SetY(x);               //    set the Y adress
        dat = ReadDatFromLCD12864();

        if(flag) {
            dat = dat | (Tab[y % 8]);
        } else {
            dat= dat & (~(Tab[y % 8]));
        }
        
        SetX(y / 8);
        SetY(x);         //set the Y adress
        WriteDatToLCD12864(dat);
    } else if (x < 128) {
        LCDSel(2);
        SetX(y / 8);
        SetY(x - 64);

        dat=ReadDatFromLCD12864();

        if(flag) {
            dat = dat | (Tab[y % 8]);
        } else {
             dat = dat & (~(Tab[y % 8]));
        }

        SetY(x - 64);
        WriteDatToLCD12864(dat);
    }     
}

void swap(uchar *x, uchar *y)
{
    uchar tmp = *x;

    *x = *y;
    *y = tmp;
}

//    draw a line between point(x1,y1) and point(x2,y2)
//    flag       0: erase the line    
//            1: draw a line
void Line(uchar x1, uchar y1, uchar x2, uchar y2, bit flag)
{
    uchar i;
    float k;

    if (x1 == x2) {
        if (y1 > y2) {   
            swap(&x1, &x2);
            swap(&y1, &y2);
        }
        for (i = y1; i <= y2; i++) {
            Dot(x1, i, flag);
        }
    } else {
        if ( x1 > x2) {
               swap(&x1, &x2);
            swap(&y1, &y2);
         }

        k = (float)(y2 - y1) / (float)(x2 - x1);

        for (i = 0; i < x2 - x1; i++) {
            Dot(x1 + i, (uchar)(y1 + k * i), flag);
        }
    }
}       

void rectBoundary(uchar x1, uchar y1, uchar x2, uchar y2, bit flag)
{
       Line(x1, y1, x2, y1, flag);
    Line(x1, y1, x1, y2, flag);
    Line(x2, y1, x2, y2, flag);
    Line(x1, y2, x2, y2, flag);
} 


void RectArea(uchar x1, uchar y1, uchar x2, uchar y2, bit flag)
{
    uchar i;

    if (x1 > x2) {
        swap(&x1, &x2);
        swap(&y1, &y2);
    }

    for (i = 0; i <= x2 - x1; i++) {
        Line(x1 + i, y1, x1 + i, y2, flag);
    }

}              


//    16 * 16
//    x行  0~7      
//    y列  0~127
//    flag 0:漢字反白顯示
void hz_disp(uchar x, uchar y, uchar n, uchar code * hz, bit flag)
{
    uchar i, j;
    for (j = 0; j < n; j++) {
        //顯示上半個漢字
        for (i = 0; i < 16; i++) {
            //點的位置是在左還是右
            if(y + 16 * j + i < 64) {
                LCDSel(1);
                WriteCmdToLCD12864(LCD_ON);
                
                SetX(x);
                SetZ(0);
                SetY(y+16*j+i);

                if(flag) {
                     WriteDatToLCD12864(hz[32 * j + i]);
                } else {
                     WriteDatToLCD12864(~hz[32 * j + i]);
                }        
            } else if(y + 16 * j + i < 128) {
                LCDSel(2);
                WriteCmdToLCD12864(LCD_ON);

                SetX(x);
                SetZ(0);
                SetY(y + 16 * j + i - 64);

                if(flag) {
                     WriteDatToLCD12864(hz[32 * j + i]);
                } else {
                     WriteDatToLCD12864(~hz[32 * j + i]);
                }      
            }
        }
        
        //顯示下半個漢字
        for (i = 16; i < 32; i++) {
            //先判斷點是在左還是在右
            if(y + 16 * j + i - 16 < 64) {    
                if(x + 1 < 8) {                               //最后一行顯示上半個字
                    LCDSel(1);
                    WriteCmdToLCD12864(LCD_ON);

                    SetX(x + 1);
                    SetZ(0);
                    SetY(y + 16 * j + i - 16);

                    if(flag) {
                         WriteDatToLCD12864(hz[32 * j + i]);
                    } else {
                         WriteDatToLCD12864(~hz[32 * j + i]);
                    }    
                }
            } else if (y + 16 * j + i - 16 < 127) {
                if(x + 1 < 8) {                           //最后一行
                    LCDSel(2);
                    WriteCmdToLCD12864(LCD_ON);

                    SetX(x + 1);
                    SetZ(0);
                    SetY(y + 16 * j + i - 16 - 64);

                    if(flag) {
                         WriteDatToLCD12864(hz[32 * j + i]);
                    } else {
                         WriteDatToLCD12864(~hz[32 * j + i]);
                    }
                }
            }
        }
    }
}


//    x:行0~7
//    y:列0~127
//    asc: 指向標准交換碼
//    string: 指向要顯示的字符串
//    flag:  0 反白顯示
void en_disp(uchar x, uchar y, uchar n, uchar code *asc, uchar *string, bit flag)
{
    uchar i, j, loc;

    for (j = 0; j < n; j++) {
        loc = string[j] - 0x20;            //    確定要顯示的字符在asc表中的位置(乘上16)
        
        //    顯示上半個ASCII字符
        for (i = 0; i < 8; i++) {
            //     點的位置是在左還是右
            if( y + 8 * j + i < 64) {
                LCDSel(1);
                WriteCmdToLCD12864(LCD_ON);
                
                SetX(x);
                SetZ(0);
                SetY(y + 8 * j + i);
                
                if(flag) {
                    WriteDatToLCD12864(asc[16 * loc + i]);
                } else {
                    WriteDatToLCD12864(~asc[16 * loc + i]);
                }
                    
            } else if (y + 8 * j + i < 128) {
                LCDSel(2);
                WriteCmdToLCD12864(LCD_ON);

                SetX(x);
                SetZ(0);
                SetY(y + 8 * j + i - 64);

                if(flag) {
                    WriteDatToLCD12864(asc[16 * loc + i]);
                } else {
                    WriteDatToLCD12864(~asc[16 * loc + i]);
                }            
            }
        }

        //    顯示下半個ASCII字符
        for (i = 8; i < 16; i++) {
            //    先判斷點是在左還是在右
            if(y + 8 * j + i - 8 < 64) {  
                if(x + 1 < 8) {                        //    最后一行
                    LCDSel(1);
                    WriteCmdToLCD12864(LCD_ON);

                    SetX(x + 1);
                    SetZ(0);
                    SetY(y + 8 * j + i - 8);

                    if(flag) {
                        WriteDatToLCD12864(asc[16 * loc + i]);
                    } else {
                        WriteDatToLCD12864(~asc[16 * loc + i]);
                    }        
                }
            } else if (y + 8 * j + i - 8 < 128) {
                if(x + 1 < 8) {                       //    最后一行
                    LCDSel(2);
                    WriteCmdToLCD12864(LCD_ON);

                    SetX(x + 1);
                    SetZ(0);
                    SetY(y + 8 * j + i - 8 - 64);

                    if(flag) {
                        WriteDatToLCD12864(asc[16 * loc + i]);
                    } else {
                        WriteDatToLCD12864(~asc[16 * loc + i]);
                    }
                }        
            }
        }
    }  
}

 

//    asc.h
//    以下均為漢子和字符的代碼,感謝曉奇工作室 www.xiao-qi.com的軟件

//    難度
unsigned char code gameLevel[]=
{
      0x04,0x34,0xC4,0x04,0xC4,0x3E,0x44,0x20,
      0xF8,0x4F,0x49,0xFA,0x48,0x4C,0x08,0x00,
      0x20,0x10,0x0C,0x03,0x04,0x18,0x00,0x00,
      0xFF,0x22,0x22,0x3F,0x22,0x32,0x20,0x00,

      0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0xA5,
      0xA6,0xA4,0xFC,0x24,0x34,0x26,0x04,0x00,
      0x40,0x20,0x9F,0x80,0x42,0x42,0x26,0x2A,
      0x12,0x2A,0x26,0x42,0x40,0xC0,0x40,0x00
};

//    貪吃蛇
unsigned char code snaker[]=
{
      0x00,0x20,0x10,0xD8,0x88,0x8C,0x96,0x97,
      0xDB,0xB2,0x94,0x9C,0xD8,0xB0,0x20,0x20,
      0x00,0x00,0x00,0x9F,0x5F,0x60,0x30,0x3E,
      0x1C,0x60,0xC0,0xDF,0x5F,0x00,0x00,0x00,

      0x00,0xFC,0xF8,0x08,0xF8,0xFC,0x48,0x20,
      0xB8,0x9E,0x97,0x92,0x90,0xD0,0x98,0x10,
      0x00,0x1F,0x1F,0x08,0x1F,0x1F,0x00,0x70,
      0xF8,0xCC,0xC6,0xC2,0xC3,0xC1,0xF0,0x40,

       0x00,0xF0,0x20,0xFE,0xFC,0x20,0xF0,0x18,
      0x3C,0x08,0xE9,0xCE,0x0C,0x88,0x38,0x1C,
      0x00,0x23,0x62,0x3F,0x3F,0x12,0x3B,0x20,
      0x10,0x08,0x7F,0xFF,0xC3,0xC3,0x79,0x20
};

//    游戲結束
unsigned char code theEnd[]=
{
      0x10,0x22,0x6C,0x00,0x08,0x08,0xF9,0x4A,
      0xC8,0x18,0x28,0x27,0xA4,0x66,0x24,0x00,
      0x04,0x04,0xFE,0x41,0x20,0x18,0x07,0x40,
      0x7F,0x02,0x42,0x82,0x7F,0x02,0x02,0x00,

      0x00,0x14,0x24,0xC4,0x04,0xE4,0x1C,0x10,
      0x10,0xFF,0x10,0x12,0x14,0xD0,0x10,0x00,
      0x20,0x10,0x08,0x06,0x01,0x02,0x8C,0x40,
      0x20,0x17,0x18,0x24,0x43,0x80,0xE0,0x00,

      0x00,0x30,0x28,0xA4,0x63,0x10,0x08,0x48,
      0x48,0x48,0x7F,0x48,0x48,0x4C,0x08,0x00,
      0x00,0x22,0x63,0x22,0x12,0x12,0x00,0xFE,
      0x42,0x42,0x42,0x42,0x42,0xFF,0x02,0x00,

      0x04,0x04,0xE4,0x24,0x24,0x24,0x24,0xFF,
      0x24,0x24,0x24,0x24,0xF4,0x26,0x04,0x00,
      0x40,0x40,0x27,0x22,0x12,0x0A,0x06,0xFF,
      0x06,0x0A,0x12,0x12,0x27,0x60,0x20,0x00
};

//    成都理工大學工程技術學院
unsigned char code mySchool[12][32] = {
      0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0x08,
      0x08,0xFF,0x08,0x09,0x0A,0xC8,0x08,0x00,
      0x80,0x60,0x1F,0x00,0x10,0x20,0x1F,0x80,
      0x40,0x21,0x16,0x18,0x26,0x41,0xF8,0x00,

       0x20,0x24,0x24,0xA4,0x7F,0x24,0x34,0x28,
      0x26,0x20,0xFE,0x02,0x22,0xDA,0x06,0x00,
      0x04,0x02,0xFF,0x49,0x49,0x49,0x49,0xFF,
      0x00,0x00,0xFF,0x08,0x10,0x08,0x07,0x00,

       0x04,0x84,0x84,0xFC,0x84,0x84,0x00,0xFE,
      0x92,0x92,0xFE,0x92,0x92,0xFE,0x00,0x00,
      0x20,0x60,0x20,0x1F,0x10,0x10,0x40,0x44,
      0x44,0x44,0x7F,0x44,0x44,0x44,0x40,0x00,

       0x00,0x04,0x04,0x04,0x04,0x04,0x04,0xFC,
      0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00,
      0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,
      0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,

       0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xFF,
      0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
      0x80,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,
      0x03,0x0C,0x10,0x20,0x40,0x80,0x80,0x00,

       0x40,0x30,0x11,0x96,0x90,0x90,0x91,0x96,
      0x90,0x90,0x98,0x14,0x13,0x50,0x30,0x00,
      0x04,0x04,0x04,0x04,0x04,0x44,0x84,0x7E,
      0x06,0x05,0x04,0x04,0x04,0x04,0x04,0x00,

      0x00,0x04,0x04,0x04,0x04,0x04,0x04,0xFC,
      0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00,
      0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,
      0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,

       0x24,0x24,0xA4,0xFE,0x23,0x22,0x00,0x3E,
      0x22,0x22,0x22,0x22,0x22,0x3E,0x00,0x00,
      0x08,0x06,0x01,0xFF,0x01,0x06,0x40,0x49,
      0x49,0x49,0x7F,0x49,0x49,0x49,0x41,0x00,

       0x10,0x10,0x10,0xFF,0x10,0x90,0x08,0x88,
      0x88,0x88,0xFF,0x88,0x88,0x88,0x08,0x00,
      0x04,0x44,0x82,0x7F,0x01,0x80,0x80,0x40,
      0x43,0x2C,0x10,0x28,0x46,0x81,0x80,0x00,

       0x00,0x10,0x10,0x10,0x10,0xD0,0x30,0xFF,
      0x30,0xD0,0x12,0x1C,0x10,0x10,0x00,0x00,
      0x10,0x08,0x04,0x02,0x01,0x00,0x00,0xFF,
      0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x00,

       0x40,0x30,0x11,0x96,0x90,0x90,0x91,0x96,
      0x90,0x90,0x98,0x14,0x13,0x50,0x30,0x00,
      0x04,0x04,0x04,0x04,0x04,0x44,0x84,0x7E,
      0x06,0x05,0x04,0x04,0x04,0x04,0x04,0x00,
       
      0x00,0xFE,0x22,0x5A,0x86,0x10,0x0C,0x24,
      0x24,0x25,0x26,0x24,0x24,0x14,0x0C,0x00,
      0x00,0xFF,0x04,0x08,0x07,0x80,0x41,0x31,
      0x0F,0x01,0x01,0x3F,0x41,0x41,0x71,0x00
};

//    畢業設計
unsigned char code myName[6][32] = {
       0x40,0x48,0x48,0x48,0xFF,0x48,0x48,0x00,
      0x04,0x08,0x30,0xC0,0x30,0x0E,0x00,0x00,
      0x80,0x60,0x1F,0x20,0x7F,0x44,0x44,0x40,
      0x48,0x44,0x43,0x40,0x43,0x4C,0x40,0x00,

       0x20,0xC2,0x0C,0x80,0x84,0xA4,0xA4,0xAF,
      0xA4,0xF4,0xA4,0xAF,0xA4,0xE4,0x84,0x00,
      0x04,0x04,0x7E,0x81,0x40,0x3A,0x22,0x1A,
      0x02,0xFF,0x0A,0x32,0x02,0xFB,0x00,0x00,

      0x00,0x00,0xFF,0x88,0x88,0x48,0x48,0x00,
      0x7F,0x88,0x84,0x84,0x82,0xE0,0x00,0x00,
      0x04,0x04,0x05,0x04,0x04,0x04,0x04,0xFF,
      0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,

       0x00,0x10,0x60,0x80,0x00,0xFF,0x00,0x00,
      0x00,0xFF,0x00,0x00,0xC0,0x30,0x00,0x00,
      0x40,0x40,0x40,0x43,0x40,0x7F,0x40,0x40,
      0x40,0x7F,0x42,0x41,0x40,0x40,0x40,0x00,

       0x40,0x40,0x42,0xCC,0x00,0x40,0xA0,0x9E,
      0x82,0x82,0x82,0x9E,0xA0,0x20,0x20,0x00,
      0x00,0x00,0x00,0x3F,0x90,0x88,0x40,0x43,
      0x2C,0x10,0x28,0x46,0x41,0x80,0x80,0x00,

       0x40,0x40,0x42,0xCC,0x00,0x40,0x40,0x40,
      0x40,0xFF,0x40,0x40,0x40,0x40,0x40,0x00,
      0x00,0x00,0x00,0x7F,0x20,0x10,0x00,0x00,
      0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00
};

//    ASCII值
unsigned char code Asc[] =                   
{
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  // - -
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x00,0x00,0x38,0xFC,0xFC,0x38,0x00,0x00,  // -!-
    0x00,0x00,0x00,0x0D,0x0D,0x00,0x00,0x00,

    0x00,0x0E,0x1E,0x00,0x00,0x1E,0x0E,0x00,  // -"-
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x20,0xF8,0xF8,0x20,0xF8,0xF8,0x20,0x00,  // -#-
    0x02,0x0F,0x0F,0x02,0x0F,0x0F,0x02,0x00,

    0x38,0x7C,0x44,0x47,0x47,0xCC,0x98,0x00,  // -$-
    0x03,0x06,0x04,0x1C,0x1C,0x07,0x03,0x00,

    0x30,0x30,0x00,0x80,0xC0,0x60,0x30,0x00,  // -%-
    0x0C,0x06,0x03,0x01,0x00,0x0C,0x0C,0x00,

    0x80,0xD8,0x7C,0xE4,0xBC,0xD8,0x40,0x00,  // -&-
    0x07,0x0F,0x08,0x08,0x07,0x0F,0x08,0x00,

    0x00,0x10,0x1E,0x0E,0x00,0x00,0x00,0x00,  // -'-
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x00,0x00,0xF0,0xF8,0x0C,0x04,0x00,0x00,  // -(-
    0x00,0x00,0x03,0x07,0x0C,0x08,0x00,0x00,

    0x00,0x00,0x04,0x0C,0xF8,0xF0,0x00,0x00,  // -)-
    0x00,0x00,0x08,0x0C,0x07,0x03,0x00,0x00,

    0x80,0xA0,0xE0,0xC0,0xC0,0xE0,0xA0,0x80,  // -*-
    0x00,0x02,0x03,0x01,0x01,0x03,0x02,0x00,

    0x00,0x80,0x80,0xE0,0xE0,0x80,0x80,0x00,  // -+-
    0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x00,

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  // -,-
    0x00,0x00,0x10,0x1E,0x0E,0x00,0x00,0x00,

    0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,  // ---
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  // -.-
    0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00,

    0x00,0x00,0x00,0x80,0xC0,0x60,0x30,0x00,  // -/-
    0x0C,0x06,0x03,0x01,0x00,0x00,0x00,0x00,

    0xF8,0xFC,0x04,0xC4,0x24,0xFC,0xF8,0x00,  // -0-
    0x07,0x0F,0x09,0x08,0x08,0x0F,0x07,0x00,

    0x00,0x10,0x18,0xFC,0xFC,0x00,0x00,0x00,  // -1-
    0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,

    0x08,0x0C,0x84,0xC4,0x64,0x3C,0x18,0x00,  // -2-
    0x0E,0x0F,0x09,0x08,0x08,0x0C,0x0C,0x00,

    0x08,0x0C,0x44,0x44,0x44,0xFC,0xB8,0x00,  // -3-
    0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00,

    0xC0,0xE0,0xB0,0x98,0xFC,0xFC,0x80,0x00,  // -4-
    0x00,0x00,0x00,0x08,0x0F,0x0F,0x08,0x00,

    0x7C,0x7C,0x44,0x44,0xC4,0xC4,0x84,0x00,  // -5-
    0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00,

    0xF0,0xF8,0x4C,0x44,0x44,0xC0,0x80,0x00,  // -6-
    0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,

    0x0C,0x0C,0x04,0x84,0xC4,0x7C,0x3C,0x00,  // -7-
    0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,0x00,

    0xB8,0xFC,0x44,0x44,0x44,0xFC,0xB8,0x00,  // -8-
    0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,

    0x38,0x7C,0x44,0x44,0x44,0xFC,0xF8,0x00,  // -9-
    0x00,0x08,0x08,0x08,0x0C,0x07,0x03,0x00,

    0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,  // -:-
    0x00,0x00,0x00,0x06,0x06,0x00,0x00,0x00,

    0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,  // -;-
    0x00,0x00,0x08,0x0E,0x06,0x00,0x00,0x00,

    0x00,0x80,0xC0,0x60,0x30,0x18,0x08,0x00,  // -<-
    0x00,0x00,0x01,0x03,0x06,0x0C,0x08,0x00,

    0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,  // -=-
    0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,

    0x00,0x08,0x18,0x30,0x60,0xC0,0x80,0x00,  // ->-
    0x00,0x08,0x0C,0x06,0x03,0x01,0x00,0x00,

    0x18,0x1C,0x04,0xC4,0xE4,0x3C,0x18,0x00,  // -?-
    0x00,0x00,0x00,0x0D,0x0D,0x00,0x00,0x00,

    0xF0,0xF8,0x08,0xC8,0xC8,0xF8,0xF0,0x00,  // -@-
    0x07,0x0F,0x08,0x0B,0x0B,0x0B,0x01,0x00,

    0xE0,0xF0,0x98,0x8C,0x98,0xF0,0xE0,0x00,  // -A-
    0x0F,0x0F,0x00,0x00,0x00,0x0F,0x0F,0x00,

    0x04,0xFC,0xFC,0x44,0x44,0xFC,0xB8,0x00,  // -B-
    0x08,0x0F,0x0F,0x08,0x08,0x0F,0x07,0x00,

    0xF0,0xF8,0x0C,0x04,0x04,0x0C,0x18,0x00,  // -C-
    0x03,0x07,0x0C,0x08,0x08,0x0C,0x06,0x00,

    0x04,0xFC,0xFC,0x04,0x0C,0xF8,0xF0,0x00,  // -D-
    0x08,0x0F,0x0F,0x08,0x0C,0x07,0x03,0x00,

    0x04,0xFC,0xFC,0x44,0xE4,0x0C,0x1C,0x00,  // -E-
    0x08,0x0F,0x0F,0x08,0x08,0x0C,0x0E,0x00,

    0x04,0xFC,0xFC,0x44,0xE4,0x0C,0x1C,0x00,  // -F-
    0x08,0x0F,0x0F,0x08,0x00,0x00,0x00,0x00,

    0xF0,0xF8,0x0C,0x84,0x84,0x8C,0x98,0x00,  // -G-
    0x03,0x07,0x0C,0x08,0x08,0x07,0x0F,0x00,

    0xFC,0xFC,0x40,0x40,0x40,0xFC,0xFC,0x00,  // -H-
    0x0F,0x0F,0x00,0x00,0x00,0x0F,0x0F,0x00,

    0x00,0x00,0x04,0xFC,0xFC,0x04,0x00,0x00,  // -I-
    0x00,0x00,0x08,0x0F,0x0F,0x08,0x00,0x00,

    0x00,0x00,0x00,0x04,0xFC,0xFC,0x04,0x00,  // -J-
    0x07,0x0F,0x08,0x08,0x0F,0x07,0x00,0x00,

    0x04,0xFC,0xFC,0xC0,0xF0,0x3C,0x0C,0x00,  // -K-
    0x08,0x0F,0x0F,0x00,0x01,0x0F,0x0E,0x00,

    0x04,0xFC,0xFC,0x04,0x00,0x00,0x00,0x00,  // -L-
    0x08,0x0F,0x0F,0x08,0x08,0x0C,0x0E,0x00,

    0xFC,0xFC,0x38,0x70,0x38,0xFC,0xFC,0x00,  // -M-
    0x0F,0x0F,0x00,0x00,0x00,0x0F,0x0F,0x00,

    0xFC,0xFC,0x38,0x70,0xE0,0xFC,0xFC,0x00,  // -N-
    0x0F,0x0F,0x00,0x00,0x00,0x0F,0x0F,0x00,

    0xF0,0xF8,0x0C,0x04,0x0C,0xF8,0xF0,0x00,  // -O-
    0x03,0x07,0x0C,0x08,0x0C,0x07,0x03,0x00,

    0x04,0xFC,0xFC,0x44,0x44,0x7C,0x38,0x00,  // -P-
    0x08,0x0F,0x0F,0x08,0x00,0x00,0x00,0x00,

    0xF8,0xFC,0x04,0x04,0x04,0xFC,0xF8,0x00,  // -Q-
    0x07,0x0F,0x08,0x0E,0x3C,0x3F,0x27,0x00,

    0x04,0xFC,0xFC,0x44,0xC4,0xFC,0x38,0x00,  // -R-
    0x08,0x0F,0x0F,0x00,0x00,0x0F,0x0F,0x00,

    0x18,0x3C,0x64,0x44,0xC4,0x9C,0x18,0x00,  // -S-
    0x06,0x0E,0x08,0x08,0x08,0x0F,0x07,0x00,

    0x00,0x1C,0x0C,0xFC,0xFC,0x0C,0x1C,0x00,  // -T-
    0x00,0x00,0x08,0x0F,0x0F,0x08,0x00,0x00,

    0xFC,0xFC,0x00,0x00,0x00,0xFC,0xFC,0x00,  // -U-
    0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,

    0xFC,0xFC,0x00,0x00,0x00,0xFC,0xFC,0x00,  // -V-
    0x01,0x03,0x06,0x0C,0x06,0x03,0x01,0x00,

    0xFC,0xFC,0x00,0x80,0x00,0xFC,0xFC,0x00,  // -W-
    0x03,0x0F,0x0E,0x03,0x0E,0x0F,0x03,0x00,

    0x0C,0x3C,0xF0,0xC0,0xF0,0x3C,0x0C,0x00,  // -X-
    0x0C,0x0F,0x03,0x00,0x03,0x0F,0x0C,0x00,

    0x00,0x3C,0x7C,0xC0,0xC0,0x7C,0x3C,0x00,  // -Y-
    0x00,0x00,0x08,0x0F,0x0F,0x08,0x00,0x00,

    0x1C,0x0C,0x84,0xC4,0x64,0x3C,0x1C,0x00,  // -Z-
    0x0E,0x0F,0x09,0x08,0x08,0x0C,0x0E,0x00,

    0x00,0x00,0xFC,0xFC,0x04,0x04,0x00,0x00,  // -[-
    0x00,0x00,0x0F,0x0F,0x08,0x08,0x00,0x00,

    0x38,0x70,0xE0,0xC0,0x80,0x00,0x00,0x00,  // -\-
    0x00,0x00,0x00,0x01,0x03,0x07,0x0E,0x00,

    0x00,0x00,0x04,0x04,0xFC,0xFC,0x00,0x00,  // -]-
    0x00,0x00,0x08,0x08,0x0F,0x0F,0x00,0x00,

    0x08,0x0C,0x06,0x03,0x06,0x0C,0x08,0x00,  // -^-
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  // -_-
    0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,

    0x00,0x00,0x03,0x07,0x04,0x00,0x00,0x00,  // -`-
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x00,0xA0,0xA0,0xA0,0xE0,0xC0,0x00,0x00,  // -a-
    0x07,0x0F,0x08,0x08,0x07,0x0F,0x08,0x00,

    0x04,0xFC,0xFC,0x20,0x60,0xC0,0x80,0x00,  // -b-
    0x08,0x0F,0x07,0x08,0x08,0x0F,0x07,0x00,

    0xC0,0xE0,0x20,0x20,0x20,0x60,0x40,0x00,  // -c-
    0x07,0x0F,0x08,0x08,0x08,0x0C,0x04,0x00,

    0x80,0xC0,0x60,0x24,0xFC,0xFC,0x00,0x00,  // -d-
    0x07,0x0F,0x08,0x08,0x07,0x0F,0x08,0x00,

    0xC0,0xE0,0xA0,0xA0,0xA0,0xE0,0xC0,0x00,  // -e-
    0x07,0x0F,0x08,0x08,0x08,0x0C,0x04,0x00,

    0x40,0xF8,0xFC,0x44,0x0C,0x18,0x00,0x00,  // -f-
    0x08,0x0F,0x0F,0x08,0x00,0x00,0x00,0x00,

    0xC0,0xE0,0x20,0x20,0xC0,0xE0,0x20,0x00,  // -g-
    0x27,0x6F,0x48,0x48,0x7F,0x3F,0x00,0x00,

    0x04,0xFC,0xFC,0x40,0x20,0xE0,0xC0,0x00,  // -h-
    0x08,0x0F,0x0F,0x00,0x00,0x0F,0x0F,0x00,

    0x00,0x00,0x20,0xEC,0xEC,0x00,0x00,0x00,  // -i-
    0x00,0x00,0x08,0x0F,0x0F,0x08,0x00,0x00,

    0x00,0x00,0x00,0x00,0x20,0xEC,0xEC,0x00,  // -j-
    0x00,0x30,0x70,0x40,0x40,0x7F,0x3F,0x00,

    0x04,0xFC,0xFC,0x80,0xC0,0x60,0x20,0x00,  // -k-
    0x08,0x0F,0x0F,0x01,0x03,0x0E,0x0C,0x00,

    0x00,0x00,0x04,0xFC,0xFC,0x00,0x00,0x00,  // -l-
    0x00,0x00,0x08,0x0F,0x0F,0x08,0x00,0x00,

    0xE0,0xE0,0x60,0xC0,0x60,0xE0,0xC0,0x00,  // -m-
    0x0F,0x0F,0x00,0x0F,0x00,0x0F,0x0F,0x00,

    0x20,0xE0,0xC0,0x20,0x20,0xE0,0xC0,0x00,  // -n-
    0x00,0x0F,0x0F,0x00,0x00,0x0F,0x0F,0x00,

    0xC0,0xE0,0x20,0x20,0x20,0xE0,0xC0,0x00,  // -o-
    0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,

    0x20,0xE0,0xC0,0x20,0x20,0xE0,0xC0,0x00,  // -p-
    0x40,0x7F,0x7F,0x48,0x08,0x0F,0x07,0x00,

    0xC0,0xE0,0x20,0x20,0xC0,0xE0,0x20,0x00,  // -q-
    0x07,0x0F,0x08,0x48,0x7F,0x7F,0x40,0x00,

    0x20,0xE0,0xC0,0x60,0x20,0x60,0xC0,0x00,  // -r-
    0x08,0x0F,0x0F,0x08,0x00,0x00,0x00,0x00,

    0x40,0xE0,0xA0,0x20,0x20,0x60,0x40,0x00,  // -s-
    0x04,0x0C,0x09,0x09,0x0B,0x0E,0x04,0x00,

    0x20,0x20,0xF8,0xFC,0x20,0x20,0x00,0x00,  // -t-
    0x00,0x00,0x07,0x0F,0x08,0x0C,0x04,0x00,

    0xE0,0xE0,0x00,0x00,0xE0,0xE0,0x00,0x00,  // -u-
    0x07,0x0F,0x08,0x08,0x07,0x0F,0x08,0x00,

    0x00,0xE0,0xE0,0x00,0x00,0xE0,0xE0,0x00,  // -v-
    0x00,0x03,0x07,0x0C,0x0C,0x07,0x03,0x00,

    0xE0,0xE0,0x00,0x00,0x00,0xE0,0xE0,0x00,  // -w-
    0x07,0x0F,0x0C,0x07,0x0C,0x0F,0x07,0x00,

    0x20,0x60,0xC0,0x80,0xC0,0x60,0x20,0x00,  // -x-
    0x08,0x0C,0x07,0x03,0x07,0x0C,0x08,0x00,

    0xE0,0xE0,0x00,0x00,0x00,0xE0,0xE0,0x00,  // -y-
    0x47,0x4F,0x48,0x48,0x68,0x3F,0x1F,0x00,

    0x60,0x60,0x20,0xA0,0xE0,0x60,0x20,0x00,  // -z-
    0x0C,0x0E,0x0B,0x09,0x08,0x0C,0x0C,0x00,

    0x00,0x40,0x40,0xF8,0xBC,0x04,0x04,0x00,  // -{-
    0x00,0x00,0x00,0x07,0x0F,0x08,0x08,0x00,

    0x00,0x00,0x00,0xBC,0xBC,0x00,0x00,0x00,  // -|-
    0x00,0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,

    0x00,0x04,0x04,0xBC,0xF8,0x40,0x40,0x00,  // -}-
    0x00,0x08,0x08,0x0F,0x07,0x00,0x00,0x00,

    0x08,0x0C,0x04,0x0C,0x08,0x0C,0x04,0x00,  // -~-
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x80,0xC0,0x60,0x30,0x60,0xC0,0x80,0x00,  // --
    0x07,0x07,0x04,0x04,0x04,0x07,0x07,0x00,
};

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM