當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀] 硬件介紹:硬件部分只需字符型輸入輸出設(shè)備:scanf從輸入字符型設(shè)備讀取字符,printf輸出到字符型輸出設(shè)備。在這里,我選用的字符型輸入設(shè)備是超級終端,通過串口與單片機(jī)連接,輸入字符;輸出設(shè)備是超

硬件介紹:

硬件部分只需字符型輸入輸出設(shè)備:scanf從輸入字符型設(shè)備讀取字符,printf輸出到字符型輸出設(shè)備。在這里,我選用的字符型輸入設(shè)備是超級終端,通過串口與單片機(jī)連接,輸入字符;輸出設(shè)備是超級終端和12864的液晶。scanf從串口讀入字符,printf輸出字符到串口和液晶。


有關(guān)串口的預(yù)提信息參考:MSP430程序庫<二>UART異步串口。


有關(guān)液晶的具體信息參考:MSP430程序庫<三>12864液晶程序庫。


scanf還可以從按鍵讀取信息,可以參考移置方法自行移置。


程序?qū)崿F(xiàn):

printf

單片機(jī)在調(diào)用printf時(shí),printf是負(fù)責(zé)將數(shù)據(jù)解析成ASCII碼流,通過調(diào)用putchar函數(shù)依次將字符發(fā)出。如果在putchar內(nèi)編寫從串口發(fā)送一字節(jié)數(shù)據(jù),則printf的結(jié)果將從單片機(jī)串口發(fā)送出;如果putchar是向液晶寫字符,讓液晶顯示一個(gè)字符,則printf的結(jié)果將顯示在液晶上。本程序?qū)崿F(xiàn)putchar同時(shí)向串口和液晶同時(shí)發(fā)送一個(gè)字符(液晶是顯示一個(gè)字符)。


putchar函數(shù)如下:


int putchar(int ch)

{

putchar2Com(ch);

putchar2Lcd(ch);

return (ch);

}

程序先向串口發(fā)送一個(gè)字符,然后像向晶發(fā)送字符。


其中:putchar2Com,向串口發(fā)送一個(gè)字符,代碼如下:


int putchar2Com(int ch)

{

if (ch == 'n') // 'n'(回車)擴(kuò)展成 'n''r' (回車+換行)

{

UartWriteChar('r') ; //0x0d 換行

}

UartWriteChar(ch); //從串口發(fā)出數(shù)據(jù)

return (ch);

}

代碼僅僅調(diào)用向串口寫字符的函數(shù)UartWriteChar(ch)(詳見Uart.c,在<二>中有介紹),當(dāng)要輸出換行時(shí),需先輸出’n’將光標(biāo)移至本行首位置,還需要’r’(換行)才能將光標(biāo)置于下一行起始位置,即將’n’擴(kuò)展為’r’,’n’兩個(gè)字節(jié)依次發(fā)出。


purchar2Lcd函數(shù)比較復(fù)雜,因?yàn)槲宜褂玫?2864液晶是中文字庫的液晶,每行8個(gè)地址,可以顯示8個(gè)中文字符或16個(gè)英文字符,而putchar只發(fā)出一個(gè)字節(jié),需要判斷每個(gè)地址的前半字還是后半字(因?yàn)槊總€(gè)字可以顯示中文,如果中文的兩個(gè)字節(jié)在相鄰的兩個(gè)地址上,將不會(huì)顯示,或是顯示亂碼)。


上代碼:


int putchar2Lcd(int ch)

{

char addr,dat;

if (ch == 'n') // 'n'(回車),換行

{

ChangeNextRow();

}

else

{

addr = LcdReadAddr();

if(ch < 0x80)

{

LcdWriteData(ch);

}

else

{

LcdWriteData(0x20); //寫入一個(gè)空字符,根據(jù)地址判斷是否為前半字

if(addr == LcdReadAddr()) //前半字 從新寫入ch字符

{

LcdWriteComm(addr);

LcdWriteData(ch);

}

else

{

LcdWriteComm(addr);

dat = LcdReadData();

if(dat < 0x80) //前一個(gè)字符是英文字符

{

LcdWriteData(0x20); //空格

}

LcdWriteData(ch);

}

}

}

if((addr != LcdReadAddr()) && //寫入的是行最后位的后半字則換行

(addr==0x87 || addr==0x97 || addr==0x8F || addr==0x9F))

{

ChangeNextRow();

}

return (ch);

}

