日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式云IOT技術(shù)圈
[導(dǎo)讀]大部分同學(xué)學(xué)習(xí)C語(yǔ)言編程以后不知道能通過(guò)什么樣的項(xiàng)目才可以鍛煉自己的思維功力,2048相信大家都應(yīng)該熟悉,不管是手機(jī)上還是網(wǎng)頁(yè)版的相信大家都玩過(guò),這個(gè)簡(jiǎn)單的控制臺(tái)版本的游戲是我曾經(jīng)在偉易達(dá)上班時(shí)一個(gè)嵌入式應(yīng)用游戲部門的大佬設(shè)計(jì)的,適合于喜歡用C語(yǔ)

大部分同學(xué)學(xué)習(xí)C語(yǔ)言編程以后不知道能通過(guò)什么樣的項(xiàng)目才可以鍛煉自己的思維功力,2048相信大家都應(yīng)該熟悉,不管是手機(jī)上還是網(wǎng)頁(yè)版的相信大家都玩過(guò),這個(gè)簡(jiǎn)單的控制臺(tái)版本的游戲是我曾經(jīng)在偉易達(dá)上班時(shí)一個(gè)嵌入式應(yīng)用游戲部門的大佬設(shè)計(jì)的,適合于喜歡用C語(yǔ)言寫一些簡(jiǎn)易的游戲的朋友,邏輯性很強(qiáng)。

一、2048游戲原理

在最初的游戲, 它始于一個(gè)空4 x 4游戲板。

1)在空位置的游戲板上,每一輪游戲產(chǎn)生一個(gè)“2”或“4”隨機(jī)的數(shù)字。

2)接下來(lái),玩家輸入的上移,下移,左移或右移命令移動(dòng)塊。兩個(gè)相鄰塊相同的號(hào)碼,若是Q,可以組合成一個(gè)塊數(shù)量2Q。

3)如果沒(méi)有空間產(chǎn)生一個(gè)新的數(shù)字塊,玩家則game over。

4)想贏得游戲,玩家需要產(chǎn)生一塊2048數(shù)字塊。

二、2048游戲文檔

當(dāng)然,這些游戲的邏輯不是大家悶著腦子就能空想出來(lái)的,它一定有很規(guī)范的說(shuō)明文檔,由專業(yè)的人來(lái)書寫,最后軟件工程師參考對(duì)應(yīng)的文檔編寫自己的代碼

篇幅有限,詳細(xì)的下載鏈接:

鏈接:https://pan.baidu.com/s/1Daan58WN-A95BeYQcmSyDA
提取碼:m6ie

當(dāng)然也可以訪問(wèn)Github網(wǎng)站,這是一個(gè)開源的項(xiàng)目,后面各位牛逼的大佬經(jīng)過(guò)移植后,運(yùn)行在各個(gè)平臺(tái)下,原版本鏈接如下:

http://gabrielecirulli.github.io/2048/

三、2048游戲源代碼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <conio.h>

//num
#define FALSE 0
#define TRUE 1

#define EMPTY_CELL 0

#define GMAE_ROW 4
#define GMAE_COL 4

//GameState
#define STATE_SELECT 0
#define STATE_PREPARE 1
#define STATE_PALYING 2
#define STATE_EXIT 3

//GameMode
#define MODE_NONE 0
#define MODE_NORMAL 1
#define MODE_DEBUG 2

//Select Index
#define INDEX_MAXNUM 3
#define INDEX_NORMAL 0
#define INDEX_DEBUG 1
#define INDEX_EXIT 2

//Command
#define COM_LEFT 'a'
#define COM_RIGHT 'd'
#define COM_UP 'w'
#define COM_DOWN 's'
#define COM_QUIT 'q'

//direction
#define DIR_HEAD 0xe0
#define KEY_UP 0xe048
#define KEY_DOWN 0xe050
#define KEY_LEFT 0xe04b
#define KEY_RIGHT 0xe04d


#define ESC 0x1B
#define ENTER 0x0D

