一、硬件简介: 经过努力,终于完成了我以前一直的梦想,点阵各种模式能独立原创出点阵屏各种模式:间断、上移、下移、左移、右移、上拉幕、下拉幕、左拉幕、右拉幕、左覆盖、右覆盖等等模式,我认为点阵只要是上移、左移会了,基本其它的都会了!一定要理解了,才算哟,太高兴了,现在和大家分享下了,我的硬件是:行是译码器74HC154+S8550,列是74HC595移位寄存器.
祥细视频如下http://www.tudou.com/programs/view/D0SCJyO4RBQ/
完整的程序源代码下载:http://www.51hei.com/f/dz854.rar
二、具体原理图见
电路介绍:http://www.51hei.com/mcu/1523.html
三、具体程序代码如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define LINE P0//定义行线IO口,即74HC154控制端
#define shudu 12//字移动的速度
sbit DATA=P1^4;//74HC595数据端
sbit CLK=P1^5;//74HC595移位脉冲端
sbit CLKR=P1^6;//74HC595数据锁存端
uchar move;//移动几位变量
uchar line;//行变量
uint word;//字节变量
uchar ji,gai;//字节变量
uchar BUF[4];//4组缓存数组以便左移右移等功能动态更改数据
/************************************************************/
/**********上移上拉左移左拉左覆盖数组************************/
/************************************************************/
uchar code table[]={
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,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x10,0x3F,0xF8,0x04,0x10,0x04,0x14,0xFF,0xFE,0x04,0x10,0x04,0x10,
0x3F,0xF0,0x04,0x10,0x04,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,
0x01,0x00,0x01,0x08,0x7F,0xFC,0x01,0x00,0x3F,0xF8,0x01,0x00,0xFF,0xFE,0x00,0x10,
0x1F,0xF8,0x10,0x10,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,0x10,0x50,0x10,0x20,
0x01,0x10,0xFF,0x90,0x14,0x50,0x14,0x7C,0x7F,0x50,0x55,0x90,0x55,0x10,0x57,0xFE,
0x61,0x04,0x41,0x7E,0x41,0x44,0x7F,0x44,0x41,0x44,0x41,0x44,0x7F,0x7C,0x41,0x44,
0x00,0x78,0x3F,0x80,0x11,0x10,0x09,0x20,0x7F,0xFE,0x42,0x02,0x82,0x04,0x7F,0xF8,
0x04,0x00,0x07,0xF0,0x0A,0x20,0x09,0x40,0x10,0x80,0x11,0x60,0x22,0x1C,0x0C,0x08,
0x04,0x40,0x04,0x44,0xFF,0xFE,0x04,0x40,0x08,0x7C,0x09,0x44,0x7F,0xC4,0x08,0x7C,
0x0A,0x44,0x3F,0x44,0x22,0x7C,0x22,0x44,0x22,0x44,0x3E,0x44,0x22,0x94,0x01,0x08,
0x08,0x20,0x08,0x24,0xFF,0xFE,0x08,0x20,0x01,0x08,0x3F,0xFC,0x20,0x08,0x20,0x08,
0x3F,0xF8,0x20,0x08,0x20,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x80,0x00,
0x08,0x10,0x08,0x10,0x08,0x10,0x10,0x20,0x10,0x20,0x22,0x44,0x7E,0xFC,0x04,0x08,
0x08,0x10,0x10,0x20,0x20,0x40,0x7E,0xFC,0x00,0x00,0x00,0x04,0xFF,0xFE,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,0x00,0x00,0x00,0x00,0x00,0x00
};
/************************************************************/
/**********************下拉、下移数组************************/
/************************************************************/
uchar code table1[]={
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,0x00,0x00,0x00,0x00,
0x08,0x10,0x08,0x10,0x08,0x10,0x10,0x20,0x10,0x20,0x22,0x44,0x7E,0xFC,0x04,0x08,
0x08,0x10,0x10,0x20,0x20,0x40,0x7E,0xFC,0x00,0x00,0x00,0x04,0xFF,0xFE,0x00,0x00,
0x08,0x20,0x08,0x24,0xFF,0xFE,0x08,0x20,0x01,0x08,0x3F,0xFC,0x20,0x08,0x20,0x08,
0x3F,0xF8,0x20,0x08,0x20,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x80,0x00,
0x04,0x40,0x04,0x44,0xFF,0xFE,0x04,0x40,0x08,0x7C,0x09,0x44,0x7F,0xC4,0x08,0x7C,
0x0A,0x44,0x3F,0x44,0x22,0x7C,0x22,0x44,0x22,0x44,0x3E,0x44,0x22,0x94,0x01,0x08,
0x00,0x78,0x3F,0x80,0x11,0x10,0x09,0x20,0x7F,0xFE,0x42,0x02,0x82,0x04,0x7F,0xF8,
0x04,0x00,0x07,0xF0,0x0A,0x20,0x09,0x40,0x10,0x80,0x11,0x60,0x22,0x1C,0x0C,0x08,
0x01,0x10,0xFF,0x90,0x14,0x50,0x14,0x7C,0x7F,0x50,0x55,0x90,0x55,0x10,0x57,0xFE,
0x61,0x04,0x41,0x7E,0x41,0x44,0x7F,0x44,0x41,0x44,0x41,0x44,0x7F,0x7C,0x41,0x44,
0x01,0x00,0x01,0x08,0x7F,0xFC,0x01,0x00,0x3F,0xF8,0x01,0x00,0xFF,0xFE,0x00,0x10,
0x1F,0xF8,0x10,0x10,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,0x10,0x50,0x10,0x20,
0x00,0x00,0x00,0x10,0x3F,0xF8,0x04,0x10,0x04,0x14,0xFF,0xFE,0x04,0x10,0x04,0x10,
0x3F,0xF0,0x04,0x10,0x04,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,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,0x00,0x00,0x00,0x00,0x00
};
/************************************************************/
/*************************右覆盖数组************************/
/************************************************************/
uchar code table2[]={
0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,
0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00
};
/************************************************************/
/*************************左覆盖数组************************/
/************************************************************/
uchar code table3[]={
0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00,
0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00
};
/*****************************************/
/*****************延时子程序*************/
/***************************************/
void delay(uchar z)
{
uchar x,y;
for(x=2;x>0;x--)
for(y=z;y>0;y--);
}
/*****************************************/
/**************74HC595送数子程序********/
/***************************************/
void song(uchar z)//带参数函数
{
uchar num,hang;//定义变量
hang=z;//将形参给变量
for(num=0;num<8;num++)//移动8次将数据发送完毕
{
if(hang&0x01==1)//将高7位屏蔽掉,保留最低位判断
DATA=1;//为1就将74HC595数据端置1
else
DATA=0;//否则给0
CLK=0;//上升沿送走数据
CLK=1;//高电平形成上升沿
hang>>=1;//将数移走一位
}
}
/************************************************************/
/************************************************************/
/**************************间断显示***************************/
/************************************************************/
/************************************************************/
void jian()
{
while(word<128)//要显示多少字?
{
for(move=150;move>0;move--)//字间断显示的速度
{
ji=word;
for(line=0;line<16;line++)
{
song(~table[ji*2+1]);//先右半屏
song(~table[ji*2]);//再左半屏
ji++;//下一行
CLKR=1;//在74HC595处锁存起来
CLKR=0;
CLKR=1;
LINE=line;//打开列
delay(17);
}
}
word=ji;
}
}
/************************************************************/
/************************************************************/
/**************************上移显示***************************/
/************************************************************/
/************************************************************/
void shang()
{
while(word<128)
{
for(move=20;move>0;move--)
{
ji=word;//将变量存起来
for(line=0;line<16;line++)
{
song(~table[ji*2+1]);
song(~table[ji*2]);
ji++;
CLKR=1;//在74HC595处锁存起来
CLKR=0;
CLKR=1;
LINE=line;
delay(5);
}
}
word+=1;//数组数增加一行,形成上移
}
}
/************************************************************/
/************************************************************/
/**************************下移显示***************************/
/************************************************************/
/************************************************************/
void xia()
{
while(word>1)
{
for(move=20;move>0;move--)
{
ji=word;//给倒数第2个字位置地址码给ji变量
for(line=0;line<16;line++)
{
song(~table1[ji*2+1]);//发右半屏数 注意这是数组1的代码
song(~table1[ji*2]);//发左半屏数
ji++;
CLKR=1;//在74HC595处锁存起来
CLKR=0;
CLKR=1;
LINE=line;
delay(5);
}
}
word-=1;//数组数减1一行,形成下移
}
}
/************************************************************/
/************************************************************/
/**************************左移显示***************************/
/************************************************************/
/************************************************************/
/************************************************************/
/*装一线数据子函数(即一行数据)*/
/********************************/
void yixian()
{
uchar s;
for(s=0;s<2;s++)/*循环2次,得到第1个字(代码存在数组1与2中)
与第2个字(代码存在数组2与3中)的某一行数值*/
{
BUF[s*2]=table[word+(32*s)+(line*2)];//左半屏代码,line表示行数,word表示字数
BUF[s*2+1]=table[word+(32*s+1)+(line*2)];//右半屏代码
}
}
/********************************/
/*将一行数据转换出来,然后显示*/
/********************************/
void yipai()
{
uchar temp,yi;
if(move<8)//处理移动次数小于8次的部分
{
yi=move;
temp=(BUF[1]<<yi)|(BUF[2]>>(8-yi));/*将第1个字的右半屏数左移yi次,
然后或上第2个字左半屏的8-yi次数,注此句是处理右半屏的数*/
song(~temp);//发送给74HC595
temp=(BUF[0]<<yi)|(BUF[1]>>(8-yi));/*将第1个字的左半屏数左移yi次,
然后或上第1个字右半屏的8-yi次数,注此句是处理左半屏的数*/
song(~temp);//发送给74HC595
}
else//处理移动次数小于8次以外的部分
{
yi=move-8;
temp=(BUF[2]<<yi)|(BUF[3]>>(8-yi));//原理同上
song(~temp);//发送给74HC595
temp=(BUF[1]<<yi)|(BUF[2]>>(8-yi));//原理同上
song(~temp);//发送给74HC595
}
}
/********************************/
/************左移子程序**********/
/********************************/
void zou()
{
uchar i;
while(word<256)
{
for(move=0;move<16;move++)//要移多少位?
{
for(i=0;i<shudu;i++)//一字移动的速度
{
for(line=0;line<16;line++)//扫描16次,即完成一个字的移动
{
yixian();//调用一线子程序
yipai();//调用数据转换子程序
LINE=line;//打开行线,即174HC154行线端
CLKR=1;//在74HC595处锁存起来
CLKR=0;
CLKR=1;
}
}
}
word=word+32;//一个字显示完了,就显示下一个字
}
}
/************************************************************/
/************************************************************/
/**************************右移显示***************************/
/************************************************************/
/************************************************************/
/********************************/
/*将一行数据转换出来,然后显示*/
/********************************/
void yipai1()
{
uchar temp,yi;
if(move<8)//处理移动次数小于8次的部分
{
yi=move;//小于8次就直接给移动的次数
temp=(BUF[0]<<(8-yi))|(BUF[1]>>yi);/*将第1个字的左半屏数左移8-yi次,
然后或上右半屏的yi次数,注此句是处理右半屏的数*/
song(~temp);//发送给74HC595
temp=(BUF[3]<<(8-yi))|(BUF[0]>>yi);/*将第2个字的右半屏数与第1个字左
半屏的数左移8-yi次,然后或上右半屏的yi次数,注此句是处理左半屏的数*/
song(~temp);//发送给74HC595
}
else//处理移动次数小于8次以外的部分
{
yi=move-8;//不小于8次就给move-8次给变量
temp=(BUF[3]<<(8-yi))|(BUF[0]>>yi);/*将第2个字的右半屏数左移8-yi次,
然后或上第1个字左半屏的yi次数,注此句是处理右半屏的数*/
song(~temp);//发送给74HC595
temp=(BUF[2]<<(8-yi))|(BUF[3]>>yi);/*将第2个字的左半屏数左移8-yi次,
然后或上第2个字的右半屏的yi次数,注此句是处理左半屏的数*/
song(~temp);//发送给74HC595
}
}
/********************************/
/************右移子程序**********/
/********************************/
void you()
{
uchar i;
while(word<256)
{
for(move=0;move<16;move++)//要移多少位?
{
for(i=0;i<shudu;i++)//一字移动的速度
{
for(line=0;line<16;line++)//扫描16次,即完成一个字的移动
{
yixian();//调用一线子程序
yipai1();//调用数据转换子程序
LINE=line;//打开行线,即174HC154行线端
CLKR=1;//在74HC595处锁存起来
CLKR=0;
CLKR=1;
}
}
}
word=word+32;//一个字显示完了,就显示下一个字
}
}
/************************************************************/
/************************************************************/
/*************************上拉子函数**************************/
/************************************************************/
/************************************************************/
/******************************************/
/***********显示一个整体字子函数***********/
/******************************************/
void shang1()//快速上移完一个整体字
{
ji=word;//将变量给计数器
for(line=0;line<16;line++)//循环16次得到一个整体字
{
song(~table[ji*2+1]);//先发右半屏数
song(~table[ji*2]);//再发左半屏数
ji++;//取下一行数
CLKR=1;//在74HC595处锁存起来
CLKR=0;
CLKR=1;
LINE=line;//打开行
delay(10);
}
}
/******************************************/
/****快速将一个字上移16次,即一个整体字****/
/******************************************/
void shangla()
{
uchar i;
while(word<128)
{
for(i=0;i<16;i++)//循环16次将一个字上移16次
{
shang1();//调用显示
word+=1;
}
for(i=0;i<150;i++)//上移完一个字后,停留一段时间,从而形成上拉
shang1();
}
}
/************************************************************/
/************************************************************/
/**************************下拉函数***************************/
/************************************************************/
/************************************************************/
/********************显示一个字子程序************************/
void xia1()
{
ji=word;
for(line=0;line<16;line++)//循环16次显示一个字
{
song(~table1[ji*2+1]);
song(~table1[ji*2]);
ji++;
CLKR=1;//在74HC595处锁存起来
CLKR=0;
CLKR=1;
LINE=line;
delay(3);
}
}
/********************将一个字上移16次形成下拉子程序************************/
void xiala()
{
uchar i;
while(word>1)
{
for(i=0;i<16;i++)//将一个字下位16次
{
xia1();//调用显示子程序
word-=1;//下拉1位
}
for(i=0;i<150;i++)//下拉16次后停下来
xia1();//调用显示
}
}
/************************************************************/
/************************************************************/
/**************************左拉子函数************************/
/************************************************************/
/************************************************************/
/********************************/
/*将一行数据转换出来,然后显示*/
/********************************/
void yipai2()
{
uchar temp,yi;
if(move<8)//处理移动次数小于8次的部分
{
yi=move;
temp=(BUF[1]<<yi)|(BUF[2]>>(8-yi));/*将第1个字的右半屏数左移yi次,
然后或上第2个字左半屏的8-yi次数,注此句是处理右半屏的数*/
song(~temp);//发送给74HC595
temp=(BUF[0]<<yi)|(BUF[1]>>(8-yi));/*将第1个字的左半屏数左移yi次,
然后或上第1个字右半屏的8-yi次数,注此句是处理左半屏的数*/
song(~temp);//发送给74HC595
}
else//处理移动次数小于8次以外的部分
{
yi=move-8;
temp=(BUF[2]<<yi)|(BUF[3]>>(8-yi));//原理同上
song(~temp);//发送给74HC595
temp=(BUF[1]<<yi)|(BUF[2]>>(8-yi));//原理同上
song(~temp);//发送给74HC595
}
}
/********************************/
/*******将一个字移一位***********/
/********************************/
void zou3()
{
for(line=0;line<16;line++)//扫描16次,即完成一个字的移动
{
yixian();//调用一线子程序
yipai2();//调用数据转换子程序
LINE=line;//打开行线,即174HC154行线端
CLKR=1;//在74HC595处锁存起来
CLKR=0;
CLKR=1;
}
}
/********************************/
/*将一个左移16次,形成一个字左拉***/
/********************************/
void zoula()
{
uchar x;
while(word<256)
{
for(move=0;move<16;move++)//要移多少位?
zou3();
for(x=0;x<150;x++)
zou3();
word=word+32;//一个字显示完了,就显示下一个字
}
}
/************************************************************/
/************************************************************/
/**************************右拉子函数***************************/
/************************************************************/
/************************************************************/
/********************************/
/*将一行数据转换出来,然后显示*/
/********************************/
void yipai3()
{
uchar temp,yi;
if(move<8)//处理移动次数小于8次的部分
{
yi=move;//小于8次就直接给移动的次数
temp=(BUF[0]<<(8-yi))|(BUF[1]>>yi);/*将第1个字的左半屏数左移8-yi次,
然后或上右半屏的yi次数,注此句是处理右半屏的数*/
song(~temp);//发送给74HC595
temp=(BUF[3]<<(8-yi))|(BUF[0]>>yi);/*将第2个字的右半屏数与第1个字左
半屏的数左移8-yi次,然后或上右半屏的yi次数,注此句是处理左半屏的数*/
song(~temp);//发送给74HC595
}
else//处理移动次数小于8次以外的部分
{
yi=move-8;//不小于8次就给move-8次给变量
temp=(BUF[3]<<(8-yi))|(BUF[0]>>yi);/*将第2个字的右半屏数左移8-yi次,
然后或上第1个字左半屏的yi次数,注此句是处理右半屏的数*/
song(~temp);//发送给74HC595
temp=(BUF[2]<<(8-yi))|(BUF[3]>>yi);/*将第2个字的左半屏数左移8-yi次,
然后或上第2个字的右半屏的yi次数,注此句是处理左半屏的数*/
song(~temp);//发送给74HC595
}
}
/********************************/
/*******将一个字移一位***********/
/********************************/
void you3()
{
for(line=0;line<16;line++)//扫描16次,即完成一个字的移动
{
yixian();//调用一线子程序
yipai3();//调用数据转换子程序
LINE=line;//打开行线,即174HC154行线端
CLKR=1;//在74HC595处锁存起来
CLKR=0;
CLKR=1;
}
}
/********************************/
/*******将一个字右移16位***********/
/********************************/
void youla()
{
uchar i;
while(word<256)
{
for(move=0;move<16;move++)//要移多少位?
you3();
for(i=0;i<150;i++)
you3();
word=word+32;//一个字显示完了,就显示下一个字
}
}
/************************************************************/
/************************************************************/
/**************************左覆盖***************************/
/************************************************************/
/************************************************************/
/********************************/
/*将一行数据转换出来,然后显示*/
/********************************/
void yipai5()
{
uchar temp,yi;
if(move<8)//处理移动次数小于8次的部分
{
yi=move;
temp=(BUF[1]);//发送左半屏的数,在移动右半屏时,左半屏不动
song(~temp);//发送给74HC595
temp=(BUF[2]&~gai)|(BUF[0]&gai);
song(~temp);//发送给74HC595
}
else//处理移动次数小于8次以外的部分
{
yi=move-8;
temp=(BUF[3]&~gai)|(BUF[1]&gai);/*将第1个字的左半屏数第0列清0或上第二
个字左半屏最后1行*/
song(~temp);//发送给74HC595
temp=BUF[2];//发送右半屏的数,在移动左半屏时,右半屏不动
song(~temp);//发送给74HC595
}
}
/********************************/
/*****扫描16次,形成一列覆盖*****/
/********************************/
void fu3()
{
uchar i;
for(i=0;i<2;i++)//一字移动的速度
{
for(line=0;line<16;line++)//扫描16次,即完成一个字的移动
{
yixian();//调用一线子程序
yipai5();//调用数据转换子程序
LINE=line;//打开行线,即174HC154行线端
CLKR=1;//在74HC595处锁存起来
CLKR=0;
CLKR=1;
}
}
}
/********************************/
/***每列移动16次后,形成覆盖****/
/********************************/
void zoufu()
{
uchar o;
while(word<256)
{
for(move=0;move<16;move++)//移动16次,形成覆盖
{
gai=table3[move];//移动一次改变一次覆盖变量
fu3();//调用覆盖子程序
}
for(o=0;o<60;o++)//一字完后,停一段时间
{
fu3();//调用覆盖子程序
}
word=word+32;//一个字显示完了,就显示下一个字
}
}
/************************************************************/
/************************************************************/
/**************************右覆盖***************************/
/************************************************************/
/************************************************************/
/********************************/
/*将一行数据转换出来,然后显示*/
/********************************/
void yipai4()
{
uchar temp,yi;
if(move<8)//处理移动次数小于8次的部分
{
yi=move;
temp=(BUF[1]&gai)|(BUF[3]&~gai);/*将第1个字的右半屏数第0列清0或上第二
个字右半屏最后1行*/
song(~temp);//发送给74HC595
temp=(BUF[0]);//发送左半屏的数,在移动右半屏时,左半屏不动
song(~temp);//发送给74HC595
}
else//处理移动次数小于8次以外的部分
{
yi=move-8;
temp=BUF[3];//发送右半屏的数,在移动左半屏时,右半屏不动
song(~temp);//发送给74HC595
temp=(BUF[0]&gai)|(BUF[2]&~gai);/*将第1个字的左半屏数第0列清0或上第二
个字左半屏最后1行*/
song(~temp);//发送给74HC595
}
}
/********************************/
/*****扫描16次,形成一列覆盖*****/
/********************************/
void fu2()
{
uchar i;
for(i=0;i<2;i++)//一字移动的速度
{
for(line=0;line<16;line++)//扫描16次,即完成一个字的移动
{
yixian();//调用一线子程序
yipai4();//调用数据转换子程序
LINE=line;//打开行线,即174HC154行线端
CLKR=1;//在74HC595处锁存起来
CLKR=0;
CLKR=1;
}
}
}
/********************************/
/***每列移动16次后,形成覆盖****/
/********************************/
void youfu()
{
uchar o;
while(word<256)
{
for(move=0;move<16;move++)//移动16次,形成覆盖
{
gai=table2[move];//移动一次改变一次覆盖变量
fu2();//调用覆盖子程序
}
for(o=0;o<60;o++)//一字完后,停一段时间
{
fu2();//调用覆盖子程序
}
word=word+32;//一个字显示完了,就显示下一个字
}
}
/************************************************************/
/************************************************************/
/**************************主函数***************************/
/************************************************************/
/************************************************************/
void main()
{
while(1)
{
word=0;//初始化变量
jian();//间断显示子程序
word=0;
shang();//调用上移子程序
word=128;//赋初值以便形成下移
xia();//调用下移子程序
word=0;
zou();//调用左移子程序
word=0;
you();//调用右移子程序
word=0;
shangla();//调用上拉子程序
word=128;
xiala();//调用下拉子程序
word=0;
zoula();//调用左拉子程序
word=0;
youla();//调用右拉子程序
word=0;
zoufu();//调用左覆盖子程序
word=0;
youfu();//调用右覆盖子程序
}
}