當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]//*********************FileName:Main.c*********************////*********************Author:Steaven2000@163.com**********// //********************Version:1.2*************************// //************

//*********************FileName:Main.c*********************//

//*********************Author:Steaven2000@163.com**********//
//********************Version:1.2*************************//
//******************LastUpdate:2004-11-03*****************//

#include
#include
#define uchar unsigned char
#define uint unsigned int

//**********定義全局變量*******************//
//查表0 1 2 3 4 5 6 7 8 9 E F P OFF
uchar table[14]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x79,0x71,0x73,0x00};
uchar ICcode[4];//定義IC卡復(fù)位時(shí)讀出的4字節(jié)代碼;
uchar ICcontent[14];//定義IC卡有效信息;
uchar Money[5];//定義IC卡內(nèi)金額;
uchar EEEEE[5]={0x79,0x79,0x79,0x79};
uchar FFFFF[5]={0x71,0x71,0x71,0x71};
uchar IC_Flag;//定義IC卡上電標(biāo)志;
uchar Num_Flag;//數(shù)標(biāo)志;
uchar Add_Flag;//加標(biāo)志
uchar Sub_Flag;//減標(biāo)志
uchar Init_Flag;//初始化標(biāo)志
uchar Repair_Flag;//修卡標(biāo)志;
uchar Enter_Flag;//確認(rèn)標(biāo)志
uchar Point_Flag;//.標(biāo)志
uchar Key_Flag; //按鍵標(biāo)志;


//***********IC卡引腳信號(hào)處理***************//
void Voice(uchar PD) //Voice=PD^7
{if(PD==1) PORTD|=0x80;//Voice置1
else PORTD&=~80; //Voice置0
}

void RST(uchar PD) //RST=PD^6
{if(PD==1) PORTD|=0x40;//RST置1
else PORTD&=~0x40;//RST置0
}

void CLK(uchar PD) //CLK=PD^5
{if(PD==1) PORTD|=0x20;//CLK置1
else PORTD&=~0x20;//CLK置0
}

void IO(uchar PD) //IO=PD^4
{if(PD==1) PORTD|=0x10;//IO置1
else PORTD&=~0x10;//IO置0
}

void SetIO(uchar i)//設(shè)置IO口屬性
{if(i==1) DDRD=0xf0; //IO口輸出:1111 0000
else DDRD=0xe0; //IO口輸如:1110 0000
PORTD=0x00;//不帶上拉電阻;
}

//**********延時(shí)函數(shù)(Us數(shù)量級(jí))*********//
//單周期指令執(zhí)行時(shí)間,執(zhí)行時(shí)間1/8us*分頻系數(shù)(取8分頻則剛好1us);
void DelayUs(uchar i)
{for(;i!=0;i--)
NOP();
}

//****************延時(shí)函數(shù)(Ms數(shù)量級(jí))*********//
void DelayMs(uint i)
{uchar j,k;
for(;i!=0;i--)
{for(k=0;k<4;k++)
{for(j=250;j!=0;j--) NOP();}
}
}

//****************接收數(shù)據(jù)**************//
uchar ReceiveData(void)
{uchar count;
uchar value;
uchar io_value;
value=0;
SetIO(0);//設(shè)置IO腳為輸入;
CLK(0);
//IO=1;
for(count=0;count<8;count++)
{value=value>>1;
CLK(1);
DelayUs(2);
io_value=PIND;
CLK(0);
DelayUs(2);
if(io_value&0x10==0x10) value|=0x80;//判斷IO腳是否為1
else value&=0x7f;
}
return (value);
}

//********************發(fā)送數(shù)據(jù)************//
void SendData(uchar Xdata)
{uchar count;
uchar value;
SetIO(1);////設(shè)置IO腳為輸出;
value=Xdata;
for(count=8;count!=0;count--)
{CLK(0);
if((Xdata<<(count-1))&0x80) IO(1);
else IO(0);
CLK(1);
DelayUs(2);
CLK(0);}
}