//type
typedef unsigned int Uint;
typedef unsigned short Ushort;
typedef unsigned char Uchar;

//declaration
static void GM_Init(void);
static void GM_End(void);

static Uint GM_SelectInit(void);
static Uint GM_SelectHandle(void);
static Uint GM_SelectEnd(void);

static Uint GM_PrepareInit(void);
static Uint GM_PrepareHandle(void);
static Uint GM_PrepareEnd(void);

static Uint GM_PlayingInit(void);
static Uint GM_PlayingHandle(void);
static Uint GM_PlayingEnd(void);


static Uint GM_SelectHandleEnter(void);
static Uint GM_SelectHandleEsc(void);
static void GM_PrintSelectMode(void);
static void GM_RandAddOneNum(void);
static Uchar GM_FromFileAddNum(void);
static Uchar GM_InputAddOneNum(void);
static Uchar GM_NotMoreMove(void);
static void GM_PrintBoard(void);

static Uchar GM_CheckWin2048(void);
static Uchar GM_PlayingPull(void);
static Uchar GM_CombineRight(Uint *array, int num);
static Uchar GM_CombineLeft(Uint *array, int num);
static Uchar GM_MoveRight(Uint *array, int num);
static Uchar GM_MoveLeft (Uint *array, int num);

//struct
typedef struct gameinfo {
Uint Board[GMAE_ROW][GMAE_COL];

Uchar GameState;
Uchar GameMode;

Uchar StateSelectIndex;

Uint PlayingCommand;

}GameInfo, *P_GameInfo;

GameInfo GM;

int main(void)
{
GM_Init();

while(1)
{
switch(GM.GameState)
{
case STATE_SELECT:
GM_SelectHandle();
break;
case STATE_PREPARE:
GM_PrepareHandle();
break;
case STATE_PALYING:
GM_PlayingHandle();
break;
case STATE_EXIT:
goto GAME_EXIT;
default:
break;
}
}

GAME_EXIT:
GM_End();
return 0;
}

static void GM_Init(void)
{
memset(&GM, 0, sizeof(GameInfo));
srand((int)time(NULL));

GM_SelectInit();
}

static void GM_End(void)
{
memset(&GM, 0, sizeof(GameInfo));

fflush(stdin);
printf("\nCommand [q] can quit\n");
while('q' != getch());

}

static Uint GM_SelectInit(void)
{
GM.GameState = STATE_SELECT;
GM.StateSelectIndex = INDEX_NORMAL;
GM_PrintSelectMode();
}

static Uint GM_SelectHandle(void)
{
GM_PrintSelectMode();

fflush(stdin);
Uchar ch1 = getch();
if( ENTER == ch1)
{
GM_SelectHandleEnter();
}
else if( ESC == ch1 )
{
GM_SelectEnd();
GM.GameState = STATE_EXIT;
}
else if ( DIR_HEAD == ch1)
{
Uchar ch2 = getch();
Ushort Key = (ch1 << 8)&0xff00 | ch2;
switch(Key)
{
case KEY_UP:
GM.StateSelectIndex = (GM.StateSelectIndex + INDEX_MAXNUM - 1) % INDEX_MAXNUM;
break;

case KEY_DOWN:
GM.StateSelectIndex = (GM.StateSelectIndex + 1) % INDEX_MAXNUM;
break;

default:
break;
}
}
}

static Uint GM_SelectEnd(void){}


static Uint GM_PrepareInit(void)
{
Uchar OldState = GM.GameState;
GM.GameState = STATE_PREPARE;

//from STATE_SELECT --> STATE_PREPARE
if(STATE_SELECT == OldState)
{
if(MODE_NORMAL == GM.GameMode)
{
GM_RandAddOneNum();
GM_RandAddOneNum();
}
else
{
GM_FromFileAddNum();
}
}
//from STATE_PALYING --> STATE_PREPARE
else
{
if(MODE_NORMAL == GM.GameMode)
{
GM_RandAddOneNum();
}
else
{
GM_PrintBoard();
while(FALSE == GM_InputAddOneNum());
}
}
GM_PrintBoard();
}