這個(gè)函數(shù)首先判斷換行;然后處理其他一般字符,如果是英文字符,不用考慮前后半字,只需正常寫入液晶即可;如果是中文字符,在判斷是否是前半字,前半字則直接寫入,后半字則判斷之前寫入的前半字是否是中文,是則直接寫入,不是則把英文字符移入后半字,然后寫入;最后判斷是否到行尾,是則換行。


程序更新為:更新日期:20110821 18:51

目的是修復(fù)原來,行尾前半字為英文,再輸入中文會(huì)顯示亂碼。

int putchar2Lcd(int ch)

{

char addr,dat;

char changeRowFlag = 0;

if (ch == 'n') // 'n'(回車),換行

{

ChangeNextRow();

changeRowFlag = 1;

}

else if (ch == 'b') // 'b' (退格)

{

BackSpace();

}

else

{

addr = LcdReadAddr();

if(ch < 0x80)

{

LcdWriteData(ch);

}

else

{

LcdWriteData(0x20); //寫入一個(gè)空字符,根據(jù)地址判斷是否為前半字

if(addr == LcdReadAddr()) //前半字 從新寫入ch字符

{

LcdWriteComm(addr);

LcdWriteData(ch);

}

else

{

LcdWriteComm(addr);

dat = LcdReadData();

if(dat < 0x80) //前一個(gè)字符是英文字符

{

LcdWriteData(0x20); //空格

}

if((addr != LcdReadAddr()) && //寫入的是行最后位的后半字則換行

(addr==0x87 || addr==0x97 || addr==0x8F || addr==0x9F))

{

ChangeNextRow();

changeRowFlag = 1;

}

LcdWriteData(ch);

}

}

}

if((addr != LcdReadAddr()) && //寫入的是行最后位的后半字則換行,且未換過行

(changeRowFlag == 0) &&

(addr==0x87 || addr==0x97 || addr==0x8F || addr==0x9F))

{

ChangeNextRow();

}

return (ch);

}

前后半字判斷方法如下:讀液晶地址,向液晶寫入一個(gè)空格,再讀地址,兩地址相同則是前半字,不同則是后半字。讀地址函數(shù)在Lcd12864.c中,新加入函數(shù),代碼如下:


char LcdReadAddr()

{

char ch;

WaitForEnable();

CLR_RS;

SET_RW;

DATA_DIR_IN;

SET_EN;

_NOP();

ch = DATA_IN; //讀數(shù)據(jù)

CLR_EN;

DATA_DIR_OUT;

return (ch|0x80);

}

這個(gè)是讀地址,ch|0x80是因?yàn)閷懭胍壕У刂肥孜粦?yīng)為1.。


液晶中新加入兩個(gè)函數(shù),一個(gè)是上邊的讀地址,另外一個(gè)是讀數(shù)據(jù);作用是讀取液晶當(dāng)前地址處的數(shù)據(jù),從而判斷之前半字是否是中文。代碼如下:


char LcdReadData()

{

char ch;

WaitForEnable();

SET_RS;

SET_RW;

DATA_DIR_IN;

SET_EN;

_NOP();

ch = DATA_IN; //讀數(shù)據(jù)

CLR_EN;

DATA_DIR_OUT;

return ch;

}

另外 putchar還調(diào)用了換行——ChangeNextRow函數(shù),完成液晶輸出換至下一行。


代碼如下:


void ChangeNextRow()

{

char addr;

addr = LcdReadAddr(); //當(dāng)前地址

if(addr <= 0x88)

{

LcdWriteComm(0x90);

}

else if(addr <= 0x90)

{

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

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

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

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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