//****************IC卡復(fù)位************************//
void ResetIC(uchar *Xdata)
{uchar count;
SetIO(1); //設(shè)置IC卡引腳的屬性
RST(0);
CLK(0);
IO(1);
DelayUs(5);
RST(1);
DelayUs(5);
CLK(1);
DelayUs(5);
CLK(0);
DelayUs(5);
RST(0);
for(count=4;count!=0;count--)
{*Xdata=ReceiveData();
Xdata+=2;}
}

//*******************Start條件****************//
void Start(void)
{SetIO(1);
CLK(0);
IO(0);
DelayUs(2);
CLK(1);
IO(1);
DelayUs(2);
IO(0);
CLK(0);
}

//*******************Stop條件****************//
void Stop(void)
{CLK(0);
IO(0);
DelayUs(2);
CLK(1);
IO(0);
DelayUs(2);
IO(1);
DelayUs(2);
IO(0);
}

//******************處理過(guò)程**************//
void Process(void)
{uint j;
SetIO(1);//設(shè)置IO腳為輸出腳
CLK(0);
DelayUs(5);
IO(0);
for(j=255;j>0;j--)
{CLK(1);
DelayUs(5);
CLK(0);
DelayUs(5);
}
IO(1);
}

//****************說(shuō)明*********************//
//*********輸出模式接口命令,包括讀主存儲(chǔ)器30H,讀保護(hù)存儲(chǔ)器34H,讀安全代碼的接口命令31H***********//
//******處理模式數(shù)據(jù)接口命令,包括寫主存儲(chǔ)器38H,寫保護(hù)存儲(chǔ)器3CH,寫安全代碼39H,校驗(yàn)安全代碼33H*******//

void Command(uchar Byte1,uchar Byte2,uchar Byte3)
{Start();
SendData(Byte1);
SendData(Byte2);
SendData(Byte3);
Stop();
}


/**********讀主存儲(chǔ)器**************/
void ReadMainMemory(uchar addr,uchar *p,uchar N)
{Command(0x30,addr,0xff);
do{*p=ReceiveData();
p++;}while(--N);
}

/**********讀保護(hù)存儲(chǔ)器***********/
void ReadProtectMemory(uchar *p)
{uchar i=4;
Command(0x34,0xff,0xff);
do{*p=ReceiveData();
p++;}while(i--);
}

/************寫主存儲(chǔ)器************/
void WriteMainMemory(uchar Address,uchar Data)
{Command(0x38,Address,Data);
Process();
}

/**************寫保護(hù)存儲(chǔ)器**********/
void WriteProtectMemory(uchar Address,uchar Data)
{Command(0x3c,Address,Data);
Process();
}

/**************讀安全存儲(chǔ)器************/
void ReadSafeMemory(uchar *p)
{uchar i;
Command(0x31,0xff,0xff);
for(i=0;i<4;i++)
{*p=ReceiveData();
p++;}
}

/*************寫安全存儲(chǔ)器***************/
void WriteSafeMemory(uchar Address,uchar Data)
{Command(0x39,Address,Data);//Address=0,1,2,3
Process();
}

/**************校驗(yàn)密碼*******************/
uchar VerifyPassword(uchar *p)
{uchar temp[4];//暫存4字節(jié)保護(hù)密碼;
uchar i;
ReadSafeMemory(temp);//讀安全代碼以取得錯(cuò)誤計(jì)數(shù)器
if((temp[0]&0x07)!=0)
{if((temp[0]&0x07)==0x07) i=0x06;
if((temp[0]&0x07)==0x06) i=0x04;
if((temp[0]&0x07)==0x04) i=0x00;
WriteSafeMemory(0,i);
for(i=1;i<4;i++,p++)
{Command(0x33,i,*p);
Process();}
WriteSafeMemory(0,0xff);
ReadSafeMemory(temp);
if((temp[0]&0x07)==0x07) return(0x1);

}
return(0);
}
//*************SLE4442函數(shù)結(jié)束*****************//

