鄧高旭,鄧琛,王一鳴
(上海工程技術(shù)大學(xué) 電子與電氣工程學(xué)院,上海201620)
?
藍(lán)牙通信中的漢字編碼研究與字符點(diǎn)陣顯示
鄧高旭,鄧琛,王一鳴
(上海工程技術(shù)大學(xué) 電子與電氣工程學(xué)院,上海201620)
單片機(jī)的I/O端口控制特性主要是通過對二進(jìn)制碼的控制來實(shí)現(xiàn)對I/O端口的電平高低特性的八字節(jié)的輸入和輸出,傳輸?shù)臄?shù)據(jù)通常為單字節(jié)的數(shù)字和英文字符。本文基于Android智能手機(jī)的藍(lán)牙控制APP與單片機(jī)藍(lán)牙模塊的通信,主要針對由兩個(gè)字節(jié)組成的漢字的單發(fā)、多發(fā)和通信編碼問題進(jìn)行了研究,實(shí)現(xiàn)了漢字在點(diǎn)陣上的顯示。
藍(lán)牙4.0通信;Android APP;MCU;漢字編碼;點(diǎn)陣
隨著視頻控制領(lǐng)域擴(kuò)展、圖像處理的發(fā)展、光纖技術(shù)的應(yīng)用[1],已經(jīng)研發(fā)出了全彩顯示屏,尤其應(yīng)用于體育場館、會(huì)展中心等大型場所。通常要修改這些顯示的內(nèi)容,必須在上位機(jī)進(jìn)行修改,為了方便文字的修改和操作,實(shí)現(xiàn)動(dòng)態(tài)顯示漢字,本文在實(shí)現(xiàn)算法上對漢字的編碼進(jìn)行研究,并設(shè)計(jì)手機(jī)APP通過藍(lán)牙顯示屏進(jìn)行操作。
藍(lán)牙采用串行通信協(xié)議,單片機(jī)的通信方式也是串口數(shù)據(jù)傳輸,所以可以很好地將藍(lán)牙模塊應(yīng)用到單片機(jī)上,串行通信是基于幀的協(xié)議,串行口發(fā)送信號時(shí),信號是一幀一幀發(fā)送的,通信鏈路[2]中所有的內(nèi)容都將包含在這樣的一個(gè)幀中,信號幀的格式如下所示:

幀 首設(shè)備地址幀類型功能代碼數(shù)據(jù)長度數(shù)據(jù)校驗(yàn)碼幀尾1Byte1Byte1Byte1Byte1Byte不確定1Byte1Byte
幀中包含了多個(gè)信號數(shù)據(jù)部分,包括幀首、設(shè)備地址、幀類型、功能代碼、數(shù)據(jù)長度、數(shù)據(jù)校驗(yàn)碼以及幀尾,串口通信的幀數(shù)據(jù)傳遞保證了通信的可靠和安全。
藍(lán)牙串行通信的軟件實(shí)現(xiàn)如下:
void init(); //藍(lán)牙串口初始化函數(shù)
void send(unsigned char a); //單字節(jié)發(fā)送函數(shù)
void ctrl(); //接收處理函數(shù)[3]
Android APP控制點(diǎn)陣漢字顯示的軟件框圖如圖1所示。

圖1 軟件框圖
由于CPU和MCU都是以二進(jìn)制的形式進(jìn)行運(yùn)算和處理的,對于數(shù)字、英文字母和一些特殊字符都有相應(yīng)的ASCII碼對應(yīng),這樣使得程序員可以和計(jì)算機(jī)進(jìn)行方便的交流,使得機(jī)器語言和人類語言聯(lián)系了起來,而且由于計(jì)算機(jī)在中國普及較晚,漢字復(fù)雜且數(shù)量多,不可能直接進(jìn)行ASCII碼編碼[4],GB2312碼編碼方式很好地解決了漢字與計(jì)算機(jī)語言的轉(zhuǎn)化。GB2312碼是一種以矩陣的形式從字母A到Z對中國常用的漢字進(jìn)行了排序,行和列分別代表漢字GB2312碼的高字節(jié)和低字節(jié),GB2312碼也稱為漢字的機(jī)內(nèi)碼,GB2312碼的編碼表B部分如表1所列。