static Uint GM_PrepareHandle(void)
{
if(TRUE != GM_NotMoreMove())
{
GM_PrepareEnd();
GM_PlayingInit();
}
else
{
printf("Game Over!\n");
GM.GameState = STATE_EXIT;
}

}

static Uint GM_PrepareEnd(void){}

static Uint GM_PlayingInit(void)
{
GM.GameState = STATE_PALYING;
printf( "PULL: [a]LEFT [d]RIGHT [w]UP [s]DOWN [q]QUIT\n" );
printf( "Command: ");
fflush(stdout);
}

static Uint GM_PlayingHandle(void)
{
fflush(stdin);
GM.PlayingCommand = getch();


switch(GM.PlayingCommand)
{
case COM_LEFT:
case COM_RIGHT:
case COM_UP:
case COM_DOWN:
if( FALSE == GM_PlayingPull())
{
printf("[Error] invalid direction\n");
printf( "Command: ");
}
else
{
if( TRUE == GM_CheckWin2048() )
{
GM_PrintBoard();
printf("you win !\n");
GM.GameState = STATE_EXIT;
}
else
{
GM_PlayingEnd();
GM_PrepareInit();
}
}
break;
case COM_QUIT:
printf("Bye !\n");
GM.GameState = STATE_EXIT;
break;
default:
printf("[Error] Command is a, d, w, s, q \n");
printf( "Command: ");
fflush(stdout);
break;
}
//GM_PrintBoard();
}

static Uint GM_PlayingEnd(void)
{
GM.PlayingCommand = 0;
}


static Uint GM_SelectHandleEnter(void)
{
switch(GM.StateSelectIndex)
{
case INDEX_NORMAL:
case INDEX_DEBUG:
if(INDEX_NORMAL == GM.StateSelectIndex)
{
GM.GameMode = MODE_NORMAL;
}
else
{
GM.GameMode = MODE_DEBUG;
}
GM_SelectEnd();
GM_PrepareInit();
break;

case INDEX_EXIT:
GM_SelectEnd();
GM.GameState = STATE_EXIT;
break;

default:
printf("error\n");
break;
}

}

static Uint GM_SelectHandleEsc(void){}


static void GM_PrintSelectMode(void)
{
system("cls");
printf("# - - - - - - - - #\n");
printf("# welcome to 2048 #\n");
printf("# - - - - - - - - #\n");
printf(" MODU SELECT \n");

printf("\n ");
printf(GM.StateSelectIndex==INDEX_NORMAL?"-->NORMAL":" NORMAL");
printf("\n ");
printf(GM.StateSelectIndex==INDEX_DEBUG? "-->DEBUG ":" DEBUG ");
printf("\n ");
printf(GM.StateSelectIndex==INDEX_EXIT? "-->EXIT ":" EXIT ");
}


static void GM_RandAddOneNum(void)
{
int row, col;

while (1)
{
row = rand() % GMAE_ROW;
col = rand() % GMAE_COL;
if ( GM.Board[row][col] == EMPTY_CELL )
{
GM.Board[row][col] = ((rand() % 2) + 1) * 2;
break;
}
}
}

static Uchar GM_FromFileAddNum(void)
{
FILE *infp;
Uchar tmp[6],tmp1;
Uchar ret = 0;
Uchar i,j;

if(infp = fopen("map.txt", "rb"))
{
for(i = 0; i < GMAE_ROW * GMAE_COL; i++)
{
j = 0;
memset(tmp, 0, sizeof(tmp));
while(1)
{
if(!fread(&tmp[j], 1, 1, infp))
ret |= 0x02;

if(tmp[j] == ' ' || tmp[j] == '\n' || tmp[j] == 0)
break;

j++;
}
*(&GM.Board[0][0]+i) = atoi((const char *)tmp);
}
}
else
{
ret |= 0x01;
}

if(NULL != infp)
{
fclose(infp);
}

if(ret != 0)
{
printf("read map txt fail\n");
}
return ret;

}

