原标题:ARM触屏校准程序
程序功能:
1) 校准:
按下预设的4个坐标点,利用ADC转换功能采集对应物理坐标,得出物理坐标与屏幕像素坐标之间的关系。
物理坐标和象素坐标的转换表达式如下:
hor_pix = (int)(mul_x * X + add_x)
ver_pix = (int)(mul_y * Y + add_y)
其中:(X, Y)表示物理坐标,(hor_pix, ver_pix)表示象素坐标。
2)触屏 :
随机按下触屏,根据以上公式,程序自动给出相应象素坐标值。
3)信息显示:
整个过程中的提示信息,均以ASCII字符形式显示在屏幕上。
功能模块说明:
本程序以2440触屏测试程序源码为基础,增加了以下功能模块:
1)ascii码字符串输出函数:以象素点阵画出ascii码字符并在屏幕上显示。
2)字符串滚动显示函数:参考操作系统终端的显示方式,设定一个固定显示8行字符的区域,新的一行字符显示出来的时候会使其上所有字符上移一行。
3)同一行追加显示函数:要显示的字符串不另起一行,而是在最后一行的尾部以追加的方式显示。
4)全屏刷新函数:在屏幕滚动显示的时候,显示效果与显存内容不同步,在滚动结束时,需调用此函数进行处理。
5)画十字函数:在指定位置画出十字,以显示校准点。
6)带轨迹移动十字函数:按指定偏移量水平或垂直移动十字, 并显示移动轨迹。
7)校准数据采集有效性判断函数:根据设定的阀值判断采集到的物理坐标是否有效,以保证准确按下校准点。
8) /整型数转字符串函数:为了将数值显示于屏幕上,需预先转换为字符串类型。
9)触屏按下处理函数:判断当前按下的点是校准点还是测试点,并做出相应处理,若为校准点将会在屏幕上显示下一步操作提示信息,为测试点的话会显示相应位置的象素坐标。
10)触屏弹起处理函数:判断触屏校准工作是否完成,完成的话将会显示象素坐标的计算公式,否则会给出下一步操作信息。
11)行清理函数:以背景色填充指定行。
程序执行效果:
代码文件:
1)触屏校准函数库文件,包含以上所有功能模块。
/*****************************************
NAME: adj_sc.c
DESC: Adjusting Touch screen & test
HISTORY:
2011.09.01:Joshua Chan: draft ver 1.0
*****************************************/
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
#include "profile.h"
#include "memtest.h"
#include "main.h"
#include "adj_sc.h"
/* 定义320行,240列的数组,用于存放显示数据 */
volatile unsigned short LCD_BUFFER[SCR_YSIZE][SCR_XSIZE];
/* 用(current_x, current_y)来记录下次显示字符的起始坐标 */
int current_x = 0;
int current_y = 0;
/*
* (x1, y1), (x2, y2), (x3, y3), (x4, y4)用来采集4个校准点物理坐标
* 4个屏幕校准点象素坐标分别为: (40, 30), (280, 30), (280, 210), (40, 210)
*/
int x1=0, x2=0, x3=0, x4=0;
int y1=0, y2=0, y3=0, y4=0;
int collect_count = 0;
/* current_row记录下次打印起始行, 第一次打印从57行开始 */
int current_row = 57;
/*
* 物理坐标和象素坐标的转换表达式如下:
* hor_pix = (int)(mul_x * X + add_x)
* ver_pix = (int)(mul_y * Y + add_y)
* 其中: (X, Y)表示物理坐标, (hor_pix, ver_pix)表示象素坐标
*/
float mul_x = 0.0;
float mul_y = 0.0;
float add_x = 0.0;
float add_y = 0.0;
/*
* 用象素点阵画出ascii码字符
* 每个文字点阵8x16, 长度16字节, 即 1 bit 表示 1 象素
* 排列方式:横向顺序,横排
* @*ch: 字模数组地址
* @swi: 起始坐标选择开关, 值为0时, 表示起始坐标为(x0, y0),
* 值为1时, 表示起始坐标为(current_x, current_y),
* 即最后画的那一个字符后面的位置.
*/
void draw_char(int x0, int y0, U16 front_color, U16 back_color, char *ch, int swi)
{
int x=0, y=0;
unsigned char tmp = 0;
U32 c=0;
char *p = ch;
if (swi == 1) {
x0 = current_x;
y0 = current_y;
}
while (*p) {
for (y=y0; y
for (x=x0; x
/* 用tmp取出数组中对应的元素, 长度为1字节,
* 取出tmp中相应的1位, 并转换为2字节的颜色信息,
* 并存入显存相应位置 */
tmp = ASCII[(*p)*16+y-y0];
c = (tmp & (1<
LCD_BUFFER[y][x] = c;
}
}
x0 = x0 + 8;
p++;
}
current_x = x;
current_y = y0;
}
/*
* 在高度为128的象素区滚动显示字符点阵
* 因为每个文字点阵8x16, 所以此区域共可显示8行文字
* 起始垂直象素坐标57, 结束坐标为184
* 第一行文字从坐标57开始, 末行文字从坐标169开始
* @*ch: 要显示的字符串地址
*/
void scroll_display(char *ch)
{
int x0 = 10;
int i, j, k;
if (current_row > 169) {
current_row = 169;
for (i=0; i<16; i++) {
for (j=57; j<184-i; j++) {
clear_line(j);
for (k=1; k<320; k++) {
LCD_BUFFER[j][k] = LCD_BUFFER[j+1][k];
}
}
clear_line(184 - i);
}
}
draw_char(x0, current_row, F_COLOR, B_COLOR, ch, 0);
current_row += 16;
refresh_screen();
}
/*
* 挨着上次的字符显示指定字符串
*/
voidd_display(char *ch)
{
draw_char(0, 0, F_COLOR, B_COLOR, ch, 1);
refresh_screen();
}
/*
* 用背景色填充指定行
*/
void clear_line(int line)
{
int i;
for (i=1; i<320; i++)
LCD_BUFFER[line][i] = B_COLOR;
}
/*
* 全屏刷新
* 在屏幕滚动显示的时候, 显示效果与显存内容不同步,
* 在滚动结束时, 需调用此函数处理
*/
void refresh_screen(void)
{
int i, j;
for( i = 0 ; i < SCR_YSIZE ; i++ )
for( j = 0 ; j < SCR_XSIZE ; j++ )
LCD_BUFFER[i][j] = LCD_BUFFER[i][j] ;
}
/*
* 以(x0, y0)为中心画十字
*/
void draw_cross(int x0, int y0, int size, U16 d_color)
{
int x=0, y=0;
int tmp = size/2;
for (x=(x0-tmp); x
LCD_BUFFER[y0][x] = d_color;
for (y=(y0-tmp); y
LCD_BUFFER[y][x0] = d_color;
}
/*
* 水平或垂直移动十字, 并显示移动轨迹
* 在移动的过程中, 用背景色画十字来清除轨迹
* (x0, y0) 为起始坐标
* @x_of: X 方向偏移量
* @y_of: Y 方向偏移量
* "x_of" 与 "y_of" 二者必须要有一个值为0
*/
void move_cross(int x0, int y0, int siz, int x_of, int y_of)
{
int i = 0;
if (x_of!=0 && y_of!=0)
return;
if (x_of > 0)
for (i=0; i
draw_cross(x0+i-1, y0, siz, B_COLOR);
draw_cross(x0+i+1, y0, siz, B_COLOR);
draw_cross(x0, y0-1, siz, B_COLOR);
draw_cross(x0, y0+1, siz, B_COLOR);
draw_cross(x0+i, y0, siz, F_COLOR);
delay(600);
}
else if (x_of < 0)
for (i=0; i>x_of; i--) {
draw_cross(x0+i-1, y0, siz, B_COLOR);
draw_cross(x0+i+1, y0, siz, B_COLOR);
draw_cross(x0, y0-1, siz, B_COLOR);
draw_cross(x0, y0+1, siz, B_COLOR);
draw_cross(x0+i, y0, siz, F_COLOR);
delay(600);
}
else if (y_of > 0)
for (i=0; i
draw_cross(x0-1, y0, siz, B_COLOR);
draw_cross(x0+1, y0, siz, B_COLOR);
draw_cross(x0, y0+i-1, siz, B_COLOR);
draw_cross(x0, y0+i+1, siz, B_COLOR);
draw_cross(x0, y0+i, siz, F_COLOR);
delay(600);
}
else if (y_of < 0)
for (i=0; i>y_of; i--) {
draw_cross(x0-1, y0, siz, B_COLOR);
draw_cross(x0+1, y0, siz, B_COLOR);
draw_cross(x0, y0+i-1, siz, B_COLOR);
draw_cross(x0, y0+i+1, siz, B_COLOR);
draw_cross(x0, y0+i, siz, F_COLOR);
delay(600);
}
}
/*
* 取字符串长度
*/
int str_len(char *ch)
{
char *p = ch;
int ret = 0;
while (*p) {
ret++;
p++;
}
return ret;
}
/*
* 取绝对值
*/
float abs_val(float f)
{
float ret = f;
if (ret < 0)
ret = (-1) * ret;
return ret;
}
/*
* 对采集到的坐标进行有效性判断
* 允许偏差值可以通过 @allow_val 设置
*/
int check_data(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
{
int allow_val = 20;
int ret = 0;
if (abs_val(y2-y1) > allow_val)
ret = 1;
if (abs_val(x3-x2) > allow_val)
ret = 1;
if (abs_val(y4-y3) > allow_val)
ret = 1;
if (abs_val(x4-x1) > allow_val)
ret = 1;
return ret;
}
/*
* 转换浮点数为字符串, 保留2位小数
*/
void float_str(float f, char *ch)
{
char s[10] = {0};
int sign = (f < 0) ? 1 : 0;
int n = (sign == 1) ? ((int)(f * (-100))) : ((int)(f * 100));
int i = 0;
int j = 0;
s[0] = (n % 10) + '0';
n = n / 10;
s[1] = (n % 10) + '0';
s[2] = '.';
n = n / 10;
i = 3;
while (n) {
s[i] = (n % 10) + '0';
n = n / 10;
i++;
}
if (i == 3) {
s[i] = '0';
i++;
}
if (sign == 1) {
s[i] = '-';
i++;
}
for (--i; i>-1; i--) {
ch[j] = s[i];
j++;
}
ch[j] = '\0';
}
/*
* 转换整型数为字符串
*/
void int_str(int n, char *ch)
{
char s[10] = {0};
int i = 0;
int j = 0;
if (n == 0)
{
s[i] = '0';
i++;
}
while (n)
{
s[i] = (n % 10) + '0';
n = n / 10;
i++;
}
for (--i; i>-1; i--)
{
ch[j] = s[i];
j++;
}
ch[j] = '\0';
}
/*
* 在触屏按下时, 根据当前状态作出相应处理
* collect_count为0表示正按下第1个校准点
* collect_count为1表示正按下第2个校准点
* collect_count为2表示正按下第3个校准点
* collect_count为3表示正按下第4个校准点
* collect_count为-2表示正按下测试点
*/
void check_touch_down(void)
{
char hor_pixa[10] = {0};
char ver_pixa[10] = {0};
int hor_pix = 0;
int ver_pix = 0;
if (collect_count == 0) {
x1 = xdata;
y1 = ydata;
move_cross(40, 30, 15, 240, 0);
scroll_display("Please touch the 2nd point.");
collect_count++;
}
else if (collect_count == 1) {
x2 = xdata;
y2 = ydata;
move_cross(280, 30, 15, 0, 180);
scroll_display("Please touch the 3rd point.");
collect_count++;
}
else if (collect_count == 2) {
x3 = xdata;
y3 = ydata;
move_cross(280, 210, 15, -240, 0);
scroll_display("Please touch the 4th point.");
collect_count++;
}
else if (collect_count == 3) {
x4 = xdata;
y4 = ydata;
collect_count++;
}
else if (collect_count == -2) {
hor_pix = (int)(mul_x * xdata + add_x);
ver_pix = (int)(mul_y * ydata + add_y);
if (hor_pix < 0)
hor_pix = 0;
else if (hor_pix > 319)
hor_pix = 319;
if (ver_pix < 0)
ver_pix = 0;
else if (ver_pix > 239)
ver_pix = 239;
int_str(hor_pix, hor_pixa);
int_str(ver_pix, ver_pixa);
scroll_display("");
scroll_display("coordinate(hor, ver) = (");
add_display(hor_pixa);
add_display(", ");
add_display(ver_pixa);
add_display(")");
}
}
/*
* 在触屏弹起时, 根据当前状态作出相应处理
* collect_count为4表示第4个校准点已采集完毕
* collect_count为-1表示校准工作已完成
*/
void check_touch_up(void)
{
char mul_xa[10] = {0};
char mul_ya[10] = {0};
char add_xa[10] = {0};
char add_ya[10] = {0};
if (collect_count == 4) {
if (!(check_data(x1, y1, x2, y2, x3, y3, x4, y4))) {
mul_x = (280-40) / (((float)x2+(float)x3-(float)x1-(float)x4)/2);
add_x = 40 - (mul_x * (((float)x1+(float)x4)/2));
mul_y = (210-30) / (((float)y3+(float)y4-(float)y1-(float)y2)/2);
add_y = 30 - (mul_y * (((float)y1+(float)y2)/2));
float_str(mul_x, mul_xa);
float_str(add_x, add_xa);
float_str(mul_y, mul_ya);
float_str(add_y, add_ya);
scroll_display("");
scroll_display("Adjusting finished!");
scroll_display("");
scroll_display("hor_pix = (int)((");
add_display(mul_xa);
add_display(")*X+(");
add_display(add_xa);
add_display("))");
scroll_display("ver_pix = (int)((");
add_display(mul_ya);
add_display(")*Y+(");
add_display(add_ya);
add_display("))");
scroll_display("");
delay(30000);
scroll_display("Touch the screen to continue.");
collect_count = -1;
draw_cross(41, 210, 15, B_COLOR);
refresh_screen();
}
else {
scroll_display("");
scroll_display("Adjusting fai, try again.");
collect_count = 0;
scroll_display("");
delay(30000);
scroll_display("Please touch the 1st point.");
draw_cross(41, 210, 15, B_COLOR);
refresh_screen();
draw_cross(40, 30, 15, F_COLOR);
}
}
else if (collect_count == -1) {
scroll_display("");
scroll_display("As the touch screen is adjusted,");
delay(10000);
scroll_display("let's have some test.");
delay(10000);
scroll_display("You can touch the screen,");
delay(10000);
scroll_display("and the coordinate will be shown.");
collect_count = -2;
}
}
void delay(int times)
{
int i,j;
for(i=0;i
for(j=0;j<400;j++);
}
2)触屏校准头文件。
/*****************************************
NAME: adj_sc.c
DESC: Adjusting Touch screen & test
HISTORY:
2011.09.01:Joshua Chan: draft ver 1.0
*****************************************/
#ifndef _ADJ_SC_H_
#define _ADJ_SC_H_
#define F_COLOR 0xFFFF
#define B_COLOR 0x0
extern int collect_count;
extern int xdata;
extern int ydata;
/* 声明ascii码字模数组,数组在ascii.c文件中定义 */
extern unsigned char ASCII[];
extern volatile unsigned short LCD_BUFFER[SCR_YSIZE][SCR_XSIZE];
extern void draw_char(int x0, int y0, U16 front_color, U16 back_color, char *ch, int swi);
extern void scroll_display(char *ch);
extern void add_display(char *ch);
extern void clear_line(int line);
extern void refresh_screen(void);
extern void draw_cross(int x0, int y0, int siz, unsigned short d_color);
extern void move_cross(int x0, int y0, int siz, int x_of, int y_of);
extern int str_len(char *ch);
extern float abs_val(float f);
extern int check_data(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);
extern void float_str(float f, char *ch);
extern void int_str(int n, char *ch);
extern void check_touch_down(void);
extern void check_touch_up(void);
extern void delay(int times);
#endif
3)Main.c文件,为2440示例代码,全盘引用,仅在Test_Touchpanel函数中加入第1个校准点提示信息,并在AdcTsAuto函数的stylus down部份调用check_touch_down函数,stylus up部份调用check_touch_up函数。
#define GLOBAL_CLK 1
#include
#include
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
#include "profile.h"
#include "memtest.h"
#include "main.h"
#include "adj_sc.h"
volatile U32 preScaler;
int xdata=0, ydata=0;
static void __irq AdcTsAuto(void);
void Test_Touchpanel(void);
static void Lcd_EnvidOnOff(int onoff);
static void Lcd_Port_Init( void );
static void LCD_Init(void);
void Set_Clk(void);
static void cal_cpu_bus_clk(void);
int Main(void)
{
MMU_Init();
Set_Clk();
LCD_Init();
Test_Touchpanel();
while(1);
return 0;
}
void Test_Touchpanel(void)
{
rADCDLY=50000; //Normal conversion mode delay about (1/3.6864M)*50000=13.56ms
/*设置AD转频率*/
preScaler = ADC_FREQ;
preScaler = 50000000/ADC_FREQ - 1; //PCLK=50M
rADCCON = (1<<14)|(preScaler<<6); //ADCPRS En,PRSCVL
// rADCCON=(1<<14)+(preScaler<<6); //ADCPRS En, ADCPRS Value
/* 开始显示触屏校准提示信息, 并提示第1个触点位置 */
draw_char(72, 6, F_COLOR, B_COLOR, "Adjusting Touch Screen", 0);
scroll_display("Please touch the 1st point.");
draw_cross(40, 30, 15, F_COLOR);
/*设置为等待中断模式,等待触摸笔被按下*/
rADCTSC=0xd3; //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En
/*clear irq*/
//ClearPending(BIT_ADC);
rSRCPND = 0x80000000;
rINTPND = 0x80000000;
ClearSubPending(BIT_SUB_TC);
pISR_ADC = (U32)AdcTsAuto;
/*enable INT_TC irq*/
//EnableIrq(BIT_ADC);
rINTMSK = 0x7fffffff;
EnableSubIrq(BIT_SUB_TC);
}
static void __irq AdcTsAuto(void)
{
U32 saveAdcdly;
// int s_len = 0;
// int x_p = 0;
/****************stylus down************************/
/*pull-up disable,自动连续X,Y坐标转换*/
rADCTSC = (1<<3)|(1<<2);
saveAdcdly=rADCDLY;
rADCDLY=40000; //Normal conversion mode delay about (1/50M)*40000=0.8ms
/*开始AD转换*/
rADCCON|=0x1; //start ADC
while(rADCCON & 0x1); //check if Enable_start is low
while(!(rADCCON & 0x8000)); //check if EC(End of Conversion) flag is high, This line is necessary~!!
while(!(rSRCPND & 0x80000000)); //check if ADC is finished with bit
/*获取X,Y坐标*/
xdata=(rADCDAT0&0x3ff);
ydata=(rADCDAT1&0x3ff);
/* 调用触屏按下处理函数, 根据当前状态作出相应处理 */
check_touch_down();
ClearSubPending(BIT_SUB_TC);
//ClearPending(BIT_ADC);
rSRCPND = 0x80000000;
rINTPND = 0x80000000;
EnableSubIrq(BIT_SUB_TC);
//EnableIrq(BIT_ADC);
rINTMSK = 0x7fffffff;
/****************stylus down************************/
/****************stylus up**************************/
/*设置触摸屏为等待中断模式,等待触摸笔抬起*/
rADCTSC =0xd3; //Waiting for interrupt
rADCTSC=rADCTSC|(1<<8); // Detect stylus up interrupt signal.
while(1) //to check Pen-up state
{
if(rSUBSRCPND & (BIT_SUB_TC)) //check if ADC is finished with interrupt bit
{
break; //if Stylus is up(1) state
}
}
/****************stylus up**************************/
/* 调用触屏弹起处理函数, 根据当前状态作出相应处理 */
check_touch_up();
rADCDLY=saveAdcdly;
/*设置触摸屏为等待中断模式,等待下次触摸笔按下*/
rADCTSC =0xd3; //Waiting for interrupt
ClearSubPending(BIT_SUB_TC);
//ClearPending(BIT_ADC);
rSRCPND = 0x80000000;
rINTPND = 0x80000000;
EnableSubIrq(BIT_SUB_TC);
//EnableIrq(BIT_ADC);
rINTMSK = 0x7fffffff;
}
/*LCD开关*/
static void Lcd_EnvidOnOff(int onoff)
{
if(onoff==1)
rLCDCON1|=1; // ENVID=ON
else
rLCDCON1 =rLCDCON1 & 0x3fffe; // ENVID Off
}
static void Lcd_Port_Init( void )
{
rGPCUP=0xffffffff; // Disable Pull-up register
rGPCCON=0xaaaa02a8; //Initialize VD[7:0],VM,VFRAME,VLINE,VCLK
rGPDUP=0xffffffff; // Disable Pull-up register
rGPDCON=0xaaaaaaaa; //Initialize VD[15:8]
}
/*LCD初始化*/
static void LCD_Init(void)
{
Lcd_Port_Init();
/*显示模式初始化*/
/*bit[17:8](4:CLKVAL);bit[6:5](11:TFT LCD panel);bit[4:1](1100:16 bpp for TFT)*/
rLCDCON1 = (LCD_PIXCLOCK << 8) | (3 << 5) | (12 << 1);
/*bit[31:24](1:VBPD);bit[23:14](320-1:行数);bit[13:6](5:VFPD);bit[5:0](1:VSPW)*/
rLCDCON2 = (LCD_UPPER_MARGIN << 24) | ((LCD_HEIGHT - 1) << 14) | (LCD_LOWER_MARGIN << 6) | (LCD_VSYNC_LEN << 0);
/*bit[25:19](36:HBPD);bit[18:8](240-1:列数);bit[7:0](19:HFPD)*/
rLCDCON3 = (LCD_RIGHT_MARGIN << 19) | ((LCD_WIDTH - 1) << 8) | (LCD_LEFT_MARGIN << 0);
/*bit[15:8](13:MVAL,只有当LCDCON1 bit[7]MMODE=1才有效);bit[7:0](5:HSPW)*/
rLCDCON4 = (13 << 8) | (LCD_HSYNC_LEN << 0);
/*bit[11](5:6:5 Format);bit[9](VLINE/HSYNC polarity inverted);bit[8](VFRAME/VSYNC inverted)
bit[3](Enalbe PWERN signal),bit[1](half-word swap control bit)*/
rLCDCON5 = (1<<11) | (1 << 9) | (1 << 8) | (1 << 3) | (1 << 0);
/*
* 帧缓冲地址初始化
* LCDBANK: 视频帧缓冲区内存地址30-22位
* LCDBASEU: 视频帧缓冲区的开始地址21-1位
* LCDBASEL: 视频帧缓冲区的结束地址21-1位 *
* bit[29:21]:LCDBANK,bit[20:0]:LCDBASEU
*/
rLCDSADDR1 = ((LCD_ADDR >> 22) << 21) | ((M5D(LCD_ADDR >> 1)) << 0);
/*bit[20:0]:LCDBASEL*/
rLCDSADDR2 = M5D((LCD_ADDR + LCD_WIDTH * LCD_HEIGHT * 2) >> 1);
/*
* PAGEWIDTH:虚拟屏幕一行的字节数,如果不使用虚拟屏幕,设置为实际屏幕的行字节数
* OFFSIZE:虚拟屏幕左侧偏移的字节数,如果不使用虚拟屏幕,设置为0
* bit[21:11]:OFFSIZE; bit[10:0]:PAGEWIDTH
*/
rLCDSADDR3 = LCD_WIDTH;
/*屏蔽中断*/
rLCDINTMSK |= 3;
rTCONSEL &= (~7);
/*disable调色板*/
rTPAL = 0x0;
/*禁止LPC3600/LCC3600模式*/
rTCONSEL &= ~((1<<4) | 1);
/*打开LCD*/
Lcd_EnvidOnOff(1);
}
/*************************************************
Function name: Set_Clk()
Parameter : void
Deion : 设置CPU的时钟频率
Return : void
Argument : void
Autor & date : Daniel
**************************************************/
void Set_Clk(void)
{
int i;
U8 key;
U32 mpll_val = 0 ;
i = 2 ; //don't use 100M!
//boot_params.cpu_clk.val = 3;
switch ( i ) {
case 0: //200
key = 12;
mpll_val = (92<<12)|(4<<4)|(1);
break;
case 1: //300
key = 13;
mpll_val = (67<<12)|(1<<4)|(1);
break;
case 2: //400
key = 14;
mpll_val = (92<<12)|(1<<4)|(1);
break;
case 3: //440!!!
key = 14;
mpll_val = (102<<12)|(1<<4)|(1);
break;
default:
key = 14;
mpll_val = (92<<12)|(1<<4)|(1);
break;
}
//init FCLK=400M, so change MPLL first
ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3); //set the register--rMPLLCON
ChangeClockDivider(key, 12); //the result of rCLKDIVN [0:1:0:1] 3-0 bit
cal_cpu_bus_clk(); //HCLK=100M PCLK=50M
}
/*************************************************
Function name: cal_cpu_bus_clk
Parameter : void
Deion : 设置PCLK\HCLK\FCLK的频率
Return : void
Argument : void
Autor & date : Daniel
**************************************************/
static void cal_cpu_bus_clk(void)
{
static U32 cpu_freq;
static U32 UPLL;
U32 val;
U8 m, p, s;
val = rMPLLCON;
m = (val>>12)&0xff;
p = (val>>4)&0x3f;
s = val&3;
//(m+8)*FIN*2 不要超出32位数!
FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1<
val = rCLKDIVN;
m = (val>>1)&3;
p = val&1;
val = rCAMDIVN;
s = val>>8;
switch (m) {
case 0:
HCLK = FCLK;
break;
case 1:
HCLK = FCLK>>1;
break;
case 2:
if(s&2)
HCLK = FCLK>>3;
else
HCLK = FCLK>>2;
break;
case 3:
if(s&1)
HCLK = FCLK/6;
else
HCLK = FCLK/3;
break;
}
if(p)
PCLK = HCLK>>1;
else
PCLK = HCLK;
if(s&0x10)
cpu_freq = HCLK;
else
cpu_freq = FCLK;
val = rUPLLCON;
m = (val>>12)&0xff;
p = (val>>4)&0x3f;
s = val&3;
UPLL = ((m+8)*FIN)/((p+2)*(1<
UCLK = (rCLKDIVN&8)?(UPLL>>1):UPLL;
}
5)ASCII字模数组文件。
/*
* ASCII字符的点阵字模数组
* 每个ASCII字符用8x16点阵表示, 占16字节
* 包括值为(0x00 ~ 0xFF)的共256个ASCII字符
*/
const unsigned char ASCII[] = {
/* line 0 */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/* line 1 */
0x00,0x00,0x00,0x00,0x7E,0xC3,0x81,0xA5,0x81,0xBD,0x99,0xC3,0x7E,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x7E,0xFF,0xFF,0xDB,0xFF,0xC3,0xE7,0xFF,0x7E,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x44,0xEE,0xFE,0xFE,0xFE,0x7C,0x38,0x10,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x10,0x38,0x7C,0xFE,0xFE,0x7C,0x38,0x10,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x18,0x3C,0x3C,0xFF,0xE7,0xE7,0x18,0x18,0x7E,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x18,0x3C,0x7E,0xFF,0xFF,0x7E,0x18,0x18,0x7E,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x7E,0x7E,0x3C,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC3,0x81,0x81,0xC3,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x3C,0x7E,0x66,0x66,0x42,0x42,0x66,0x66,0x7E,0x3C,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xC3,0x81,0x99,0x99,0xBD,0xBD,0x99,0x99,0x81,0xC3,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x3E,0x0E,0x3A,0x72,0xF8,0xCC,0xCC,0xCC,0x78,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x18,0x7E,0x18,0x18,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x1F,0x19,0x19,0x1F,0x18,0x18,0x78,0xF8,0x70,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x7F,0x63,0x7F,0x63,0x63,0x63,0x67,0xE7,0xE6,0xC0,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x18,0xDB,0x7E,0xE7,0xE7,0x7E,0xDB,0x18,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF8,0xFE,0xF8,0xE0,0xC0,0x80,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x02,0x06,0x0E,0x3E,0xFE,0x3E,0x0E,0x06,0x02,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x18,0x3C,0x7E,0x18,0x18,0x18,0x7E,0x3C,0x18,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x66,0x66,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x7F,0xDB,0xDB,0xDB,0x7B,0x1B,0x1B,0x1B,0x1B,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x7E,0x63,0x30,0x3C,0x66,0x66,0x3C,0x0C,0xC6,0x7E,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0xFE,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x18,0x3C,0x7E,0x18,0x18,0x18,0x7E,0x3C,0x18,0x7E,0x00,0x00,
0x00,0x00,0x00,0x00,0x18,0x3C,0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x3C,0x18,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x0C,0xFE,0x0C,0x18,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x60,0xFE,0x60,0x30,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xC0,0xFE,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x66,0xFF,0x66,0x24,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x38,0x38,0x7C,0x7C,0xFE,0xFE,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x7C,0x7C,0x38,0x38,0x10,0x10,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x30,0x78,0x78,0x78,0x30,0x30,0x00,0x30,0x30,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x6C,0x6C,0xFE,0x6C,0x6C,0x6C,0xFE,0x6C,0x6C,0x00,0x00,0x00,
0x00,0x00,0x00,0x30,0x30,0x7C,0xC0,0xC0,0x78,0x0C,0x0C,0xF8,0x30,0x30,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xC4,0xCC,0x18,0x30,0x60,0xCC,0x8C,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x70,0xD8,0xD8,0x70,0xFA,0xDE,0xCC,0xDC,0x76,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x0C,0x18,0x30,0x60,0x60,0x60,0x30,0x18,0x0C,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x60,0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x60,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x38,0x60,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x38,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x02,0x06,0x0C,0x18,0x30,0x60,0xC0,0x80,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x7C,0xC6,0xCE,0xDE,0xD6,0xF6,0xE6,0xC6,0x7C,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x10,0x30,0xF0,0x30,0x30,0x30,0x30,0x30,0xFC,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x78,0xCC,0xCC,0x0C,0x18,0x30,0x60,0xCC,0xFC,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x78,0xCC,0x0C,0x0C,0x38,0x0C,0x0C,0xCC,0x78,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x0C,0x1C,0x3C,0x6C,0xCC,0xFE,0x0C,0x0C,0x1E,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFC,0xC0,0xC0,0xC0,0xF8,0x0C,0x0C,0xCC,0x78,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x38,0x60,0xC0,0xC0,0xF8,0xCC,0xCC,0xCC,0x78,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFE,0xC6,0xC6,0x06,0x0C,0x18,0x30,0x30,0x30,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x78,0xCC,0xCC,0xEC,0x78,0xDC,0xCC,0xCC,0x78,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x78,0xCC,0xCC,0xCC,0x7C,0x18,0x18,0x30,0x70,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x38,0x00,0x00,0x38,0x38,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x38,0x00,0x00,0x38,0x38,0x18,0x30,0x00,0x00,
0x00,0x00,0x00,0x00,0x0C,0x18,0x30,0x60,0xC0,0x60,0x30,0x18,0x0C,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x60,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x60,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x78,0xCC,0x0C,0x18,0x30,0x30,0x00,0x30,0x30,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x7C,0xC6,0xC6,0xDE,0xDE,0xDE,0xC0,0xC0,0x7C,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x30,0x78,0xCC,0xCC,0xCC,0xFC,0xCC,0xCC,0xCC,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x66,0x66,0x66,0xFC,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x3C,0x66,0xC6,0xC0,0xC0,0xC0,0xC6,0x66,0x3C,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xF8,0x6C,0x66,0x66,0x66,0x66,0x66,0x6C,0xF8,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFE,0x62,0x60,0x64,0x7C,0x64,0x60,0x62,0xFE,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFE,0x66,0x62,0x64,0x7C,0x64,0x60,0x60,0xF0,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x3C,0x66,0xC6,0xC0,0xC0,0xCE,0xC6,0x66,0x3E,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0xFC,0xCC,0xCC,0xCC,0xCC,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x1E,0x0C,0x0C,0x0C,0x0C,0xCC,0xCC,0xCC,0x78,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xE6,0x66,0x6C,0x6C,0x78,0x6C,0x6C,0x66,0xE6,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xF0,0x60,0x60,0x60,0x60,0x62,0x66,0x66,0xFE,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xC6,0xEE,0xFE,0xFE,0xD6,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xC6,0xC6,0xE6,0xF6,0xFE,0xDE,0xCE,0xC6,0xC6,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x38,0x6C,0xC6,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x38,0x6C,0xC6,0xC6,0xC6,0xCE,0xDE,0x7C,0x0C,0x1E,0x00,0x00,
0x00,0x00,0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x6C,0x66,0x66,0xE6,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x78,0xCC,0xCC,0xC0,0x70,0x18,0xCC,0xCC,0x78,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFC,0xB4,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x78,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x78,0x30,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xD6,0xD6,0x6C,0x6C,0x6C,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0x78,0x30,0x78,0xCC,0xCC,0xCC,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0x78,0x30,0x30,0x30,0x78,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFE,0xCE,0x98,0x18,0x30,0x60,0x62,0xC6,0xFE,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x3C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3C,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x40,0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00,0x00,0x00,
0x00,0x00,0x00,0x10,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,
0x00,0x00,0x00,0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0x76,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xE0,0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0xDC,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0xCC,0xC0,0xC0,0xCC,0x78,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x1C,0x0C,0x0C,0x7C,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0xCC,0xFC,0xC0,0xCC,0x78,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x38,0x6C,0x60,0x60,0xF8,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0xCC,0xCC,0xCC,0x7C,0x0C,0xCC,0x78,0x00,
0x00,0x00,0x00,0x00,0xE0,0x60,0x60,0x6C,0x76,0x66,0x66,0x66,0xE6,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x78,0x18,0x18,0x18,0x18,0x7E,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x0C,0x0C,0x00,0x3C,0x0C,0x0C,0x0C,0x0C,0xCC,0xCC,0x78,0x00,
0x00,0x00,0x00,0x00,0xE0,0x60,0x60,0x66,0x6C,0x78,0x6C,0x66,0xE6,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xD6,0xD6,0xD6,0xD6,0xC6,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xCC,0xCC,0xCC,0xCC,0xCC,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0xCC,0xCC,0xCC,0xCC,0x78,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDC,0x66,0x66,0x66,0x66,0x7C,0x60,0xF0,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0xCC,0xCC,0xCC,0xCC,0x7C,0x0C,0x1E,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEC,0x6E,0x76,0x60,0x60,0xF0,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0xCC,0x60,0x18,0xCC,0x78,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x20,0x60,0xFC,0x60,0x60,0x60,0x6C,0x38,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0x78,0x30,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0xD6,0xD6,0x6C,0x6C,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC6,0x6C,0x38,0x38,0x6C,0xC6,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x3C,0x0C,0x18,0xF0,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x8C,0x18,0x60,0xC4,0xFC,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x1C,0x30,0x30,0x60,0xC0,0x60,0x30,0x30,0x1C,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xE0,0x30,0x30,0x18,0x0C,0x18,0x30,0x30,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x73,0xDA,0xCE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x78,0xCC,0xCC,0xC0,0xC0,0xC0,0xCC,0xCC,0x78,0x30,0xF0,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x20,0x20,0x00,
0x00,0x00,0x07,0x04,0x04,0x08,0x0C,0x08,0x08,0x18,0x10,0x10,0x10,0x20,0x20,0xC0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x6E,0x22,0x44,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x18,0x18,0x10,0x7E,0x10,0x18,0x18,0x10,0x10,0x10,0x10,0x10,0x10,0x00,
0x00,0x00,0x18,0x18,0x76,0x7E,0x18,0x10,0x10,0x10,0x10,0x18,0x76,0x5A,0x18,0x18,
0x00,0x00,0x30,0x50,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x30,0x48,0x48,0x48,0x49,0x32,0x04,0x08,0x11,0x22,0x42,0x82,0x02,0x01,0x00,
0x00,0x3C,0x00,0x3C,0x42,0x40,0x40,0x30,0x0C,0x06,0x02,0x02,0x42,0x7C,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x60,0x60,0x20,0x10,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x3E,0x4A,0x48,0x48,0x4A,0x4E,0x48,0x48,0x48,0x49,0x3F,0x0
责任编辑: