C語(yǔ)言在嵌入式系統(tǒng)編程時(shí)的注意事項(xiàng)(三)

姓名:徐嬌 ? ?學(xué)號(hào):17011210547

轉(zhuǎn)自http://mp.weixin.qq.com/s/YUXrJbin_rnwModTY2Ds_A

【嵌牛導(dǎo)讀】

C語(yǔ)言是一門(mén)通用計(jì)算機(jī)編程語(yǔ)言产场,應(yīng)用廣泛剃根。C語(yǔ)言的設(shè)計(jì)目標(biāo)是提供一種能以簡(jiǎn)易的方式編譯惭婿、處理低級(jí)存儲(chǔ)器秧倾、產(chǎn)生少量的機(jī)器碼以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的編程語(yǔ)言咨油。

盡管C語(yǔ)言提供了許多低級(jí)處理的功能承桥,但仍然保持著良好跨平臺(tái)的特性,以一個(gè)標(biāo)準(zhǔn)規(guī)格寫(xiě)出的C語(yǔ)言程序可在許多電腦平臺(tái)上進(jìn)行編譯饭宾,甚至包含一些嵌入式處理器(單片機(jī)或稱MCU)以及超級(jí)電腦等作業(yè)平臺(tái)批糟。

20世紀(jì)80年代,為了避免各開(kāi)發(fā)廠商用的C語(yǔ)言語(yǔ)法產(chǎn)生差異看铆,由美國(guó)國(guó)家標(biāo)準(zhǔn)局為C語(yǔ)言訂定了一套完整的國(guó)際標(biāo)準(zhǔn)語(yǔ)法徽鼎,稱為ANSI C,作為C語(yǔ)言最初的標(biāo)準(zhǔn)。

【嵌牛鼻子】C語(yǔ)言纬傲、嵌入式系統(tǒng)編程满败、注意事項(xiàng)之屏幕操作

【嵌牛提問(wèn)】C語(yǔ)言在嵌入式系統(tǒng)編程時(shí)的注意事項(xiàng)

【嵌牛正文】

C語(yǔ)言嵌入式系統(tǒng)編程注意事項(xiàng)之屏幕操作

現(xiàn)在要解決的問(wèn)題是,嵌入式系統(tǒng)中經(jīng)常要使用的并非是完整的漢字庫(kù)叹括,往往只是需要提供數(shù)量有限的漢字供必要的顯示功能

漢字處理

現(xiàn)在要解決的問(wèn)題是,嵌入式系統(tǒng)中經(jīng)常要使用的并非是完整的漢字庫(kù)宵荒,往往只是需要提供數(shù)量有限的漢字供必要的顯示功能汁雷。例如,一個(gè)微波爐的LCD上沒(méi)有必要提供顯示“電子郵件”的功能报咳;一個(gè)提供漢字顯示功能的空調(diào)的LCD上不需要顯示一條“短消息”侠讯,諸如此類。但是一部手機(jī)暑刃、小靈通則通常需要包括較完整的漢字庫(kù)厢漩。

如果包括的漢字庫(kù)較完整,那么岩臣,由內(nèi)碼計(jì)算出漢字字模在庫(kù)中的偏移是十分簡(jiǎn)單的:漢字庫(kù)是按照區(qū)位的順序排列的溜嗜,前一個(gè)字節(jié)為該漢字的區(qū)號(hào),后一個(gè)字節(jié)為該字的位號(hào)架谎。每一個(gè)區(qū)記錄94個(gè)漢字炸宵,位號(hào)則為該字在該區(qū)中的位置。因此谷扣,漢字在漢字庫(kù)中的具體位置計(jì)算公式為:94*(區(qū)號(hào)-1)+位號(hào)-1土全。減1是因?yàn)閿?shù)組是以0為開(kāi)始而區(qū)號(hào)位號(hào)是以1為開(kāi)始的。只需乘上一個(gè)漢字字模占用的字節(jié)數(shù)即可会涎,即:(94*(區(qū)號(hào)-1)+位號(hào)-1)*一個(gè)漢字字模占用字節(jié)數(shù)裹匙,以16*16點(diǎn)陣字庫(kù)為例,計(jì)算公式則為:(94*(區(qū)號(hào)-1)+(位號(hào)-1))*32末秃。漢字庫(kù)中從該位置起的32字節(jié)信息記錄了該字的字模信息概页。

對(duì)于包含較完整漢字庫(kù)的系統(tǒng)而言,我們可以以上述規(guī)則計(jì)算字模的位置蛔溃。但是如果僅僅是提供少量漢字呢绰沥?譬如幾十至幾百個(gè)?最好的做法是:

定義宏:

# define EX_FONT_CHAR()

# define EX_FONT_UNICODE_VAL() ()贺待,

# define EX_FONT_ANSI_VAL() ()徽曲,

定義結(jié)構(gòu)體:

typedef struct _wide_unicode_font16x16

{

WORD ; /*內(nèi)碼*/

BYTE data[32]; /*字模點(diǎn)陣*/

}Unicode;

#define CHINESE_CHAR_NUM … /*漢字?jǐn)?shù)量*/

字模的存儲(chǔ)用數(shù)組:

Unicode chinese[CHINESE_CHAR_NUM]=

{

{

EX_FONT_CHAR(“業(yè)”)

EX_FONT_UNICODE_VAL(0x4e1a)

{0x04,0x40麸塞,0x04秃臣,0x40,0x04,0x40奥此,0x04弧哎,0x44,0x44稚虎,0x46撤嫩,0x24,0x4c蠢终,0x24序攘,0x48,0x14寻拂,0x50程奠,0x1c,0x50祭钉,0x14瞄沙,0x60,0x04慌核,0x40距境,0x04,0x40遂铡,0x04肮疗,0x44,0xff扒接,0xfe伪货,0x00,0x00钾怔,0x00碱呼,0x00}

},

{

EX_FONT_CHAR(“中”)

EX_FONT_UNICODE_VAL(0x4e2d)

{0x01宗侦,0x00愚臀,0x01,0x00矾利,0x21姑裂,0x08,0x3f男旗,0xfc舶斧,0x21,0x08察皇,0x21茴厉,0x08泽台,0x21,0x08矾缓,0x21怀酷,0x08,0x21嗜闻,0x08蜕依,

0x3f,0xf8泞辐,0x21笔横,0x08,0x01咐吼,0x00,0x01商佑,0x00锯茄,0x01,0x00茶没,0x01肌幽,0x00,0x01抓半,0x00}

}喂急,

{

EX_FONT_CHAR(“云”)

EX_FONT_UNICODE_VAL(0x4e91)

{0x00,0x00笛求,0x00廊移,0x30,0x3f探入,0xf8狡孔,0x00,0x00蜂嗽,0x00苗膝,0x00,0x00植旧,0x0c辱揭,0xff,0xfe病附,0x03问窃,0x00,0x07胖喳,0x00泡躯,

0x06,0x40,0x0c较剃,0x20咕别,0x18,0x10写穴,0x31惰拱,0xf8,0x7f啊送,0x0c偿短,0x20,0x08馋没,0x00昔逗,0x00}

},

{

EX_FONT_CHAR(“件”)

EX_FONT_UNICODE_VAL(0x4ef6)

{0x10篷朵,0x40勾怒,0x1a,0x40声旺,0x13笔链,0x40,0x32腮猖,0x40鉴扫,0x23,0xfc澈缺,0x64坪创,0x40,0xa4谍椅,0x40误堡,0x28,0x40雏吭,0x2f锁施,0xfe,

0x20杖们,0x40悉抵,0x20,0x40摘完,0x20姥饰,0x40,0x20孝治,0x40列粪,0x20审磁,0x40,0x20岂座,0x40态蒂,0x20,0x40}

}

}

要顯示特定漢字的時(shí)候费什,只需要從數(shù)組中查找內(nèi)碼與要求漢字內(nèi)碼相同的即可獲得字模钾恢。如果前面的漢字在數(shù)組中以內(nèi)碼大小順序排列,那么可以以二分查找法更高效的查找到漢字的字模鸳址。

這是一種很有效的組織小漢字庫(kù)的方法瘩蚪,它可以保證程序有很好的結(jié)構(gòu)。

系統(tǒng)時(shí)間顯示

從NVRAM中可以讀取系統(tǒng)的時(shí)間稿黍,系統(tǒng)一般借助NVRAM產(chǎn)生的秒中斷每秒讀取一次當(dāng)前時(shí)間并在LCD上顯示疹瘦。關(guān)于時(shí)間的顯示,有一個(gè)效率問(wèn)題巡球。因?yàn)闀r(shí)間有其特殊性拱礁,那就是60秒才有一次分鐘的變化,60分鐘才有一次小時(shí)變化辕漂,如果我們每次都將讀取的時(shí)間在屏幕上完全重新刷新一次,則浪費(fèi)了大量的系統(tǒng)時(shí)間吴超。

一個(gè)較好的辦法是我們?cè)跁r(shí)間顯示函數(shù)中以靜態(tài)變量分別存儲(chǔ)小時(shí)钉嘹、分鐘、秒鲸阻,只有在其內(nèi)容發(fā)生變化的時(shí)候才更新其顯示跋涣。

extern void DisplayTime(…)

{

static BYTE byHour,byMinute鸟悴,bySecond;

BYTE byNewHour陈辱,byNewMinute,byNewSecond;

byNewHour = GetSysHour();

byNewMinute = GetSysMinute();

byNewSecond = GetSysSecond();

if(byNewHour细诸!= byHour)

{

… /*顯示小時(shí)*/

byHour = byNewHour;

}

if(byNewMinute沛贪!= byMinute)

{

… /*顯示分鐘*/

byMinute = byNewMinute;

}

if(byNewSecond!= bySecond)

{

… /*顯示秒鐘*/

bySecond = byNewSecond;

}

}

這個(gè)例子也可以順便作為C語(yǔ)言中static關(guān)鍵字強(qiáng)大威力的證明震贵。當(dāng)然利赋,在C++語(yǔ)言里,static具有了更加強(qiáng)大的威力猩系,它使得某些數(shù)據(jù)和函數(shù)脫離“對(duì)象”而成為“類”的一部分媚送,正是它的這一特點(diǎn),成就了軟件的無(wú)數(shù)優(yōu)秀設(shè)計(jì)寇甸。

動(dòng)畫(huà)顯示

動(dòng)畫(huà)是無(wú)所謂有塘偎,無(wú)所謂無(wú)的疗涉,靜止的畫(huà)面走的路多了,也就成了動(dòng)畫(huà)吟秩。隨著時(shí)間的變更咱扣,在屏幕上顯示不同的靜止畫(huà)面,即是動(dòng)畫(huà)之本質(zhì)峰尝。所以偏窝,在一個(gè)嵌入式系統(tǒng)的LCD上欲顯示動(dòng)畫(huà),必須借助定時(shí)器武学。沒(méi)有硬件或軟件定時(shí)器的世界是無(wú)法想像的:

(1) 沒(méi)有定時(shí)器祭往,一個(gè)操作系統(tǒng)將無(wú)法進(jìn)行時(shí)間片的輪轉(zhuǎn),于是無(wú)法進(jìn)行多任務(wù)的調(diào)度火窒,于是便不再成其為一個(gè)多任務(wù)操作系統(tǒng)硼补;

(2) 沒(méi)有定時(shí)器,一個(gè)多媒體播放軟件將無(wú)法運(yùn)作熏矿,因?yàn)樗恢篮螘r(shí)應(yīng)該切換到下一幀畫(huà)面已骇;

(3) 沒(méi)有定時(shí)器,一個(gè)網(wǎng)絡(luò)協(xié)議將無(wú)法運(yùn)轉(zhuǎn)票编,因?yàn)槠錈o(wú)法獲知何時(shí)包傳輸超時(shí)并重傳之褪储,無(wú)法在特定的時(shí)間完成特定的任務(wù)。

因此慧域,沒(méi)有定時(shí)器將意味著沒(méi)有操作系統(tǒng)鲤竹、沒(méi)有網(wǎng)絡(luò)、沒(méi)有多媒體昔榴,這將是怎樣的黑暗辛藻?所以,合理并靈活地使用各種定時(shí)器互订,是對(duì)一個(gè)軟件人的最基本需求吱肌!

在80186為主芯片的嵌入式系統(tǒng)中,我們需要借助硬件定時(shí)器的中斷來(lái)作為軟件定時(shí)器仰禽,在中斷發(fā)生后變更畫(huà)面的顯示內(nèi)容氮墨。在時(shí)間顯示“xx:xx”中讓冒號(hào)交替有無(wú),每次秒中斷發(fā)生后坟瓢,需調(diào)用ShowDot:

void ShowDot()

{

static BOOL bShowDot = TRUE; /*再一次領(lǐng)略static關(guān)鍵字的威力*/

if(bShowDot)

{

showChar(’:’勇边,xPos,yPos);

}

else

{

showChar(’ ’折联,xPos粒褒,yPos);

}

bShowDot =!bShowDot;

}

菜單操作

無(wú)數(shù)人為之絞盡腦汁的問(wèn)題終于出現(xiàn)了诚镰,在這一節(jié)里奕坟,我們將看到祥款,在C語(yǔ)言中哪怕用到一丁點(diǎn)的面向?qū)ο笏枷耄浖Y(jié)構(gòu)將會(huì)有何等的改觀月杉!

要求以鍵盤(pán)上的“← →”鍵切換菜單焦點(diǎn)刃跛,當(dāng)用戶在焦點(diǎn)處于某菜單時(shí),若敲擊鍵盤(pán)上的OK苛萎、CANCEL鍵則調(diào)用該焦點(diǎn)菜單對(duì)應(yīng)之處理函數(shù)桨昙。我曾經(jīng)傻傻地這樣做著:

/*按下OK鍵*/

void onOkKey()

{

/*判斷在什么焦點(diǎn)菜單上按下Ok鍵,調(diào)用相應(yīng)處理函數(shù)*/

Switch(currentFocus)

{

case MENU1:

menu1OnOk();

break;

case MENU2:

menu2OnOk();

break;

}

}

/*按下Cancel鍵*/

void onCancelKey()

{

/*判斷在什么焦點(diǎn)菜單上按下Cancel鍵腌歉,調(diào)用相應(yīng)處理函數(shù)*/

Switch(currentFocus)

{

case MENU1:

menu1OnCancel();

break;

case MENU2:

menu2OnCancel();

break;

}

}

終于有一天蛙酪,我這樣做了:

/*將菜單的屬性和操作“封裝”在一起*/

typedef struct tagSysMenu

{

char *text; /*菜單的文本*/

BYTE xPos; /*菜單在LCD上的x坐標(biāo)*/

BYTE yPos; /*菜單在LCD上的y坐標(biāo)*/

void(*onOkFun)(); /*在該菜單上按下ok鍵的處理函數(shù)指針*/

void(*onCancelFun)(); /*在該菜單上按下cancel鍵的處理函數(shù)指針*/

}SysMenu,*LPSysMenu;

當(dāng)我定義菜單時(shí)翘盖,只需要這樣:

static SysMenu menu[MENU_NUM]=

{

{

“menu1”桂塞,0,48馍驯,menu1OnOk阁危,menu1OnCancel

}

{

“ menu2”汰瘫,7狂打,48,menu2OnOk混弥,menu2OnCancel

}

菱父,

{

“ menu3”,7剑逃,48,menu3OnOk官辽,menu3OnCancel

}

蛹磺,

{

“ menu4”,7同仆,48萤捆,menu4OnOk,menu4OnCancel

}

};

OK鍵和CANCEL鍵的處理變成:

/*按下OK鍵*/

void onOkKey()

{

menu[currentFocusMenu].onOkFun();

}

/*按下Cancel鍵*/

void onCancelKey()

{

menu[currentFocusMenu].onCancelFun();

}

程序被大大簡(jiǎn)化了俗批,也開(kāi)始具有很好的可擴(kuò)展性俗或!我們僅僅利用了面向?qū)ο笾械姆庋b思想,就讓程序結(jié)構(gòu)清晰岁忘,其結(jié)果是幾乎可以在無(wú)需修改程序的情況下在系統(tǒng)中添加更多的菜單辛慰,而系統(tǒng)的按鍵處理函數(shù)保持不變。

面向?qū)ο蟾上瘢嫔窳耍?/p>

模擬MessageBox函數(shù)

MessageBox函數(shù)帅腌,這個(gè)Windows編程中的超級(jí)猛料驰弄,不知道是多少入門(mén)者第一次用到的函數(shù)。還記得我們第一次在Windows中利用MessageBox輸出“Hello速客,World戚篙!”對(duì)話框時(shí)新奇的感覺(jué)嗎?無(wú)法統(tǒng)計(jì)溺职,這個(gè)世界上究竟有多少程序員學(xué)習(xí)Windows編程是從MessageBox(“Hello岔擂,World!”浪耘,…)開(kāi)始的乱灵。在我本科的學(xué)校,廣泛流傳著一個(gè)詞匯点待,叫做“’Hello阔蛉,World’級(jí)程序員”,意指入門(mén)級(jí)程序員癞埠,但似乎“’Hello状原,World’級(jí)”這個(gè)說(shuō)法更搞笑而形象。

嵌入式系統(tǒng)中沒(méi)有給我們提供MessageBox苗踪,但是鑒于其功能強(qiáng)大颠区,我們需要模擬之,一個(gè)模擬的MessageBox函數(shù)為:

/******************************************

/*函數(shù)名稱:MessageBox

/*功能說(shuō)明: 彈出式對(duì)話框通铲,顯示提醒用戶的信息

/*參數(shù)說(shuō)明:lpStr ---提醒用戶的字符串輸出信息

/* TYPE ---輸出格式(ID_OK = 0毕莱,ID_OKCANCEL = 1)

/*返回值: 返回對(duì)話框接收的鍵值,只有兩種KEY_OK颅夺,KEY_CANCEL

/******************************************

typedef enum TYPE { ID_OK朋截,ID_OKCANCEL }MSG_TYPE;

extern BYTE MessageBox(LPBYTE lpStr,BYTE TYPE)

{

BYTE key = -1;

ClearScreen(); /*清除屏幕*/

DisplayString(xPos吧黄,yPos部服,lpStr,TRUE); /*顯示字符串*/

/*根據(jù)對(duì)話框類型決定是否顯示確定拗慨、取消*/

switch(TYPE)

{

case ID_OK:

DisplayString(13廓八,yPos+High+1,“確定”赵抢,0);

break;

case ID_OKCANCEL:

DisplayString(8剧蹂,yPos+High+1,“確定”烦却,0);

DisplayString(17宠叼,yPos+High+1,“取消”其爵,0);

break;

default:

break;

}

DrawRect(0车吹,0筹裕,239,yPos+High+16+4); /*繪制外框*/

/* MessageBox是模式對(duì)話框窄驹,阻塞運(yùn)行朝卒,等待按鍵*/

while( (key!= KEY_OK)||(key乐埠!= KEY_CANCEL) )

{

key = getSysKey();

}

/*返回按鍵類型*/

if(key== KEY_OK)

{

return ID_OK;

}

else

{

return ID_CANCEL;

}

}

上述函數(shù)與我們平素在VC++等中使用的MessageBox是何等的神似翱菇铩?實(shí)現(xiàn)這個(gè)函數(shù)丈咐,你會(huì)看到它在嵌入式系統(tǒng)中的妙用是無(wú)窮的瑞眼。

總結(jié)

本篇是本系列文章中技巧性最深的一篇,它提供了嵌入式系統(tǒng)屏幕顯示方面一些很巧妙的處理方法棵逊,靈活使用它們伤疙,我們將不再被LCD上凌亂不堪的顯示內(nèi)容所困擾。

屏幕乃嵌入式系統(tǒng)生存之重要輔助辆影,面目可憎之顯示將另用戶逃之夭夭徒像。屏幕編程若處理不好,將是軟件中最不系統(tǒng)蛙讥、最混亂的部分锯蛀,筆者曾深受其害。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末次慢,一起剝皮案震驚了整個(gè)濱河市旁涤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌迫像,老刑警劉巖劈愚,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異闻妓,居然都是意外死亡造虎,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)纷闺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人份蝴,你說(shuō)我怎么就攤上這事犁功。” “怎么了婚夫?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵浸卦,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我案糙,道長(zhǎng)限嫌,這世上最難降的妖魔是什么靴庆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮怒医,結(jié)果婚禮上炉抒,老公的妹妹穿的比我還像新娘。我一直安慰自己稚叹,他們只是感情好焰薄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著扒袖,像睡著了一般塞茅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音毛秘,去河邊找鬼嫂侍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛氧敢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼衰猛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了刹孔?” 一聲冷哼從身側(cè)響起啡省,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎髓霞,沒(méi)想到半個(gè)月后卦睹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡方库,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年结序,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纵潦。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡徐鹤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出邀层,到底是詐尸還是另有隱情返敬,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布寥院,位于F島的核電站劲赠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凛澎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一霹肝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧塑煎,春花似錦沫换、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至炭晒,卻和暖如春待逞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背网严。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工识樱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人震束。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓怜庸,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親垢村。 傳聞我的和親對(duì)象是個(gè)殘疾皇子割疾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容