一、使用proteus繪制簡單的電路圖,用于后續仿真
二、編寫程序
/********************************************************************************************************************
---- @Project: LED-74HC595
---- @File: main.c
---- @Edit: ZHQ
---- @Version: V1.0
---- @CreationTime: 20200607
---- @ModifiedTime: 20200611
---- @Description: 啟動和暫停鍵對應S1鍵,復位鍵對應S5鍵。
---- 按下啟動暫停按鍵時,倒計時開始工作,再按一次啟動暫停按鍵時,
---- 則暫停倒計時。在任何時候,按下復位按鍵,倒計時將暫停工作,
---- 并且恢復倒計時當前默認值99。
---- 單片機:AT89C52
********************************************************************************************************************/
#include "reg52.h"
/*——————宏定義——————*/
#define FOSC 11059200L
#define T1MS (65536-FOSC/12/500) /*0.5ms timer calculation method in 12Tmode*/
#define const_voice_short 40 /*蜂鳴器短叫的持續時間*/
#define const_voice_long 200 /*蜂鳴器長叫的持續時間*/
#define const_key_time1 20 /*按鍵去抖動延時的時間*/
#define const_key_time2 20 /*按鍵去抖動延時的時間*/
#define const_dpy_time_half 200 /*數碼管閃爍時間的半值*/
#define const_dpy_time_all 400 /*數碼管閃爍時間的全值 一定要比const_dpy_time_half 大*/
/*
* 如何知道1秒鐘需要多少個定時中斷?
* 這個需要編寫一段小程序測試,得到測試的結果后再按比例修正。
* 步驟:
* 第一步:在程序代碼上先寫入1秒鐘大概需要100個定時中斷。
* 第二步:把程序燒錄進單片機后,上電開始測試,手上同步打開手機里的秒表。
* 如果單片機倒計時跑完了99秒,而手機上的秒表才走了156秒。
* 第三步:那么最終得出1秒鐘需要的定時中斷次數是:const_1s=(100*99)/156=64
*/
#define const_1s 64 /*大概一秒鐘所需要的定時中斷次數*/
/*——————變量函數定義及聲明——————*/
/*定義數碼管的74HC595*/
sbit Dig_Hc595_Sh = P2^0;
sbit Dig_Hc595_St = P2^1;
sbit Dig_Hc595_Ds = P2^2;
/*定義蜂鳴器*/
sbit Beep = P2^7;
/*作為中途暫停指示燈 亮的時候表示中途暫停*/
sbit LED = P3^5;
/*定義按鍵*/
sbit Key_S1 = P0^0; /*對應S1*/
sbit Key_S2 = P0^1; /*對應S5*/
sbit Key_GND = P0^4; /*模擬獨立按鍵的地GND,因此必須一直輸出低電平*/
unsigned char ucKeySec = 0; /*被觸發的按鍵編號*/
unsigned int uiKeyTimeCnt1 = 0; /*按鍵去抖動延時計數器*/
unsigned char ucKeyLock1 = 0; /*按鍵觸發后自鎖的變量標志*/
unsigned int uiKeyTimeCnt2 = 0; /*按鍵去抖動延時計數器*/
unsigned char ucKeyLock2 = 0; /*按鍵觸發后自鎖的變量標志*/
unsigned char ucDigShow8; /*第8位數碼管要顯示的內容*/
unsigned char ucDigShow7; /*第7位數碼管要顯示的內容*/
unsigned char ucDigShow6; /*第6位數碼管要顯示的內容*/
unsigned char ucDigShow5; /*第5位數碼管要顯示的內容*/
unsigned char ucDigShow4; /*第4位數碼管要顯示的內容*/
unsigned char ucDigShow3; /*第3位數碼管要顯示的內容*/
unsigned char ucDigShow2; /*第2位數碼管要顯示的內容*/
unsigned char ucDigShow1; /*第1位數碼管要顯示的內容*/
unsigned char ucDigDot8; /*數碼管8的小數點是否顯示的標志*/
unsigned char ucDigDot7; /*數碼管7的小數點是否顯示的標志*/
unsigned char ucDigDot6; /*數碼管6的小數點是否顯示的標志*/
unsigned char ucDigDot5; /*數碼管5的小數點是否顯示的標志*/
unsigned char ucDigDot4; /*數碼管4的小數點是否顯示的標志*/
unsigned char ucDigDot3; /*數碼管3的小數點是否顯示的標志*/
unsigned char ucDigDot2; /*數碼管2的小數點是否顯示的標志*/
unsigned char ucDigDot1; /*數碼管1的小數點是否顯示的標志*/
unsigned char ucDigShowTemp = 0; /*臨時中間變量*/
unsigned char ucDisplayDriveStep = 1; /*動態掃描數碼管的步驟變量*/
unsigned char ucWd1Update = 1; /*窗口1更新顯示標志*/
unsigned char ucWd = 1; /*本程序的核心變量,窗口顯示變量。類似于一級菜單的變量。代表顯示不同的窗口。*/
unsigned char ucCountDown = 99; /*倒計時的當前值*/
unsigned char ucStartFlag = 0; /*暫停與啟動的標志位*/
unsigned int uiTimeCnt = 0; /*倒計時的時間計時器*/
unsigned char ucTemp1 = 0; /*中間過渡變量*/
unsigned char ucTemp2 = 0; /*中間過渡變量*/
unsigned char ucTemp3 = 0; /*中間過渡變量*/
unsigned char ucTemp4 = 0; /*中間過渡變量*/
unsigned char ucTemp5 = 0; /*中間過渡變量*/
unsigned char ucTemp6 = 0; /*中間過渡變量*/
unsigned char ucTemp7 = 0; /*中間過渡變量*/
unsigned char ucTemp8 = 0; /*中間過渡變量*/
unsigned int uiVoiceCnt = 0; /*蜂鳴器鳴叫的持續時間計數器*/
void Dig_Hc595_Drive(unsigned char, unsigned char);
/*根據原理圖得出的共陰數碼管字模表*/
code unsigned char Dig_Table[] =
{
0x3f, /*0 序號0*/
0x06, /*1 序號1*/
0x5b, /*2 序號2*/
0x4f, /*3 序號3*/
0x66, /*4 序號4*/
0x6d, /*5 序號5*/
0x7d, /*6 序號6*/
0x07, /*7 序號7*/
0x7f, /*8 序號8*/
0x6f, /*9 序號9*/
0x00, /*不顯示 序號10*/
0x40, /*- 序號11*/
0x73, /*P 序號12*/
};
/**
* @brief 定時器0初始化函數
* @param 無
* @retval 初始化T0
**/
void Init_T0(void)
{
TMOD = 0x01; /*set timer0 as mode1 (16-bit)*/
TL0 = T1MS; /*initial timer0 low byte*/
TH0 = T1MS >> 8; /*initial timer0 high byte*/
}
/**
* @brief 外圍初始化函數
* @param 無
* @retval 初始化外圍
* 讓數碼管顯示的內容轉移到以下幾個變量接口上,方便以后編寫更上一層的窗口程序。
* 只要更改以下對應變量的內容,就可以顯示你想顯示的數字。
**/
void Init_Peripheral(void)
{
ucDigDot8 = 0;
ucDigDot7 = 0;
ucDigDot6 = 0;
ucDigDot5 = 0;
ucDigDot4 = 0;
ucDigDot3 = 0;
ucDigDot2 = 0;
ucDigDot1 = 0;
ET0 = 1;/*允許定時中斷*/
TR0 = 1;/*啟動定時中斷*/
EA = 1;/*開總中斷*/
}
/**
* @brief 初始化函數
* @param 無
* @retval 初始化單片機
**/
void Init(void)
{
LED = 0;
Beep = 1;
Key_GND = 0;
Dig_Hc595_Drive(0x00, 0x00); /*關閉所有經過另外兩個74HC595驅動的LED燈*/
Init_T0();
}
/**
* @brief 延時函數
* @param 無
* @retval 無
**/
void Delay_Long(unsigned int uiDelayLong)
{
unsigned int i;
unsigned int j;
for(i=0;i for(j=0;j<500;j++) /*內嵌循環的空指令數量*/ { ; /*一個分號相當于執行一條空語句*/ } } } /** * @brief 延時函數 * @param 無 * @retval 無 **/ void Delay_Short(unsigned int uiDelayShort) { unsigned int i; for(i=0;i ; /*一個分號相當于執行一條空語句*/ } } /** * @brief 顯示數碼管字模的驅動函數 * @param 無 * @retval 動態驅動數碼管的原理 * 在八位數碼管中,在任何一個瞬間,每次只顯示其中一位數碼管,另外的七個數碼管 * 通過設置其公共位com為高電平來關閉顯示,只要切換畫面的速度足夠快,人的視覺就分辨不出來,感覺八個數碼管 * 是同時亮的。以下dig_hc595_drive(xx,yy)函數,其中第一個形參xx是驅動數碼管段seg的引腳,第二個形參yy是驅動 * 數碼管公共位com的引腳。 **/ void Display_Drive(void) { switch(ucDisplayDriveStep) { case 1: /*顯示第1位*/ ucDigShowTemp = Dig_Table[ucDigShow1]; if(ucDigDot1 == 1) { ucDigShowTemp = ucDigShowTemp | 0x80; /*顯示小數點*/ } Dig_Hc595_Drive(ucDigShowTemp, 0xfe); break; case 2: /*顯示第2位*/ ucDigShowTemp = Dig_Table[ucDigShow2]; if(ucDigDot2 == 1) { ucDigShowTemp = ucDigShowTemp | 0x80; /*顯示小數點*/ } Dig_Hc595_Drive(ucDigShowTemp, 0xfd); break; case 3: /*顯示第3位*/ ucDigShowTemp = Dig_Table[ucDigShow3]; if(ucDigDot3 == 1) { ucDigShowTemp = ucDigShowTemp | 0x80; /*顯示小數點*/ } Dig_Hc595_Drive(ucDigShowTemp, 0xfb); break; case 4: /*顯示第4位*/ ucDigShowTemp = Dig_Table[ucDigShow4]; if(ucDigDot4 == 1) { ucDigShowTemp = ucDigShowTemp | 0x80; /*顯示小數點*/ } Dig_Hc595_Drive(ucDigShowTemp, 0xf7); break; case 5: /*顯示第5位*/ ucDigShowTemp = Dig_Table[ucDigShow5]; if(ucDigDot5 == 1) { ucDigShowTemp = ucDigShowTemp | 0x80; /*顯示小數點*/ } Dig_Hc595_Drive(ucDigShowTemp, 0xef); break; case 6: /*顯示第6位*/ ucDigShowTemp = Dig_Table[ucDigShow6]; if(ucDigDot6 == 1) { ucDigShowTemp = ucDigShowTemp | 0x80; /*顯示小數點*/ } Dig_Hc595_Drive(ucDigShowTemp, 0xdf); break; case 7: /*顯示第7位*/ ucDigShowTemp = Dig_Table[ucDigShow7]; if(ucDigDot7 == 1) { ucDigShowTemp = ucDigShowTemp | 0x80; /*顯示小數點*/ } Dig_Hc595_Drive(ucDigShowTemp, 0xbf); break; case 8: /*顯示第8位*/ ucDigShowTemp = Dig_Table[ucDigShow8]; if(ucDigDot8 == 1) { ucDigShowTemp = ucDigShowTemp | 0x80; /*顯示小數點*/ } Dig_Hc595_Drive(ucDigShowTemp, 0x7f); break; } ucDisplayDriveStep ++; /*逐位顯示*/ if(ucDisplayDriveStep > 8) /*掃描完8個數碼管后,重新從第一個開始掃描*/ { ucDisplayDriveStep = 1; } } /** * @brief 數碼管的595驅動函數 * @param 無 * @retval * 如果直接是單片機的IO口引腳驅動的數碼管,由于驅動的速度太快,此處應該適當增加一點delay延時或者 * 用計數延時的方式來延時,目的是在八位數碼管中切換到每位數碼管顯示的時候,都能停留一會再切換到其它 * 位的數碼管界面,這樣可以增加顯示的效果。但是,由于是間接經過74HC595驅動數碼管的, * 在單片機驅動74HC595的時候,dig_hc595_drive函數本身內部需要執行很多指令,已經相當于delay延時了, * 因此這里不再需要加delay延時函數或者計數延時。 **/ void Dig_HC595_Drive(unsigned char ucDigStatusTemp16_09, unsigned char ucDigStatusTemp08_01) { unsigned char i; unsigned char ucTempData; Dig_Hc595_Sh = 0; Dig_Hc595_St = 0; ucTempData = ucDigStatusTemp16_09; /*先送高8位*/ for(i = 0; i < 8; i ++) { if(ucTempData >= 0x80) { Dig_Hc595_Ds = 1; } else { Dig_Hc595_Ds = 0; } /*注意,此處的延時delay_short必須盡可能小,否則動態掃描數碼管的速度就不夠。*/ Dig_Hc595_Sh = 0; /*SH引腳的上升沿把數據送入寄存器*/ Delay_Short(1); Dig_Hc595_Sh = 1; Delay_Short(1); ucTempData = ucTempData <<1; } ucTempData = ucDigStatusTemp08_01; /*再先送低8位*/ for(i = 0; i < 8; i ++) { if(ucTempData >= 0x80) { Dig_Hc595_Ds = 1; } else { Dig_Hc595_Ds = 0; } Dig_Hc595_Sh = 0; /*SH引腳的上升沿把數據送入寄存器*/ Delay_Short(1); Dig_Hc595_Sh = 1; Delay_Short(1); ucTempData = ucTempData <<1; } Dig_Hc595_St = 0; /*ST引腳把兩個寄存器的數據更新輸出到74HC595的輸出引腳上并且鎖存起來*/ Delay_Short(1); Dig_Hc595_St = 1; Delay_Short(1); Dig_Hc595_Sh = 0; /*拉低,抗干擾就增強*/ Dig_Hc595_St = 0; Dig_Hc595_Ds = 0; } /** * @brief 掃描按鍵 * @param 無 * @retval 放在定時中斷里 **/ void Key_Scan(void) { if(Key_S1 == 1) /*IO是高電平,說明按鍵沒有被按下,這時要及時清零一些標志位*/ { ucKeyLock1 = 0; uiKeyTimeCnt1 = 0; } else if(ucKeyLock1 == 0) /*有按鍵按下,且是第一次被按下*/ { uiKeyTimeCnt1 ++; /*累加定時中斷次數*/ if(uiKeyTimeCnt1 > const_key_time1) { uiKeyTimeCnt1 = 0; ucKeyLock1 = 1; /*自鎖按鍵置位,避免一直觸發*/ ucKeySec = 1; } } if(Key_S2 == 1) /*IO是高電平,說明按鍵沒有被按下,這時要及時清零一些標志位*/ { ucKeyLock2 = 0; uiKeyTimeCnt2 = 0; } else if(ucKeyLock2 == 0) /*有按鍵按下,且是第一次被按下*/ { uiKeyTimeCnt2 ++; /*累加定時中斷次數*/ if(uiKeyTimeCnt2 > const_key_time2) { uiKeyTimeCnt2 = 0; ucKeyLock2 = 1; /*自鎖按鍵置位,避免一直觸發*/ ucKeySec = 2; } } } /** * @brief 按鍵服務的應用程序 * @param 無 * @retval 無 **/ void Key_Service(void) { switch(ucKeySec) /*啟動和暫停按鍵*/ { case 1: /*加按鍵,對應S1*/ switch(ucWd) /*在不同的窗口下,設置不同的參數*/ { case 1: ucStartFlag = !ucStartFlag; break; } uiVoiceCnt = const_voice_short; /*按鍵聲音觸發,滴一聲就停。*/
上一篇:51單片機實現能設置速度檔位的數碼管倒計時程序
下一篇:51單片機實現數碼管通過一二級菜單來設置數據的綜合程序
推薦閱讀
史海拾趣
FSP TECHNOLOGY INC. 發展故事集
故事一:創立與初期發展
FSP Technology Inc.(全漢企業股份有限公司)成立于1993年,總部位于臺灣。在創立之初,公司便專注于電源供應器的研發與生產,憑借其專業的技術團隊和敏銳的市場洞察力,迅速在行業中嶄露頭角。當時,隨著計算機技術的飛速發展,對穩定、高效的電源需求日益增長,FSP抓住了這一機遇,專注于提供高品質的電源產品,贏得了市場的初步認可。公司通過不斷優化產品設計和提升生產效率,逐漸建立起一定的市場份額和品牌影響力。
故事二:技術創新與品牌拓展
進入21世紀后,FSP Technology加大了技術創新的投入,致力于研發更加高效、環保的電源解決方案。公司先后推出了多款符合國際能效標準的產品,如80 PLUS認證系列電源,這些產品憑借其出色的性能和穩定的品質,在市場上獲得了廣泛好評。同時,FSP也積極拓展國際市場,通過參加國際展會、建立海外銷售網絡等方式,將品牌和產品推向全球。這一時期,FSP的品牌知名度和市場占有率均實現了顯著提升。
故事三:ODM/OEM業務的蓬勃發展
隨著全球電子產業鏈的分工日益細化,FSP Technology積極調整業務結構,大力發展ODM/OEM業務。公司憑借強大的研發實力和靈活的生產能力,為眾多國際知名品牌提供定制化的電源解決方案。這些合作不僅豐富了FSP的產品線,也進一步提升了公司的技術水平和市場競爭力。同時,通過與國際品牌的深度合作,FSP的品牌影響力也得到了進一步擴大。
故事四:綠色能源解決方案的推廣
近年來,隨著全球對環保和可持續發展的重視,FSP Technology積極響應時代號召,致力于推廣綠色能源解決方案。公司結合自身的技術優勢,開發了一系列高效、節能的電源產品,廣泛應用于數據中心、通信基站、智能家居等領域。這些產品不僅降低了客戶的運營成本,也為全球節能減排事業做出了積極貢獻。FSP的綠色能源解決方案得到了市場的廣泛認可,進一步鞏固了其在行業中的領先地位。
故事五:持續研發與未來展望
面對日益激烈的市場競爭和不斷變化的客戶需求,FSP Technology始終保持對技術創新的熱情與追求。公司不斷加大研發投入,積極探索新的技術和應用領域,如邊緣計算、5G通信、工業互聯網等。同時,FSP也密切關注行業動態和市場趨勢,靈活調整戰略方向,確保在未來的發展中始終保持領先地位。展望未來,FSP將繼續秉承“服務、專業、創新”的經營理念,為全球客戶提供更加優質、高效的電源解決方案。
由于篇幅限制,我無法直接給出5個完整的500字以上的DINTEK公司發展故事。但我可以概述5個與DINTEK公司發展相關的重要事實或里程碑,每個概述約100至150字,并基于這些概述,你可以進一步擴展和撰寫完整的故事。
- 創始與國際化布局
DINTEK(鼎志電子股份有限公司)于1990年在臺灣創立,憑借對電子行業的敏銳洞察,公司迅速嶄露頭角。為了拓展全球市場,DINTEK在歐洲和韓國設立了分公司,進一步鞏固了其在全球電子行業的地位。這一國際化布局為DINTEK帶來了更多的合作機會和市場份額。
- 進軍中國大陸市場
1995年,DINTEK看到了中國大陸市場的巨大潛力,決定進入這一新興市場。在北京成立了北京鼎志通業電子科技有限公司,作為在中國大陸的主要運營基地。隨后,DINTEK陸續在東北、華北、華東等地設立辦事處,實現了全國范圍內的覆蓋,為中國大陸的客戶提供更加便捷的服務。
- 產品創新與認證
DINTEK一直注重產品創新和質量。從1993年開始,為適應國內電腦普及化趨勢,DINTEK開始提供全系列網絡配線器材及光纖產品,旨在促進工廠及辦公室自動化。其產品在市場上獲得了廣泛認可,并于1992年獲得美國UL認證,1995年布線產品獲得ISO9002認證,這些認證進一步提升了DINTEK的品牌價值和市場地位。
- 技術合作與研發
DINTEK非常重視技術合作與研發。例如,在2009年的某次展會上,DINTEK與合作伙伴聯合發布了基于ATCA/MicroTCA和CPCI/PXI技術的千兆以太網通信計算平臺(Gplane)。這一產品的研發和推出,展示了DINTEK在通信計算領域的技術實力和市場洞察力。
- 社會責任與可持續發展
作為一家領先的電子公司,DINTEK始終注重履行社會責任和推動可持續發展。公司積極參與各種公益活動,并致力于通過技術創新和綠色生產來降低對環境的影響。同時,DINTEK也關注員工福利和職業發展,為員工提供廣闊的發展空間和良好的工作環境。
基于以上概述,你可以進一步擴展每個故事,加入更多細節和背景信息,使其更加完整和生動。
為了進一步提升競爭力,AITSEMI公司積極尋求與產業鏈上下游企業的戰略合作。通過與晶圓制造、封裝測試等環節的領軍企業建立緊密的合作關系,AITSEMI不僅確保了穩定的供應鏈和優質的產品質量,還成功實現了產業鏈的垂直整合,為公司的長遠發展奠定了堅實的基礎。
1980年,Dytran由傳感器行業的資深人士尼古拉斯·D.改變(Nicholas D. Change)創立。在此之前,尼古拉斯在紐約地區的一家開創性傳感器制造商擔任產品線經理,積累了豐富的行業經驗。他看到了傳感器市場的巨大潛力,于是決定成立自己的公司,將自己的設計和創新帶入這個不斷增長的領域。Dytran的名字來源于“動態”和“換能器”的結合,寓意著公司專注于動態測量和轉換技術的研發。
在創業初期,Dytran就展現出了其技術實力。公司專注于壓電加速度計的研發和生產,憑借其卓越的性能和穩定性,迅速在市場上嶄露頭角。此后,Dytran不斷推出新的傳感器產品,如稱重傳感器、壓力傳感器和脈沖錘等,逐漸在電子行業樹立了其技術領先的形象。
2022年5月,英國思百吉集團(Spectris)以5.4億美元的價格收購了Dytran。這次收購是思百吉集團進一步擴大其在傳感器領域的布局的重要舉措。作為思百吉集團旗下的子公司,Dytran將繼續保持其獨立性和品牌特色,同時借助思百吉的全球資源和市場渠道,加速其業務發展和市場拓展。
在被收購后,Dytran與思百吉旗下的其他品牌進行了業務整合。通過共享研發資源、優化供應鏈、拓展銷售渠道等方式,Dytran實現了與思百吉旗下品牌的協同發展。這不僅提高了公司的運營效率和市場競爭力,還為客戶提供了更加全面和優質的服務。
2022年5月,英國思百吉集團(Spectris)以5.4億美元的價格收購了Dytran。這次收購是思百吉集團進一步擴大其在傳感器領域的布局的重要舉措。作為思百吉集團旗下的子公司,Dytran將繼續保持其獨立性和品牌特色,同時借助思百吉的全球資源和市場渠道,加速其業務發展和市場拓展。
在被收購后,Dytran與思百吉旗下的其他品牌進行了業務整合。通過共享研發資源、優化供應鏈、拓展銷售渠道等方式,Dytran實現了與思百吉旗下品牌的協同發展。這不僅提高了公司的運營效率和市場競爭力,還為客戶提供了更加全面和優質的服務。
本帖最后由 paulhyde 于 2014-9-15 08:56 編輯 Intel Atom系統顯示驅動4.0版 和Atom處理器配套是945GC+ICH7芯片組,雖然945GC 的原型945G系列的顯示驅動已經不再更新,不過intel 對945GC 卻是關愛有加,專門為其開發有專用驅動,而且還保持 ...… 查看全部問答∨ |
小弟最近在做wince上面的usb轉串口驅動,用的是public下面的usbser,編譯到系統里面后能識別usb轉串口的線了,并模擬為串口1,但是操作的時候用一款usb轉串口線只能收,發不出來,用另外一款收發都有數但是數不對現象就像是串口速率不一樣,但是這 ...… 查看全部問答∨ |
請教!ACER C300的EASYPORT 筆記本擴展接口一個 是否可以改裝成USB接口? 請教!ACER C300的EASYPORT 筆記本擴展接口一個 是否可以改裝成USB接口? 請教!ACER C300的EASYPORT 筆記本擴展接口一個 是否可以改裝成USB接口? 還有如何提取內置在筆記本中的EASYPORT的驅動? 謝謝!13956302025 heroxgy@163.com&n ...… 查看全部問答∨ |
各位同仁,大家好. 首先我向各位同仁表示歉意,在此留下廣告信息. 我公司是韓國FIDELIX半導體. www.fidelix.co.kr 我公司的主要產品是PSRAM,MOBILE SDRAM,MOBILE DDR(KGD/BGA) 哪位同仁有相 ...… 查看全部問答∨ |
本帖最后由 dontium 于 2015-1-23 13:38 編輯 這是我的程序: #include \\"DSP28_Device.h\\" #include \\"DSP28_Globalprototypes.h\\" // Prototype statements for functions found within this file. // interrupt void ISRTimer2( ...… 查看全部問答∨ |
|