static Uchar GM_InputAddOneNum(void)
{
int row, col, value;
int ret = TRUE;
printf("please input add one num!\n");
printf("Row,Col,Value :");
fflush(stdout);
fflush(stdin);
scanf("%d,%d,%d", &row, &col, &value);

if(row >= GMAE_ROW || row < 0)
{
printf("[Error] Row is between 0 and %d !\n", GMAE_ROW-1);
ret = FALSE;
}

if(col >= GMAE_COL || col < 0)
{
printf("[Error] Col is between 0 and %d !\n", GMAE_COL-1);
ret = FALSE;
}

if(ret == TRUE && GM.Board[row][col] != 0)
{
printf("[Error] ( %d , %d ) is occupied!\n", row, col);
ret = FALSE;
}

if(value != 2 && value != 4)
{
printf("[Error] Cell Value is either 2 or 4\n");
ret = FALSE;
}

if(ret == TRUE)
{
GM.Board[row][col] = value;
}
return ret;
}

static Uchar GM_NotMoreMove(void)
{
int NotMoreMove = TRUE;
int row, col;
for ( row = 0; row < GMAE_ROW; row++)
{
for ( col = 0; col < GMAE_COL; col++)
{
if(GM.Board[row][col] == 0)
{
NotMoreMove = FALSE;
break;
}

if( col+1 < GMAE_COL && GM.Board[row][col] == GM.Board[row][col+1])
{
NotMoreMove = FALSE;
break;
}

if( row+1 < GMAE_ROW && GM.Board[row][col] == GM.Board[row+1][col])
{
NotMoreMove = FALSE;
break;
}
}
if(FALSE == NotMoreMove)
break;
}
return NotMoreMove;
}

static void GM_PrintBoard(void)
{
int row, col;
system("cls");
printf("# - - - - - - - - #\n");
printf("# welcome to 2048 #\n");
printf("# - - - - - - - - #\n");
for ( row = 0; row < GMAE_ROW; row++)
{
for ( col = 0; col < GMAE_COL; col++)
{
printf(" + - -", GM.Board[row][col]);
}
printf(" +\n");
for ( col = 0; col < GMAE_COL; col++)
{
if(0 == GM.Board[row][col])
printf(" | ");
else
printf(" |%4d", GM.Board[row][col]);
}
printf(" |\n");
}
printf(" + + + + + + + + + + + + + \n");

}

static Uchar GM_CheckWin2048(void)
{
int row,col;

for ( row = 0; row < GMAE_ROW; row++)
{
for ( col = 0; col < GMAE_COL; col++)
{
if( GM.Board[row][col] == 2048 )
{
return TRUE;
}
}
}
return FALSE;
}

static Uchar GM_PlayingPull(void)
{
//GMAE_ROW 行 4
//GMAE_COL 列 4

int index;
int col, row;
Uchar PullFlag = FALSE;
Uint array[GMAE_ROW > GMAE_COL? GMAE_ROW:GMAE_COL];

//******************COM_LEFT*******************
if( COM_LEFT == GM.PlayingCommand)
for ( row = 0; row < GMAE_ROW; row++)
{
PullFlag |= GM_MoveLeft( (Uint *)GM.Board[row], GMAE_COL );
PullFlag |= GM_CombineLeft( (Uint *)GM.Board[row], GMAE_COL );
PullFlag |= GM_MoveLeft( (Uint *)GM.Board[row], GMAE_COL );
}

//******************COM_RIGHT******************
else if( COM_RIGHT == GM.PlayingCommand)
for ( row = 0; row < GMAE_ROW; row++)
{
PullFlag |= GM_MoveRight( (Uint *)GM.Board[row], GMAE_COL );
PullFlag |= GM_CombineRight( (Uint *)GM.Board[row], GMAE_COL );
PullFlag |= GM_MoveRight( (Uint *)GM.Board[row], GMAE_COL );
}

//******************COM_UP*********************
else if( COM_UP == GM.PlayingCommand)
for ( col = 0; col < GMAE_COL; col++)
{
for ( row = 0; row < GMAE_ROW; row++)
{
array[row] = GM.Board[row][col];
}

//a col move Left
PullFlag |= GM_MoveLeft( (Uint *)array, GMAE_ROW );
PullFlag |= GM_CombineLeft( (Uint *)array, GMAE_ROW );
PullFlag |= GM_MoveLeft( (Uint *)array, GMAE_ROW );

//write a col
for ( row = 0; row < GMAE_ROW; row++)
{
GM.Board[row][col] = array[row];
}
}

//******************COM_DOWN******************
else if( COM_DOWN == GM.PlayingCommand)
for ( col = 0; col < GMAE_COL; col++)
{
//read a col
for ( row = 0; row < GMAE_ROW; row++)
{
array[row] = GM.Board[row][col];
}

//a col move right
PullFlag |= GM_MoveRight( (Uint *)array, GMAE_ROW );
PullFlag |= GM_CombineRight( (Uint *)array, GMAE_ROW );
PullFlag |= GM_MoveRight( (Uint *)array, GMAE_ROW );

//write a col
for ( row = 0; row < GMAE_ROW; row++)
{
GM.Board[row][col] = array[row];
}
}

return PullFlag;
}