//*************數(shù)據(jù)變換**********//
void Change(uchar *Source,uchar *Destination,uchar N)
{uchar i,temp;
for(i=0;i{temp=Source[i];
Destination[i]=temp>>4;
Destination[2*i+1]=temp&0x0f;}
}

//***********密碼錯(cuò)誤報(bào)警***********************//
void Buzzle_Password(void)
{uchar i;
for(i=0;i<2;i++)
{Voice(0);
DelayMs(1000);
Voice(1);
DelayMs(1000);}
}

//**********非法卡錯(cuò)誤報(bào)警*************************//
void Buzzle_Card(void)
{uchar i;
for(i=0;i<2;i++)
{Voice(0);
DelayMs(3000);}
}

//*************余額不足報(bào)警**********************//
void Buzzle_Money(void)
{uchar i;
for(i=0;i<1;i++)
{Buzzle_Password();
Buzzle_Card();}
}

//*********************讀卡函數(shù)********************//
//說(shuō)明:
//函數(shù)使用的數(shù)組參數(shù)用來(lái)存放讀出的余額值;
//返回值信息:
//0:卡壞!
//1:非法卡(特征值不正確)
//2:非法卡(特征值正確,帳號(hào)不正確)
//3:讀卡成功!
uchar Read_Card(uchar *p)
{uchar i,tag=0,temp[4];
ReadSafeMemory(temp);
if(temp[0]==0x07)
{ReadMainMemory(32,p,14);//讀主存儲(chǔ)器14字節(jié):32-35特征碼;36-3A帳號(hào);3B-3F余額
if(p[0]==0x00&&p[1]==0x0f&&p[2]==0xf0&&p[3]==0xff)//特征碼:0x00,0x0f,0xf0,0xff
{for(i=0;i<10;i++)
if((p[i+4]>=0&&p[i+4]<=9)) tag=tag+1;
if(tag!=10) return(2);
else return(3);
}
else
return(1);
}
else return(0);
}

//*********************卡初始化函數(shù)********************//
//說(shuō)明:
//函數(shù)使用的數(shù)組參數(shù)用來(lái)存放寫入的的ID值;
//返回值信息:
//2:初始化失敗!
//3:初始化成功!
uchar Initial_Card(uchar *p)
{uchar Psw[3]={0xff,0xff,0xff};
uchar i,j,temp=0;
uchar tp[20];
// ResetIC(ICcode);//IC卡復(fù)位,讀出復(fù)位后的廠家信息代碼A2131091;
j=VerifyPassword(Psw);
WriteMainMemory(32,0x00);//寫特征碼:
WriteMainMemory(33,0x0f);
WriteMainMemory(34,0xf0);
WriteMainMemory(35,0xff);
for(i=0;i<5;i++)//寫帳號(hào)
WriteMainMemory(36+i,p[i]);//從32+i地址開(kāi)始寫5字節(jié)帳號(hào);
for(i=0;i<5;i++)
WriteMainMemory(41+i,0);//從32+i地址開(kāi)始寫5字節(jié)初始化金額0000.0
j=Read_Card(tp);
if(j==3)
{for(i=0;i<10;i++)
if(p[i]==tp[i+4]) temp=temp+1;
}
if(temp==10) return(3);
else return(2);
}

//***************卡修復(fù)函數(shù)********************//
//說(shuō)明:
//返回值信息:
//0:修復(fù)失敗!
//1:修復(fù)成功!
uchar Repair_Card(void)
{uchar Psw[3]={0xff,0xff,0xff};
uchar i,j,temp;
i=VerifyPassword(Psw);
return(i);
}

//********************加卡函數(shù)***********//
void Add_Card(uchar *p)
{uchar i;
uchar temp[14];
i=Read_Card(temp);
if(i==3)
{temp[13]=temp[13]+p[4];
if(temp[13]>9) {temp[13]=temp[13]-10;temp[12]=temp[12]+1;}
temp[12]=temp[12]+p[3];
if(temp[12]>9) {temp[12]=temp[12]-10;temp[11]=temp[11]+1;}
temp[11]=temp[11]+p[2];
if(temp[11]>9) {temp[11]=temp[11]-10;temp[10]=temp[10]+1;}
temp[10]=temp[10]+p[1];
if(temp[10]>9) {temp[10]=temp[10]-10;temp[9]=temp[9]+1;}

WriteMainMemory(41,temp[9]);
WriteMainMemory(42,temp[10]);
WriteMainMemory(43,temp[11]);
WriteMainMemory(44,temp[12]);
WriteMainMemory(45,temp[13]);
}
}

//********************減卡函數(shù)***********//
void Sub_Card(uchar *p)
{uchar i,B_Flag;
uchar temp[14];
i=Read_Card(temp);
if((i==3)&&(!(temp[9]{if(temp[13] else temp[13]=temp[13]-p[4];
//以上處理小數(shù)點(diǎn)右邊的數(shù)字;
if(B_Flag==1)
{if(temp[12]==0) {temp[12]=9;B_Flag=0;}
else temp[12]=temp[12]-1;}
//以上對(duì)存在借位情況時(shí)對(duì)小數(shù)點(diǎn)左邊第一位進(jìn)行預(yù)處理;
if(temp[12] else temp[12]=temp[12]-p[3];
//以上處理小數(shù)點(diǎn)小數(shù)點(diǎn)左邊第一位數(shù)字;
if(B_Flag==1)
{if(temp[11]==0) {temp[11]=9;B_Flag=0;}
else temp[11]=temp[11]-1;}
//以上對(duì)存在借位情況時(shí)對(duì)小數(shù)點(diǎn)左邊第二位進(jìn)行預(yù)處理;
if(temp[11] else temp[11]=temp[11]-p[2];
//以上處理小數(shù)點(diǎn)小數(shù)點(diǎn)左邊第二位數(shù)字;
if(B_Flag==1)
{if(temp[10]==0) {temp[10]=9;B_Flag=0;}
else temp[10]=temp[10]-1;}
//以上對(duì)存在借位情況時(shí)對(duì)小數(shù)點(diǎn)左邊第三位進(jìn)行預(yù)處理;
if(temp[10] else temp[10]=temp[10]-p[1];
//以上處理小數(shù)點(diǎn)小數(shù)點(diǎn)左邊第三位數(shù)字;
if(B_Flag==1)
{if(temp[9]==0) {temp[9]=0;B_Flag=0;}
else temp[9]=temp[9]-1;}
//以上對(duì)存在借位情況時(shí)對(duì)小數(shù)點(diǎn)左邊第二位進(jìn)行預(yù)處理;
temp[9]=temp[9]-p[0];
//以上處理小數(shù)點(diǎn)小數(shù)點(diǎn)左邊第二位數(shù)字;

WriteMainMemory(41,temp[9]);
WriteMainMemory(42,temp[10]);
WriteMainMemory(43,temp[11]);
WriteMainMemory(44,temp[12]);
WriteMainMemory(45,temp[13]);
}
}

//*****************數(shù)碼管顯示函數(shù)********************//
void Display(uchar *p)
{uchar sel,i;
sel=0x01;
for(i=0;i<6;i++)
{PORTA=table[p[i]];
PORTB=sel;
DelayMs(2);
sel=sel<<1;}
}

//****************鍵盤掃描函數(shù)***********************//
uchar Key_Scan(void)
{uchar sccode,recode;
PORTC=0xf0;
if((PINC&0xf0)!=0xf0)
{DelayMs(10);
if((PINC&0xf0)!=0xf0)
{sccode=0xfe;
while(sccode&0x10!=0x00)
{PORTC=sccode; //對(duì)第一行鍵盤測(cè)試
if((PINC&0xf0)!=0xf0)
{recode=(PINC&0xf0)|0x0f;
return((~sccode)+(~recode));}
else
sccode=(sccode<<1)|0x01;
}
}
}
return(0x00);
}

//******************按鍵處理函數(shù)*******************//
void Key_Process(uchar *p)
{uchar temp,value;
temp=Key_Scan();
switch(temp)
{case 0x11:value=9;Num_Flag=1;break;
case 0x21:value=8;Num_Flag=1;break;
case 0x41:value=7;Num_Flag=1;break;
case 0x12:value=6;Num_Flag=1;break;
case 0x22:value=5;Num_Flag=1;break;
case 0x42:value=4;Num_Flag=1;break;
case 0x14:value=3;Num_Flag=1;break;
case 0x24:value=2;Num_Flag=1;break;
case 0x44:value=1;Num_Flag=1;break;
case 0x18:value=0;Num_Flag=1;break;
case 0x28:Point_Flag=1;break;
case 0x82:Add_Flag=1;Sub_Flag=0;Key_Flag=1;break;
case 0x84:Sub_Flag=1;Add_Flag=0;Key_Flag=1;break;
case 0x48:Repair_Flag=1;Key_Flag=1;break;
case 0x81:Init_Flag=1;Key_Flag=1;break;
case 0x88:Enter_Flag=1;Key_Flag=0;break;
default: NOP();
}
if(Num_Flag==1){p[4]=p[3];p[3]=p[2];p[2]=p[1];p[1]=value;Num_Flag=0;}
if(Point_Flag==1){p[0]=value;Point_Flag=0;}
if(Add_Flag==1) {Add_Flag=1;Sub_Flag=0;}
if(Sub_Flag==1) {Sub_Flag=1;Add_Flag=0;}
if(Init_Flag==1) {Init_Flag=1;}
if(Repair_Flag==1) {Repair_Card();Repair_Flag=0;}
if(Enter_Flag==1)
{if(Add_Flag==1) {Add_Card(p);Enter_Flag=0;Add_Flag=0;}
if(Sub_Flag==1) {Sub_Card(p);Enter_Flag=0;Sub_Flag=0;}
if(Init_Flag==1) {Initial_Card(p);Init_Flag=0;}}
}

//***************中斷處理********************//
//**********定時(shí)器2:16ms中斷顯示一次*******//
#pragma interrupt_handler TIMER1_INT:9
void TIMER1_INT(void)
{uchar temp[5],i;
for(i=0;i<5;i++)
temp[i]=ICcontent[9+i];
if(IC_Flag==0) Display(EEEEE);
if(IC_Flag==1) Display(FFFFF);
if(IC_Flag==3)
{if(Key_Flag==1)//顯示此次操作金額;
{Money[1]|=0x80;//顯示時(shí)加上小數(shù)點(diǎn);
Display(Money);}
else //顯示卡內(nèi)余額;
{temp[4]|=0x80;
Display(temp);}
}
}

//*************系統(tǒng)初始化*************//
void Initial_System(void)
{//系統(tǒng)初始化
//SPL=0x5f;//AT90S8535的堆棧指針指向最高RAM地址;
//SPH=0x02;
//IO口初始化;
DDRA=0xff; //A口輸出高電平
PORTA=0xff;
DDRB=0xff; //B口輸出低電平
PORTB=0x00;
DDRC=0x0f; //C口高四位輸入(不帶上拉電阻)低四位輸出0
PORTC=0xf0;
DDRD=0xff; //D口輸出低電平
PORTD=0x00;
//中斷系統(tǒng)初始化(定時(shí)器1中斷)
SREG=SREG|0x80; //I(SREG^7)全局中斷使能置位
TIMSK=TIMSK|0x40;//TOIE1(TIMSK^2)T/C1溢出中斷使能置位
TIFR=TIFR|0x40;//TOV1(TIFR^2)T/C1溢出中斷標(biāo)志位寫"1"清0
//定時(shí)器初始化
TCCR1B=TCCR1B|0x20;//定時(shí)器時(shí)鐘分頻=CLK/8 (1uS計(jì)數(shù))
TCNT1H=0xc1;//需要計(jì)數(shù)16000=0x3E80次,
TCNT1L=0x7f;//計(jì)數(shù)初值0xff-0x3e80=0xc17f;
//顯示系統(tǒng)初始化
IC_Flag=0;//如果IC卡沒(méi)有上電,則顯示的是8.8.8.8.,否則顯示IC卡的內(nèi)容
}

void main(void)
{uchar i,j;
Initial_System();
while(IC_Flag==1)
{DelayMs(5);
ResetIC(ICcode);
i=Read_Card(ICcontent);
if(i==0) {IC_Flag=0; Buzzle_Password();} //顯示EEEE,提示卡壞
if((i==1)|(i==2)) {IC_Flag=1;Buzzle_Card();} //顯示FFFF,提示非法卡
if(i==3)
{if(ICcontent[12]<5)
{IC_Flag=3;Buzzle_Money();}
else
{do Key_Process(Money);
while(Enter_Flag!=0);
Enter_Flag=0;}
}
}
}

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