8051單片機(jī)搶答器C程序
/******************************************************************
本文引用地址:http://m.butianyuan.cn/article/201611/316477.htm* 自定義Macro
*******************************************************************/
//編碼的均為反向編碼
#define CLEAR 0x7f //定義清空的反碼
#define LED_BEGIN 0x01 // 定義開(kāi)始時(shí)數(shù)碼管的顯示
#define LED_FOUL 0x38 // 犯規(guī)后顯示字母"F",數(shù)碼管編碼
#define LED_C 0x31 // 字母"C"的編碼
#define LED_L 0x71 // 字母"L"的編碼,兩個(gè)用來(lái)在主持人取消之后顯示"CL"--cancel
#define GET 1 // 這個(gè)是作為一個(gè)函數(shù)的參數(shù)來(lái)混的,就是成功搶答的意思
#define FOUL 0 // 和上面的參數(shù)一起混的,犯規(guī)---這兩個(gè)的用法在后面體現(xiàn)
#define READY 0x7e
/******************************************************************
* 自定義數(shù)據(jù)類型
*******************************************************************/
typedef unsigned char Byte; // 一個(gè)字節(jié)
typedef unsigned int Word; // 一個(gè)字,兩個(gè)字節(jié)
typedef bit Bool; // 模仿布爾型變量
//typedef sbit Port; // 本想用自定義一個(gè)端口類型的變量,比較方便,但是這句話步知道為何通不過(guò)編譯
/******************************************************************
* 定義MAX7219寄存器
*******************************************************************/
#define REG_NO_OP 0x00 // 定義空操作 register
#define DIG_1 0x01 // 定義數(shù)碼管1 register
#define DIG_2 0x02 // 定義數(shù)碼管2 register
#define DIG_3 0x03 // 定義數(shù)碼管3 register
#define DIG_4 0x04 // 定義數(shù)碼管4 register
#define DIG_5 0x05 // 定義數(shù)碼管5 register
#define DIG_6 0x06 // 定義數(shù)碼管6 register
#define DIG_7 0x07 // 定義數(shù)碼管7 register
#define DIG_8 0x08 // 定義數(shù)碼管8 register
#define REG_DECODE 0x09 // 定義解碼控制 register
#define REG_INTENSITY 0x0a // 定義顯示亮度 register
#define REG_SCAN_LIMIT 0x0b // 定義掃描限制 register
#define REG_SHUTDOWN 0x0c // 定義"shutdown"模式 register
#define REG_DISPLAY_TEST 0x0f // 定義"display test"模式 register
#define INTENSITY_MIN 0x00 // 定義最低顯示亮度
#define INTENSITY_MAX 0x0f // 定義最高顯示亮度
/*********************************************************************
* 定義硬件引腳連接
**********************************************************************/
sbit DA
sbit LOAD=P2^1; // MAX7219的鎖存端口
sbit CLK=P2^2; // MAX7219的時(shí)鐘端口
//sbit HOST_SWITCH=P0^0; // 主持人開(kāi)關(guān)的接口
sbit HOST_START=P0^0; //主持人按鍵,用來(lái)重新開(kāi)始的按鍵 start
sbit HOST_CANCEL=P0^1; //主持人用來(lái)取消搶答的按鍵 clear
sbit SWITCH1_3=P1^4; // 調(diào)節(jié)倒計(jì)時(shí)時(shí)間的撥碼開(kāi)關(guān),下劃線前面的號(hào)代表開(kāi)關(guān)的序號(hào),下劃線后面的號(hào)代表該開(kāi)關(guān)的數(shù)值
sbit SWITCH2_2=P1^5; // 同上
sbit SWITCH3_2=P1^6; // 同上
sbit SWITCH4_1=P1^7; // 同上
sbit BEEP=P0^7; //定義蜂鳴器端口
sbit LS138_C=P2^4; //定義譯碼器輸入端
sbit LS138_B=P2^5; //同上
sbit LS138_A=P2^6; //同上
sbit LS138_E1=P2^7; //定義譯碼器使能端
/*********************************************************************
* 定義全局變量
**********************************************************************/
Byte da
Byte da
Byte da
Byte da
Bool da
Bool da
Bool da
Byte da
co
/***********************************************************************
* 共陰極七段數(shù)碼管顯示對(duì)應(yīng)段查詢表(數(shù)字0-9分別對(duì)應(yīng)co
***********************************************************************/
Byte co
{0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b};
Byte co
{0x01,0x4f,0x12,0x06,0x4c,0x24,0x20,0x0f,0x00,0x04};
/***********************************************************************
* 函數(shù)聲明
***********************************************************************/
void MAX7219_SendByte (Byte dataout);
void MAX7219_Write (Byte reg_number, Byte dataout);
void MAX7219_DisplayChar(Byte digit, Byte character);
void MAX7219_Clear (void);
void MAX7219_SetBrightness (Byte brightness);
void MAX7219_DisplayTestStart (void);
void MAX7219_DisplayTestStop (void);
void MAX7219_ShutdownStart (void);
void MAX7219_ShutdownStop (void);
void MAX7219_Init (void);
void Delay10ms(void);
Bool GetHostStartKey (void);
Bool GetHostCancelKey (void);
void GetCounter(void);
Byte GetPressed(Byte KeyState);
void IT0_Init(void);
void Timer0_Overflow();
void PressedHandle(Byte keyPressed);
void GetOrFoulHandle(Bool state);
void CancelHandle();
void SPEAKER_count (void); //聲明倒計(jì)時(shí)聲音函數(shù)
void SPEAKER_start(void); //聲明開(kāi)始搶答聲音函數(shù)
void SPEAKER_get(void); //聲明搶到聲音函數(shù)
void SPEAKER_foul(void); // 聲明犯規(guī)聲音函數(shù)
/***********************************************************************
* MAX7219_SendByte()
*
* 描述: 向MAX7219傳送一個(gè)字節(jié)的數(shù)據(jù)
* Arguments : dataout = da
* Returns : none
*************************************************************************/
void MAX7219_SendByte (Byte dataout)
{
Byte i;
for (i=8;i>0;i--)
{
Byte mask=1<<(i-1);//mask是個(gè)掩碼,取位使用
CLK=0;//MAX7219的位傳入是在時(shí)鐘的上升沿之前,所以在每發(fā)一位之前都要變?yōu)榈碗娖?/p>
if (dataout&mask)
DA
else
DA
CLK=1;//八個(gè)bit都傳遞完成后變?yōu)楦唠娖?鎖存
}
}
/***********************************************************************
* MAX7219_Write()
*
* 描述: 向 MAX7219 寫(xiě)命令
* Arguments : reg_number = register to write to
* dataout = da
* Returns : none
未完~
***************************************************************************/
void MAX7219_Write (Byte reg_number, Byte dataout)
{
LOAD=0;//也是鎖存上升沿之前的,發(fā)這兩個(gè)字節(jié)之前要變?yōu)榈碗娖?/p>
MAX7219_SendByte(reg_number);//發(fā)送寄存器地址
MAX7219_SendByte(dataout);//發(fā)送數(shù)據(jù)
LOAD=1;//變?yōu)楦唠娖?鎖存
}
/**************************************************************************
* MAX7219_DisplayChar()
*
* 描述: 使某一位顯示一個(gè)數(shù)字
* Arguments : digit = digit number (0-7)
* character = character to display (0-9, A-Z)
* Returns : none
**************************************************************************/
void MAX7219_DisplayChar(Byte digit, Byte character)
{
MAX7219_Write(digit, character);
}
/**************************************************************************
* MAX7219_Clear()
*
* 描述: 清除所有位的顯示
* Arguments : none
* Returns : none
***************************************************************************/
void MAX7219_Clear (void)
{
Byte i;
for (i=1; i<=2; i++)
MAX7219_Write(i, CLEAR);//把八個(gè)數(shù)碼管全都清零了,已經(jīng)寫(xiě)反了^_^
}
/**************************************************************************
* MAX7219_SetBrightness()
*
* 描述: 設(shè)置數(shù)碼管顯示亮度
* Arguments : brightness (0-15)
* Returns : none
***************************************************************************/
void MAX7219_SetBrightness (Byte brightness)
{
brightness &= 0x0f;
MAX7219_Write(REG_INTENSITY, brightness);
}
/**************************************************************************
* MAX7219_DisplayTestStart()
*
* 描述: 進(jìn)入 test 模式
* Arguments : none
* Returns : none
***************************************************************************/
void MAX7219_DisplayTestStart (void)
{
MAX7219_Write(REG_DISPLAY_TEST, 1);
}
/**************************************************************************
* MAX7219_DisplayTestStop()
*
* 描述: 退出 test 模式
* Arguments : none
* Returns : none
***************************************************************************/
void MAX7219_DisplayTestStop (void)
{
MAX7219_Write(REG_DISPLAY_TEST, 0);
}
/**************************************************************************
* MAX7219_ShutdownStart()
*
* 描述: 進(jìn)入 shutdown 模式
* Arguments : none
* Returns : none
***************************************************************************/
void MAX7219_ShutdownStart (void)
{
MAX7219_Write(REG_SHUTDOWN, 0);
}
/**************************************************************************
* MAX7219_ShutdownStop()
*
* 描述: 退出 shutdown 模式
* Arguments : none
* Returns : none
***************************************************************************/
void MAX7219_ShutdownStop (void)
{
MAX7219_Write(REG_SHUTDOWN, 1);
}
/**************************************************************************
* MAX7219_Init()
*
* Description: MAX7219初始化模塊; 應(yīng)該先于其他MAX7219函數(shù)而被調(diào)用
* Arguments : none
* Returns : none
***************************************************************************/
void MAX7219_Init (void)
{
DA
CLK=1;
LOAD=1;
MAX7219_Write(REG_SCAN_LIMIT,1);//這里設(shè)置的是掃描兩個(gè)數(shù)碼管
MAX7219_Write(REG_DECODE, 0x00);
MAX7219_SetBrightness(INTENSITY_MAX);//設(shè)置最大亮度顯示
MAX7219_DisplayTestStart();
MAX7219_DisplayTestStop();
MAX7219_ShutdownStop();
MAX7219_Clear();
}
/**************************************************************************
* Delay_100us()
*
* 描述: 延時(shí)100us,主要用在消除開(kāi)關(guān)抖動(dòng)時(shí)
* Arguments : none
* Returns : none
***************************************************************************/
void Delay10ms(void)
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
/**************************************************************************
* GetHostStartKey()
*
* Description: 取得主持人開(kāi)始按鍵的鍵值
* Arguments : none
* Returns : 1-->主持人按鍵; 0-->主持人未按鍵
***************************************************************************/
Bool GetHostStartKey (void)
{
if (HOST_START ==1)
return 0;
else
Delay10ms ();//如果發(fā)現(xiàn)主持人按鍵接通,要先延時(shí)100us,防止抖動(dòng)
if (HOST_START==1)
return 0;
else
return 1;//延時(shí)時(shí)候還是接通,則判斷為該鍵確實(shí)按下
}
/**************************************************************************
* GetHostCancelKey()
*
* Description: 取得主持人取消按鍵的鍵值
* Arguments : none
* Returns : 1-->主持人按鍵; 0-->主持人未按鍵
***************************************************************************/
Bool GetHostCancelKey (void)
{
if (HOST_CANCEL ==1)
return 0;
else
Delay10ms ();//如果發(fā)現(xiàn)主持人按鍵接通,要先延時(shí)100us,防止抖動(dòng)
if (HOST_CANCEL ==1)
return 0;
else
return 1;//延時(shí)時(shí)候還是接通,則判斷為該鍵確實(shí)按下
}
/**************************************************************************
* GetCounter
*
* Description: 取得預(yù)先設(shè)置的倒計(jì)時(shí)時(shí)間
* Arguments : none
* Returns : none
***************************************************************************/
void GetCounter(void)
{
beginNum=1;//在所有開(kāi)關(guān)都沒(méi)有撥動(dòng)的時(shí)候倒計(jì)時(shí)為1秒,比設(shè)置為0秒要好
intrCounter=20;//每一秒對(duì)應(yīng)的中斷次數(shù)為20次
if (SWITCH1_3==1)
{
beginNum+=3;
}
if (SWITCH2_2==1)
{
beginNum+=2;
}
if (SWITCH3_2==1)
{
beginNum+=2;
}
if (SWITCH4_1==1)
{
beginNum+=1;
}//以上判斷語(yǔ)句為判斷撥碼開(kāi)關(guān)狀態(tài)
intrCounter=20*beginNum;//計(jì)算總掃描次數(shù)
}
/**************************************************************************
* GetPressed
*
* Description: 從P1口連接搶答端的四位來(lái)判斷搶答情況
* Arguments : Byte KeyState-->P1 state
* Returns : 搶答端的號(hào)碼 ; 0-->沒(méi)人搶答
***************************************************************************/
Byte GetPressed(Byte KeyState)
{
Byte key;//記錄搶答端的號(hào)碼
KeyState&=0x0f;//取P1口的低四位
switch (KeyState)
{
case 0x0f: key=0;break;//全高,無(wú)人搶答
case 0x0e: key=1;break;//只有P1.1,key1搶答
case 0x0d: key=2;break;//只有P1.2,key2搶答
case 0x0b: key=3;break;//只有P1.3,key3搶答
case 0x07: key=4;break;//只有P1.4,key4搶答
}
/*
switch (KeyState)
{
case 0x00: key=0;break;//全高,無(wú)人搶答
case 0x01: key=1;break;//只有P1.0,key1搶答
case 0x02: key=2;break;//只有P1.1,key2搶答
case 0x04: key=3;break;//只有P1.2,key3搶答
case 0x08: key=4;break;//只有P1.3,key4搶答
}
*/
//上面是在用高電平來(lái)判斷搶答狀態(tài)時(shí)的程序,經(jīng)證明不知道為何無(wú)效
return key;
}
/**************************************************************************
* IT0_Init
*
* Description: 初始化計(jì)時(shí)器T0的狀態(tài)
* Arguments : none
* Returns : none
***************************************************************************/
void IT0_Init(void)
{
TMOD=0x01;//設(shè)置T0在方式1下工作
TH0=0x3C;
TL0=0xAF;//這兩個(gè)寄存器存的是計(jì)數(shù)器的計(jì)數(shù)開(kāi)始的值,計(jì)算發(fā)現(xiàn)這兩個(gè)值累加至溢出后正好是50ms
ET0=1;//使T0中斷可以溢出
EA=1;//開(kāi)啟總中斷
TF0=0;//溢出位清零
TR0=1;//開(kāi)啟T0
}
/**************************************************************************
* Timer0_Overflow() interrupt 1
*
* Description: 中斷溢出服務(wù)程序, 采用的是中斷方式1, 后面最好不加using選擇寄存器組以免與系統(tǒng)用在主程序的寄存器沖突
* Arguments : none
* Returns : none
***************************************************************************/
void Timer0_Overflow() interrupt 1
{
static Byte second=20;//用20次中斷來(lái)判斷1秒
TH0=0x3C;
TL0=0xAF;
second--;
intrCounter--;
/*
if (second==0)//每隔一秒的操作
{
MAX7219_DisplayChar(DIG_2,co
second=20;//重新賦值每秒計(jì)數(shù)器
if (intrCounter==0)
{
TR0=0;//關(guān)閉T0計(jì)數(shù)器
isStart=1;//計(jì)時(shí)結(jié)束,進(jìn)入正常搶答
//SPEAKER_start();//開(kāi)始搶答的聲音
}
//待顯示"0"以后就開(kāi)始搶答
else
{
//SPEAKER_count();//倒計(jì)時(shí)聲音
}
}
*/
if (second==0)//每隔一秒的操作
{
//if (showNum!=1) SPEAKER_count();//倒計(jì)時(shí)聲音
//else SPEAKER_start();//開(kāi)始搶答的聲音
MAX7219_DisplayChar(DIG_2,co
second=20;//重新賦值每秒計(jì)數(shù)器
}//待顯示"0"以后就開(kāi)始搶答
if (intrCounter==0)
{
TR0=0;//關(guān)閉T0計(jì)數(shù)器
isStart=1;//計(jì)時(shí)結(jié)束,進(jìn)入正常搶答
}
}
/**************************************************************************
* PressedHandle
*
* Description: 按鍵處理
* Arguments : Byte keyPressed-->按下的按鍵
* Returns : none
***************************************************************************/
void PressedHandle(Byte keyPressed)
{
MAX7219_Clear();//LED clear
MAX7219_DisplayChar(DIG_2,co
}
/**************************************************************************
* GetOrFoulHandle(Bool state)
*
* Description: 正常搶答或是犯規(guī)處理
* Arguments : Bool state-->是GET和FOUL兩個(gè)宏的取之之一
* Returns : none
***************************************************************************/
void GetOrFoulHandle(Bool state)
{
if (!state)
{
MAX7219_DisplayChar(DIG_1,LED_FOUL);//如果是犯規(guī)的話左邊的LED要顯示"F",foul
}
}
/**************************************************************************
* CancelHandle()
*
* Description: 處理主持人取消倒計(jì)時(shí)
* Arguments : none
* Returns : none
***************************************************************************/
void CancelHandle()
{
MAX7219_DisplayChar(DIG_1,LED_C);
MAX7219_DisplayChar(DIG_2,LED_L);//主持人取消倒計(jì)時(shí)之后,兩個(gè)數(shù)碼管顯示"CL"-->cancel
}
/**************************************************************************
* delayus()
*
* Description: 延時(shí)程序
* Arguments : t-->us
* Returns : time delayed
***************************************************************************/
void delayus(unsigned char t )
{
unsigned char j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
/**************************************************************************
* SPEAKER_count/start/foul/get()
*
* Description: speaker發(fā)聲程序->計(jì)數(shù)/開(kāi)始/犯規(guī)/搶答 四種聲音
* Arguments : none
* Returns : none
***************************************************************************/
void SPEAKER_count(void)
{
unsigned char i;
for (i=0;i<10;i++)
{
BEEP =1; //點(diǎn)亮
delayus(20);
BEEP =0; //熄滅
delayus(20);
}
}
void SPEAKER_start(void)
{
unsigned char i;
for(i=0;i<200;i++)
{
BEEP =1; //點(diǎn)亮
delayus(10);
BEEP =0; //熄滅
delayus(10);
}
}
void SPEAKER_foul(void)
{
unsigned char i;
for(i=0;i<250;i++)
{
BEEP =1; //點(diǎn)亮
delayus(15);
BEEP =0; //熄滅
delayus(17);
}
}
void SPEAKER_get(void)
{
unsigned char i;
for(i=0;i<250;i++)
{
BEEP =1; //點(diǎn)亮
delayus(10);
BEEP =0; //熄滅
delayus(10);
}
for(i=0;i<250;i++)
{
BEEP =1; //點(diǎn)亮
delayus(20);
BEEP =0; //熄滅
delayus(20);
}
}
/**************************************************************************
* 主程序
***************************************************************************/
void main()
{
Byte keyPressed,i;//選手按鍵號(hào)碼,沒(méi)有的話為0
Bool hostPressed;//用來(lái)記錄主持人按鍵取消,0為沒(méi)有動(dòng)作,1為取消
number_temp=P1&0xf0;//P1口上次的狀態(tài),在調(diào)整倒計(jì)時(shí)時(shí)間的時(shí)候用到的
LS138_E1=1; //譯碼器初始化
MAX7219_Init();//數(shù)碼管初始化
GetCounter();//獲取開(kāi)始時(shí)候設(shè)置的倒計(jì)時(shí)時(shí)間
MAX7219_DisplayChar(DIG_1,co
MAX7219_DisplayChar(DIG_2,READY);//調(diào)時(shí)間的時(shí)候右位的顯示
//while(1);
while(GetHostStartKey()==0)//當(dāng)主持人沒(méi)有按鍵的時(shí)候進(jìn)入循環(huán)
{
if (number_temp!=(P1&0xf0))//若調(diào)整了倒計(jì)時(shí)時(shí)間,則P1口狀態(tài)變了,就要重新設(shè)置和顯示
{
GetCounter();//獲取調(diào)整以后的倒計(jì)時(shí)時(shí)間
MAX7219_DisplayChar(DIG_1,co
number_temp=P1&0xf0;//記錄下來(lái)現(xiàn)在P1口的狀態(tài),以備后面的比較
}
} //當(dāng)主持人按鍵以后就結(jié)束調(diào)整進(jìn)入搶答倒計(jì)時(shí)
MAX7219_DisplayChar(DIG_1,READY);
while(GetHostCancelKey()==0);
MAX7219_DisplayChar(DIG_1,READY);//清空右邊一位數(shù)碼管
MAX7219_DisplayChar(DIG_2,co
for (i=100;i--;i>0)
Delay10ms();//防止后面出現(xiàn)連讀的情況..
//調(diào)整好倒計(jì)時(shí)時(shí)間后,按下start顯示"--",再按下cancel則顯示倒計(jì)時(shí)時(shí)間,此時(shí)可以開(kāi)始倒計(jì)時(shí)了.
counterBack=intrCounter;
//這里原來(lái)寫(xiě)的是while(1),寫(xiě)上后就不行了,不知道為何..
while(1)//這里要用自己加的循環(huán)來(lái)把程序束縛在這里運(yùn)行
{
showNum=beginNum;//設(shè)置要顯示的時(shí)間,當(dāng)然時(shí)從倒計(jì)時(shí)時(shí)間開(kāi)始
intrCounter=counterBack;//設(shè)置總中斷的次數(shù)
TR0=0;//禁用計(jì)時(shí)器0
isPressed=0;//記錄是否有人按鍵
isStart=0;//沒(méi)有開(kāi)始搶答
while(GetHostStartKey()==0);
IT0_Init();//初始化計(jì)時(shí)器0, 啟用.
MAX7219_DisplayChar(DIG_1,CLEAR);//清空左邊一位數(shù)碼管
MAX7219_DisplayChar(DIG_2,co
while(!isPressed)//如果沒(méi)有記錄到有人按鍵就進(jìn)入
{
keyPressed=GetPressed(P1);//查詢一下P1口的狀態(tài),即按鍵情況
hostPressed=GetHostCancelKey();
if (!keyPressed&&!hostPressed)//如果沒(méi)有人按鍵,就進(jìn)入下次循環(huán)
continue;
else
{
TR0=0;//關(guān)閉定時(shí)器
isPressed=1;//記錄到有人按鍵,提供條件跳出循環(huán)
}
}
if (keyPressed!=0)
{
if (isStart)//如果已經(jīng)開(kāi)始搶答
{
PressedHandle(keyPressed);//處理按鍵,即顯示搶答選手號(hào)碼
GetOrFoulHandle(GET);//處理?yè)尨?/p>
LS138_E1=0; //譯碼器準(zhǔn)備工作
switch (keyPressed)
{
case 1: LS138_A=0;LS138_B=0;LS138_C=0;break; //1號(hào)成功燈亮
case 2: LS138_A=0;LS138_B=1;LS138_C=0;break; //2號(hào)成功燈亮
case 3: LS138_A=1;LS138_B=0;LS138_C=0;break; //3號(hào)成功燈亮
case 4: LS138_A=1;LS138_B=1;LS138_C=0;break; //4號(hào)成功燈亮
default : break;
}
//SPEAKER_get();//處理?yè)尨?/p>
}
else//否則,沒(méi)有開(kāi)始搶答
{
PressedHandle(keyPressed);//處理按鍵,即顯示搶答選手號(hào)碼
GetOrFoulHandle(FOUL);//處理犯規(guī),必須要放在后面,因?yàn)轱@示數(shù)字的里面有一個(gè)clear
LS138_E1=0; //譯碼器準(zhǔn)備工作
switch (keyPressed)
{
case 1: LS138_A=0;LS138_B=0;LS138_C=1;break; //1號(hào)犯規(guī)燈亮
case 2: LS138_A=0;LS138_B=1;LS138_C=1;break; //2號(hào)犯規(guī)燈亮
case 3: LS138_A=1;LS138_B=0;LS138_C=1;break; //3號(hào)犯規(guī)燈亮
case 4: LS138_A=1;LS138_B=1;LS138_C=1;break; //4號(hào)犯規(guī)燈亮
default : break;
}
//SPEAKER_foul();//犯規(guī)發(fā)聲
}
}
if (hostPressed==1)
{
CancelHandle();
for (i=100;i--;i>0)
Delay10ms();//防止后面出現(xiàn)連讀的情況..
}
while(GetHostCancelKey()==0);//如果主持人沒(méi)有按鍵再次開(kāi)始,則停在次死循環(huán)處
LS138_E1=1; //關(guān)閉譯碼器
MAX7219_DisplayChar(DIG_1,READY);//清空右邊一位數(shù)碼管
MAX7219_DisplayChar(DIG_2,co
//到這里一次循環(huán)結(jié)束
}
}
評(píng)論