表1 GB2312編碼表B部分
通過PC串口助手,將手機(jī)APP發(fā)送端發(fā)送的漢字的轉(zhuǎn)化碼以十六進(jìn)制形式顯示了出來,比如“啊”字,顯示的十六進(jìn)制為0xB0、0xA1,與GB2312碼編碼表中漢字編碼矩陣的“啊”字的編碼0xB0A1的高8位字節(jié)和低8位字節(jié)對應(yīng)。
Android手機(jī)的APP通過藍(lán)牙和單片機(jī)的藍(lán)牙模塊[5]進(jìn)行通信,方式均為串口通信,通信協(xié)議主要通過軟件編程來搭建。
對于單片機(jī)和計(jì)算機(jī),要使用這些漢字的編碼,該漢字的矩陣碼就構(gòu)成了一個(gè)漢字字庫,并將其封裝在芯片中,使用者只需要在字庫里調(diào)用該漢字字庫芯片的對應(yīng)編碼即可。
字庫芯片采用的是GT21L系列芯片,字庫芯片讀取函數(shù)會(huì)將傳進(jìn)去的兩個(gè)字節(jié)逐個(gè)讀取并尋找漢字所在的矩陣的位置[6],然后返回漢字字模的首地址,通過字模讀取函數(shù)將字模逐個(gè)讀取并存放到字模數(shù)組中,單片機(jī)對字庫芯片讀取的軟件實(shí)現(xiàn)為:
(1) 向GT21L系列芯片送一個(gè)字節(jié)數(shù)據(jù)
void Send_Byte(unsigned char out){
unsigned char i=0;
for (i = 0; i < 8; i++){
if ((out & 0x80) == 0x80)
SPID_H();
else
SPID_L();
SPICLK_L();
out = (out << 1);
SPICLK_H();
}
}
(2) 從GT21L系列芯片得到一個(gè)字節(jié)數(shù)據(jù)
unsigned char Get_Byte(){
unsigned char i = 0, in = 0, temp = 0;
for (i = 0; i < 8; i++){
SPICLK_L();
in = (in << 1);
SPICLK_H();
temp = SPID_DO;
if (temp == 1)
in = in | 0x01;
}
return in;
}
(3) 快速從GT21L系列芯片讀出所要的漢字點(diǎn)陣數(shù)據(jù)存于數(shù)組upperfont_32void HighSpeed_Read_Cont(unsigned long Dst,unsigned long no_bytes){
unsigned long i = 0;
unsigned long j = 0;
SPICS_L();
Send_Byte(0x0B);
Send_Byte(((Dst & 0xFFFFFF) >> 16));
Send_Byte(((Dst & 0xFFFF) >> 8));
Send_Byte(Dst & 0xFF);
Send_Byte(0xFF);
for (i = 0; i < no_bytes; i++){
upperfont_32[i] = Get_Byte();
}
SPICS_H();
for(j = 0; j < no_bytes; j++){
rev_font[j] = reverse(upperfont_32[j]);
}
}
這時(shí)數(shù)組里存放的數(shù)據(jù)就是根據(jù)一個(gè)漢字的GB2312碼所讀取的字庫芯片里的漢字點(diǎn)陣字模編碼。