static Uchar GM_CombineLeft(Uint *array, int num)
{
int i;
Uchar CombineFlag = FALSE;
for ( i = 0; i < num-1; i++ )
{
if( array[i] != 0 && array[i] == array[i+1] )
{
array[i] *= 2;
array[i+1] = 0;
CombineFlag = TRUE;
}
}
return CombineFlag;
}


static Uchar GM_CombineRight(Uint *array, int num)
{
int i;
Uchar CombineFlag = FALSE;
for ( i = num-1; i >= 1; i-- )
{
if( array[i] != 0 && array[i] == array[i-1] )
{
array[i] *= 2;
array[i-1] = 0;
CombineFlag = TRUE;
}
}
return CombineFlag;
}


static Uchar GM_MoveRight(Uint *array, int num)
{
int i;
int index = num - 1;
Uchar moveflg = FALSE;

for(i = num-1; i >= 0; i--)
{

if(array[i] != 0)
{
if(array[i] != array[index])
{
array[index] = array[i];
moveflg = TRUE;
}
index--;
}
}

while(index != -1)
{
array[index] = 0;
index--;
}

return moveflg;

}


static Uchar GM_MoveLeft(Uint *array, int num)
{
int i;
int index = 0;
Uchar moveflg = FALSE;

for(i = 0; i < num; i++)
{

if(array[i] != 0)
{
if(array[i] != array[index])
{
array[index] = array[i];
moveflg = TRUE;
}
index++;
}
}

while(index != num)
{
array[index] = 0;
index++;
}

return moveflg;

}

四、運(yùn)行結(jié)果

游戲主菜單界面,通過(guò)方向鍵選擇,分別有NORMAL(正常進(jìn)行游戲)、DEBUG(調(diào)試模式)、EXIT(退出游戲)

按回車鍵進(jìn)入對(duì)應(yīng)的模式。

用字母a、d、w、s、q分別代替左右上下以及退出鍵。

如果最后游戲成功了,則會(huì)提示成功,如果失敗則會(huì)退出程序。

詳細(xì)的游戲邏輯可通過(guò)代碼以及文檔進(jìn)行了解。

往期精彩

嵌入式系統(tǒng)軟件架構(gòu)設(shè)計(jì)(長(zhǎng)篇深度好文)

專為MCU項(xiàng)目開發(fā)提速的代碼框架BabyOS

嵌入式C語(yǔ)言代碼優(yōu)化方案(深度好文,建議花時(shí)間研讀并收藏)

C語(yǔ)言表驅(qū)動(dòng)法編程實(shí)踐(精華帖,建議收藏并實(shí)踐)

嵌入式工程師買車、用車的總結(jié)

若覺(jué)得本次分享的文章對(duì)您有幫助,隨手點(diǎn)[在看]并轉(zhuǎn)發(fā)分享,也是對(duì)我的支持。


免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(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)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