圖2 藍(lán)牙APP用戶界面圖
Android 是基于Linux內(nèi)核的軟件平臺操作系統(tǒng),包括操作系統(tǒng)、用戶界面和應(yīng)用程序,用戶界面主要由控件實(shí)現(xiàn),也可以直接在xml腳本文件中實(shí)現(xiàn);應(yīng)用程序主要由Java編寫,開發(fā)環(huán)境為eclipse,主要實(shí)現(xiàn)的功能有藍(lán)牙的通信連接;APP用戶界面,主要使用包編程方式[7],藍(lán)牙的通信主要使用到了Android BluetoothDevice 包和BluetoothAdapter 包,如圖2所示。界面包括顯示所有被搜索到的藍(lán)牙用戶的列表界面和控制功能界面,在藍(lán)牙配對后由用戶列表界面轉(zhuǎn)入到功能界面,與單片機(jī)藍(lán)牙模塊通信的關(guān)鍵程序?yàn)?
//獲取本機(jī)的藍(lán)牙適配器
mBtAdapter = BluetoothAdapter.getDefaultAdapter();
//獲取當(dāng)前所打開的藍(lán)牙設(shè)備
Set
//如果得到藍(lán)牙設(shè)備的連接狀態(tài)時(shí),啟動(dòng)藍(lán)牙的數(shù)據(jù)發(fā)送和接
//收服務(wù)if (mChatService.getState() == BluetoothChatService.STATE_NONE)
ChatService.start();
//初始化內(nèi)容發(fā)送按鈕
mSendButton = (Button) findViewById(R.id.button_send);
mSendButton.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
//在內(nèi)容編輯控件里編輯發(fā)送內(nèi)容
TextView view = (TextView) findViewById(R.id.edit_text_out);
String message = view.getText().toString();
sendMessage(message);
}
};
Android手機(jī)APP使用的是藍(lán)牙串口,可以直接搜索單片機(jī)的藍(lán)牙并進(jìn)行配對,配對后由APP發(fā)送漢字GB2312碼到單片機(jī),單片機(jī)會(huì)連續(xù)接收兩個(gè)字節(jié)并保存到數(shù)組里,由于單片機(jī)的串口協(xié)議是單字節(jié)接收[8]的,所以直接利用串口協(xié)議不能實(shí)現(xiàn)兩個(gè)字節(jié)的接收,這時(shí)就需要用到單片機(jī)的串口中斷,手機(jī)APP每發(fā)送一個(gè)漢字就觸發(fā)一次單片機(jī)串口中斷,通過對串口控制寄存器和配置寄存器進(jìn)行配置,并設(shè)置串口中斷標(biāo)志位,因此單片機(jī)只有接收到一個(gè)漢字后才會(huì)觸發(fā)一次串口中斷,然后先將一個(gè)字節(jié)的數(shù)據(jù)存放在緩存寄存器SBUF里,只要中斷標(biāo)志位沒有改變,就默認(rèn)是一個(gè)漢字字節(jié)的接收,然后連續(xù)分兩次存放在數(shù)組里。單片機(jī)的串口中斷讀取兩個(gè)字節(jié)的軟件實(shí)現(xiàn)函數(shù)為:
void read_mess(void) interrupt 4{
if(RI==1){
uchar tmp;
tmp =SBUF;
a[flag]=tmp;
if(flag==1){
flag=0;
}
flag++;
RI=0;
}
}
16×16的點(diǎn)陣正好只能一次顯示一個(gè)漢字,所以在多漢字發(fā)送時(shí),單片機(jī)只能對第一個(gè)漢字進(jìn)行處理,其他漢字都會(huì)被忽略。如果想要顯示多漢字,則必須將多個(gè)16×16點(diǎn)陣進(jìn)行串聯(lián),然后只要改變點(diǎn)陣的列控制程序即可。
16×16點(diǎn)陣是由4個(gè)8×8的點(diǎn)陣組成[9],分別由芯片控制行和列,可以完全與字庫芯片中讀取的十六進(jìn)制的字模相對應(yīng),字模的一位對應(yīng)點(diǎn)陣的每一個(gè)LED,先發(fā)送行信號,然后發(fā)送列信號,再送第二行的字模和選通信號[10],這樣循環(huán)掃描8次,行控制和列控制的點(diǎn)陣就會(huì)顯示漢字。只要控制循環(huán)的次數(shù)就可以使點(diǎn)陣的顯示不會(huì)有視覺暫留的效果,直到接收到下一個(gè)漢字,數(shù)組中的漢字字模[11]才會(huì)發(fā)生變化,點(diǎn)陣才會(huì)顯示下一個(gè)漢字。單片機(jī)對點(diǎn)陣行控制和列控制的軟件實(shí)現(xiàn)為:
void SendSer(unsigned char dat1,unsigned char dat2){
//列控制函數(shù)
SendByte(dat1);
SendByte(dat2);
LATCH=1;
_nop_();
LATCH=0;
}
void SendSeg(unsigned int a){
//行控制函數(shù)
SendByte1(a>>8);
SendByte1(a);
LATCH_B=1;
_nop_();
LATCH_B=0;
}

[1] 潘矜矜.一種LED點(diǎn)陣漢字顯示屏的制作[J].福建電腦,2006(3).
Chinese Character Coding and Dot Matrix Display of Bluetooth Communication
Deng Gaoxu,Deng Chen,Wang Yiming
(School of Electronic and Electrical Engineering,Shanghai University of Engineering Science,Shanghai 201620,China)
The I/O port control features of the MCU are realized through the control of the binary code to realize the input and output of the I/O ports,the data transfered is usually a single-byte and english characters.In the paper,based on the Android smartphone bluetooth control APP and the single-chip microcomputer communication,the problems that the single and multiple and communication coding of the characters are researched which are consist of two byters. The display of Chinese characters on the dot matrix is realized.
Bluetooth4.0 communication;Android APP;MCU;Chinese code;dot matrix
TP391.9
A