硬件介紹:
硬件部分只需字符型輸入輸出設備:scanf從輸入字符型設備讀取字符,printf輸出到字符型輸出設備。在這里,我選用的字符型輸入設備是超級終端,通過串口與單片機連接,輸入字符;輸出設備是超級終端和12864的液晶。scanf從串口讀入字符,printf輸出字符到串口和液晶。
有關串口的預提信息參考:MSP430程序庫<二>UART異步串口。
有關液晶的具體信息參考:MSP430程序庫<三>12864液晶程序庫。
scanf還可以從按鍵讀取信息,可以參考移置方法自行移置。
程序實現(xiàn):
printf
單片機在調用printf時,printf是負責將數(shù)據(jù)解析成ASCII碼流,通過調用putchar函數(shù)依次將字符發(fā)出。如果在putchar內編寫從串口發(fā)送一字節(jié)數(shù)據(jù),則printf的結果將從單片機串口發(fā)送出;如果putchar是向液晶寫字符,讓液晶顯示一個字符,則printf的結果將顯示在液晶上。本程序實現(xiàn)putchar同時向串口和液晶同時發(fā)送一個字符(液晶是顯示一個字符)。
putchar函數(shù)如下:
int putchar(int ch)
{
putchar2Com(ch);
putchar2Lcd(ch);
return (ch);
}
程序先向串口發(fā)送一個字符,然后像向晶發(fā)送字符。
其中:putchar2Com,向串口發(fā)送一個字符,代碼如下:
int putchar2Com(int ch)
{
if (ch == '\n') // '\n'(回車)擴展成 '\n''\r' (回車+換行)
{
UartWriteChar('\r') ; //0x0d 換行
}
UartWriteChar(ch); //從串口發(fā)出數(shù)據(jù)
return (ch);
}
代碼僅僅調用向串口寫字符的函數(shù)UartWriteChar(ch)(詳見Uart.c,在<二>中有介紹),當要輸出換行時,需先輸出’\n’將光標移至本行首位置,還需要’\r’(換行)才能將光標置于下一行起始位置,即將’\n’擴展為’\r’,’\n’兩個字節(jié)依次發(fā)出。
purchar2Lcd函數(shù)比較復雜,因為我所使用的12864液晶是中文字庫的液晶,每行8個地址,可以顯示8個中文字符或16個英文字符,而putchar只發(fā)出一個字節(jié),需要判斷每個地址的前半字還是后半字(因為每個字可以顯示中文,如果中文的兩個字節(jié)在相鄰的兩個地址上,將不會顯示,或是顯示亂碼)。
上代碼:
int putchar2Lcd(int ch)
{
char addr,dat;
if (ch == '\n') // '\n'(回車),換行
{
ChangeNextRow();
}
else
{
addr = LcdReadAddr();
if(ch < 0x80)
{
LcdWriteData(ch);
}
else
{
LcdWriteData(0x20); //寫入一個空字符,根據(jù)地址判斷是否為前半字
if(addr == LcdReadAddr()) //前半字 從新寫入ch字符
{
LcdWriteComm(addr);
LcdWriteData(ch);
}
else
{
LcdWriteComm(addr);
dat = LcdReadData();
if(dat < 0x80) //前一個字符是英文字符
{
LcdWriteData(0x20); //空格
}
LcdWriteData(ch);
}
}
}
if((addr != LcdReadAddr()) && //寫入的是行最后位的后半字則換行
(addr==0x87 || addr==0x97 || addr==0x8F || addr==0x9F))
{
ChangeNextRow();
}
return (ch);
}
這個函數(shù)首先判斷換行;然后處理其他一般字符,如果是英文字符,不用考慮前后半字,只需正常寫入液晶即可;如果是中文字符,在判斷是否是前半字,前半字則直接寫入,后半字則判斷之前寫入的前半字是否是中文,是則直接寫入,不是則把英文字符移入后半字,然后寫入;最后判斷是否到行尾,是則換行。
程序更新為:更新日期:20110821 18:51
目的是修復原來,行尾前半字為英文,再輸入中文會顯示亂碼。
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); //寫入一個空字符,根據(jù)地址判斷是否為前半字
if(addr == LcdReadAddr()) //前半字 從新寫入ch字符
{
LcdWriteComm(addr);
LcdWriteData(ch);
}
else
{
LcdWriteComm(addr);
dat = LcdReadData();
if(dat < 0x80) //前一個字符是英文字符
{
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);
}
前后半字判斷方法如下:讀液晶地址,向液晶寫入一個空格,再讀地址,兩地址相同則是前半字,不同則是后半字。讀地址函數(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);
}
這個是讀地址,ch|0x80是因為寫入液晶地址首位應為1.。
液晶中新加入兩個函數(shù),一個是上邊的讀地址,另外一個是讀數(shù)據(jù);作用是讀取液晶當前地址處的數(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還調用了換行——ChangeNextRow函數(shù),完成液晶輸出換至下一行。
代碼如下:
void ChangeNextRow()
{
char addr;
addr = LcdReadAddr(); //當前地址
if(addr <= 0x88)
{
LcdWriteComm(0x90);
}
else if(addr <= 0x90)
{
LcdWriteComm(0x98);
}
else if(addr <= 0x98)
{
LcdWriteComm(0x88);
}
else
{
AddNewline(); //添加行,同時向上滾動
LcdWriteComm(0x98);
}
}
讀取當前地址,判斷在哪一行,然后寫入下一行首地址;如果是最后一行,則所有安徽那個向上移,寫入最后一行首地址。
AddNewLine函數(shù)完成所有行向上滾動一行,然后地址定位至最后一行。
代碼如下:
void AddNewline()
{
char str[17];
str[16] = 0;
//第二行 移至第一行
LcdWriteComm(0x90);
LcdReadData(); //空讀取
for(int i = 0;i<16;i++)
{
str[i] = LcdReadData();
}
LcdWriteString(0x80,str);
//第三行 移至第二行
LcdWriteComm(0x88);
LcdReadData();
for(int i = 0;i<16;i++)
{
str[i] = LcdReadData();
}
LcdWriteString(0x90,str);
//第四行 移至第三行
LcdWriteComm(0x98);
LcdReadData();
for(int i = 0;i<16;i++)
{
str[i] = LcdReadData();
}
LcdWriteString(0x88,str);
//第四行 空白
LcdWriteString(0x98," "); //十六個空格
}
讀出下一行數(shù)據(jù),寫入上一行,最后一行寫入空格即可。
到此putchar函數(shù)全部完成,printf移植的程序部分完成,使用方法詳見使用示例。
scanf
scanf和printf類似,其只負責格式化輸入的字符,字符來源是從getchar函數(shù)獲取;同樣,在使用scanf函數(shù)之前,要針對字符輸入源自行編寫getchar函數(shù)
最簡getchar:
int getchar()
{
return (putchar(UartReadChar()));
}
這是最簡單的getchar函數(shù),直接調用讀取字符函數(shù),輸出并返回。
但是人的輸入過程會偶爾犯錯誤的,為了支持退格鍵等,需要開辟一個緩存區(qū)。
詳細代碼如下:
#define LINE_LENGTH 80 //行緩沖區(qū)大小,決定每行最多輸入的字符數(shù)
/*標準終端設備中,特殊ASCII碼定義,請勿修改*/
#define InBACKSP 0x08 //ASCII <-- (退格鍵)
#define InDELETE 0x7F //ASCII (DEL 鍵)
#define InEOL '\r' //ASCII
#define InSKIP '\3' //ASCII control-C
#define InEOF '\x1A' //ASCII control-Z
#define OutDELETE "\x8 \x8" //VT100 backspace and clear
#define OutSKIP "^C\n" //^C and new line
#define OutEOF "^Z" //^Z and return EOF
int getchar()
{
static char inBuffer[LINE_LENGTH + 2]; //Where to put chars
static char ptr; //Pointer in buffer
char c;
while(1)
{
if(inBuffer[ptr]) //如果緩沖區(qū)有字符
return (inBuffer[ptr++]); //則逐個返回字符
ptr = 0; //直到發(fā)送完畢,緩沖區(qū)指針歸零
while(1) //緩沖區(qū)沒有字符,則等待字符輸入
{
c = UartReadChar(); //等待接收一個字符
if(c == InEOF && !ptr) //==EOF== Ctrl+Z
{ //只有在未入其他字符時才有效
printf(OutEOF); //終端顯示EOF符
return EOF; //返回 EOF(-1)
}
if(c==InDELETE || c==InBACKSP) //==退格或刪除鍵==
{
if(ptr) //緩沖區(qū)有值
{
ptr--; //從緩沖區(qū)移除一個字符
printf(OutDELETE); //同時顯示也刪掉一個字符
}
}
else if(c == InSKIP) //==取消鍵 Ctrl+C ==
{
printf(OutSKIP); //終端顯示跳至下一行
ptr = LINE_LENGTH + 1; //==0 結束符==
break;
}
else if(c == InEOL) //== '\r' 回車==
{
putchar(inBuffer[ptr++] = '\n');//終端換行
inBuffer[ptr] = 0; //末尾添加結束符(NULL)
ptr = 0; //指針清空
break;
}
else if(ptr < LINE_LENGTH) //== 正常字符 ==
{
if(c >= ' ') //刪除 0x20以下字符
{
//存入緩沖區(qū)
putchar(inBuffer[ptr++] = c);
}
}
else //緩沖區(qū)已滿
{
putchar('\7'); //== 0x07 蜂鳴符,PC回響一聲
}
}
}
}
注釋已經(jīng)很詳細了,這里不再詳細解釋。
scanf的移植程序部分已經(jīng)完成,如果需要從鍵盤讀入字符,可以仿照上述函數(shù)寫getchar函數(shù)。具體使用和設置見使用示例。
另外,iar的安裝文件夾下,430文件夾下有一個src文件夾,lib/clib文件夾下(我的具體文件夾是:D:\Program Files\IAR Systems\Embedded Workbench 6.0 Evaluation\430\src\lib\clib\getchar.c),有一個getchar.c文件,這是getchar的函數(shù),內容如下:
#include "stdio.h"
extern char _low_level_get(void); /* Read one char from I/O */
/* Should be supplied by user */
static void put_message(char *s)
{
while (*s)
putchar(*s++);
}
#define LINE_LENGTH 80 /* Change if you need */
#define In_DELETE 0x7F /* ASCII */
#define In_EOL '\r' /* ASCII
#define In_SKIP '\3' /* ASCII control-C */
#define In_EOF '\x1A' /* ASCII control-Z */
#define Out_DELETE "\x8 \x8" /* VT100 backspace and clear */
#define Out_SKIP "^C\n" /* ^C and new line */
#define Out_EOF "^Z" /* ^Z and return EOF */
int getchar(void)
{
static char io_buffer[LINE_LENGTH + 2]; /* Where to put chars */
static int ptr; /* Pointer in buffer */
char c;
for (;;)
{
if (io_buffer[ptr])
return (io_buffer[ptr++]);
ptr = 0;
for (;;)
{
if ((c = _low_level_get()) == In_EOF && !ptr)
{
put_message(Out_EOF);
return EOF;
}
if (c == In_DELETE)
{
if (ptr)
{
ptr--;
put_message(Out_DELETE);
}
}
else if (c == In_SKIP)
{
put_message(Out_SKIP);
ptr = LINE_LENGTH + 1; /* Where there always is a zero... */
break;
}
else if (c == In_EOL)
{
putchar(io_buffer[ptr++] = '\n');
io_buffer[ptr] = 0;
ptr = 0;
break;
}
else if (ptr < LINE_LENGTH)
{
if (c >= ' ')
{
putchar(io_buffer[ptr++] = c);
}
}
else
{
putchar('\7');
}
}
}
}
_low_level_get(void); 這個函數(shù)需用戶定義,不過這個getchar函數(shù)不支持退格鍵,可以更改以支持;_low_level_get(void);這個函數(shù)可以直接調用UartReadChar();這個函數(shù),使用時,把getchar.c加入項目,同時在項目中添加_low_level_get(void);函數(shù),函數(shù)體只有一句:return UartReadChar();即可。
程序調用示例:
程序使用方式,項目中添加printf.c文件和scanf.c文件(用printf函數(shù)則加printf.c文件,用scanf函數(shù)就添加scanf.c文件),在要使用函數(shù)的地方包含stdio.h(編譯器自帶庫——標準輸入輸出庫)
還要設置使用庫和printf的大小:
如果不進行這項設置,使用scanf時將報錯:
Error[e27]: Entry "getchar" in module Scanf ( G:\work\程序庫\Printf\Debug\Obj\Scanf.r43 ) redefined in module ?getchar ( D:\Program Files\IAR Systems\Embedded;用的是C語言,這里選擇CLIB。
然后設置庫選項:
這里選擇大尺寸,目的是支持所有的格式,因為所用單片機有64kb的程序存儲空間,足夠使用,如果程序存儲空間不夠大,推薦選擇中尺寸或小尺寸。大尺寸printf占用空間 4.8kb、scanf :2.3kb,中尺寸 printf:2.5kb、scanf:1.6kb,小尺寸 printf:1.6kb。實際使用時根據(jù)需要進行選擇。
同時要加入Lcd12864的使用(c文件,h文件(要調用lcd12864的初始化函數(shù)))Uart和液晶一樣要調用初始化函數(shù)。
#include
#include
#include "Uart.h"
#include "Lcd12864.h"
頭文件包含。
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
ClkInit();
LcdInit();
UartInit(38400,'n',8,1);//串口初始化,設置成38400bps,無校驗,8位數(shù)據(jù),1位停止
//int a;
_EINT();
//scanf("%d",&a);
//printf("劉中原%d\n",a);
printf("劉中原%f\n",23.6);
printf("劉中原%1.2f\n",23.6);
}
使用時,先調用液晶和串口的初始化函數(shù),然后開中斷;就可以正常的調用scanf和printf函數(shù)了。
至此,printf和scanf的移植全部完成,使用這兩個函數(shù)將給單片機的輸入輸出帶來極大方便。另外,Lcd12864的液晶使用是4行顯示,空間較小,可能需要定位至具體位置,以使界面看起來更合理,為此,在Printf中再添加一個定位函數(shù)(GotoXY):
void GotoXY(char x,char y)
{
char addr;
if(y==0)
{
addr = 0x80 + x / 2;
}
else if(y==1)
{
addr = 0x90 + x / 2;
}
else if(y==2)
{
addr = 0x88 + x / 2;
}
else
{
addr = 0x98 + x / 2;
}
LcdWriteComm(addr);
if(x % 2) //是奇數(shù),后移一位(寫入空格)
{
LcdWriteData(0x20);
}
}
這樣就方便了液晶程序的編寫。
又加入一個函數(shù),在printf.c里,目的是支持退格鍵,內容如下:
void BackSpace()
{
char addr,dat;
addr = LcdReadAddr(); //當前地址
LcdWriteData(0x20); //寫入一個空字符,根據(jù)地址判斷是否為前半字
if(addr == LcdReadAddr()) //前半字
{
if(addr == 0x80)
return;
else if(addr == 0x90)
addr = 0x87;
else if(addr == 0x88)
addr = 0x97;
else if(addr == 0x98)
addr = 0x8F;
else
addr = addr - 1;
LcdWriteComm(addr);
LcdReadData(); //空讀取
dat = LcdReadData();
LcdWriteComm(addr);
if(dat < 0x80)
LcdWriteData(dat);
}
else
{
LcdWriteComm(addr);
}
}
上一篇:MSP430 SPI總線詳解
下一篇:MSP430 ADC12采樣轉換模式詳解
推薦閱讀
史海拾趣
安國國際在創(chuàng)立初期便展現(xiàn)出強大的研發(fā)實力。1997年,公司成功推出了世界第一顆單一整合的USB鍵盤集線器控制IC,這一創(chuàng)新成果奠定了安國在IC專業(yè)設計領域的領導地位。隨后,在1998年,安國將總部遷往臺灣,以便為全球客戶提供更及時的技術支持和服務,同時與晶圓代工廠緊密配合,確保產品質量和技術水平。
Fascomp公司起源于一間小型的電子產品研發(fā)工作室。創(chuàng)始人李明和他的團隊在資金緊張、技術條件有限的情況下,堅持自主研發(fā)一款高性能的芯片。經(jīng)過無數(shù)次的失敗和試驗,他們最終成功開發(fā)出了一款具有競爭力的芯片,贏得了市場的初步認可。這個過程中,團隊成員的堅持和對技術的執(zhí)著追求成為了公司后續(xù)發(fā)展的基石。
APSA公司在創(chuàng)業(yè)初期,專注于電子行業(yè)中某一特定領域的技術研發(fā)。通過團隊的不懈努力和持續(xù)創(chuàng)新,公司成功開發(fā)出一款具有競爭力的產品,填補了市場空白。這一技術突破不僅為APSA公司贏得了首批客戶,也為公司的后續(xù)發(fā)展奠定了堅實的基礎。
面對日益嚴峻的環(huán)境問題和可持續(xù)發(fā)展的挑戰(zhàn),BERGQUIST公司始終堅持綠色發(fā)展的理念。公司不斷投入研發(fā)力量,開發(fā)環(huán)保型熱管理材料和生產工藝。同時,公司還積極推廣節(jié)能減排技術,努力降低生產過程中的能耗和排放。這些舉措不僅符合社會發(fā)展趨勢,也為公司的可持續(xù)發(fā)展提供了有力保障。
這五個故事從不同角度展示了BERGQUIST公司在電子行業(yè)中的發(fā)展歷程和成就,體現(xiàn)了公司不斷創(chuàng)新、追求卓越的精神。這些事實性的描述旨在客觀呈現(xiàn)BERGQUIST公司的歷史與現(xiàn)狀,不含任何褒貶之意。
隨著環(huán)保意識的日益增強,Axiohm公司積極響應國家綠色發(fā)展的號召,將環(huán)保理念融入產品設計和生產過程中。公司投入大量資金研發(fā)環(huán)保材料和生產工藝,成功推出了一系列綠色電子產品。這些產品不僅符合環(huán)保標準,還具有良好的性能價格比,受到了消費者的廣泛好評。Axiohm因此贏得了業(yè)界的贊譽和政府的支持。
隨著環(huán)保意識的日益增強,Axiohm公司積極響應國家綠色發(fā)展的號召,將環(huán)保理念融入產品設計和生產過程中。公司投入大量資金研發(fā)環(huán)保材料和生產工藝,成功推出了一系列綠色電子產品。這些產品不僅符合環(huán)保標準,還具有良好的性能價格比,受到了消費者的廣泛好評。Axiohm因此贏得了業(yè)界的贊譽和政府的支持。
本文結合復費率電能表中紅外通信的設計實從事貿易,介紹了單片機系統(tǒng)中紅外通信的軟硬件設計方法,并給出了具體的電路原理和通信源程序。… 查看全部問答∨ |
|
DSP Group and Lantiq Complete Interoperability Testing DSP Group and Lantiq Complete Interoperability Testing for Home Gateways and Digital Cordless Handsets DSP Group, Inc™, a leading global provider of wireless chipset solutions for converged communication ...… 查看全部問答∨ |
|
我的硬件是PXA270 通過16位數(shù)據(jù)總線連接到64MBYTE的FLASH P33,地址總線是26位 p33是由兩塊32M的flash組成的,在程序中不能同時訪問上下兩塊FLASH的地址 而是需要有一個地址總線,即最高位的A25作為內部片選,選擇當前訪問的是BOTTOM 還是top flas ...… 查看全部問答∨ |
幾個月前新買電腦總是無故死機,請教高手? 相關癥狀如下: 1.畫面定格,除非重啟或關機,其它一切操作均無效,沒有一點反應。 2.玩反恐等游戲時死機頻率大約一個半小時一次;放電影大約四小時一次。第一次開機到死 ...… 查看全部問答∨ |
采用TI C2000開發(fā)的太陽能逆變器(一)-TI技術研討會 基于 C2000 和 Piccolo MCU的新型太陽能套件,助力打造更環(huán)保世界。該新型太陽能套件為可再生能源市場提供先進外設、針對應用的開發(fā)硬件、原理圖 (schematics)、全面豐富的軟件算法庫和業(yè)界領先的開發(fā)環(huán)境,使設計人員能簡易地開發(fā)太陽能逆變器設計 ...… 查看全部問答∨ |
前文提到,對希望對 電纜損耗進行補償?shù)墓こ處煟麄冊跍y量和表征同軸電纜的時,可能選擇不同方法。到目前為止,這些方法包括矢量網(wǎng)絡分析儀(VNA)、時域反射計 (TDR)、以及仿真工具(如 ADS之類的),方法各異,但共同點都是得到電纜的S參數(shù) ...… 查看全部問答∨ |
AD采集的數(shù)據(jù)通過FPGA控制SRAM存儲后再由PCI傳輸?shù)缴衔粰C,16K數(shù)據(jù)長度,但是采集上來的數(shù)據(jù)幅度不一致,請問是怎么回事?… 查看全部問答∨ |
這是本人在淘寶上購得的FPGA開發(fā)板的地址,http://item.taobao.com/item.htm?spm=a230r.1.10.12.XBn1Ov&id=13851235569,內有詳細內容,可供大家了解,由于個人原因,買后一直沒用過,可以說是全新的,現(xiàn)在要畢業(yè)實習離校了,想低價出售,個人的理 ...… 查看全部問答∨ |
設計資源 培訓 開發(fā)板 精華推薦
- Microchip 升級數(shù)字信號控制器(DSC)產品線 推出PWM 分辨率和 ADC 速度業(yè)界領先的新器件
- 意法半導體STM32MP23x:突破成本限制的工業(yè)AI應用核心
- 意法半導體推出用于匹配遠距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設置字重-ESP32篇
- 使用樹莓派進行 ESP32 Jtag 調試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- 480Wh/kg!湖南久森半固態(tài)金屬鋰負極電池即將量產
- 中國首條硫化物固體電解質量產線正式落地
- QUT開發(fā)出新的LENS系統(tǒng) 可以讓機器人進行類似大腦的導航
- 毫米波雷達裝機量分析:毫米波雷達裝車量持續(xù)攀升,大陸和博世占據(jù)60%以上市場份額
- TDK推出適用于車載濾波器的同軸電纜供電電感器
- 大摩給“人形機器人100”清單注入新思路
- 行家預判:2025年車載Mini LED反超OLED
- 2025數(shù)智未來峰會:深度解讀AI賦能工業(yè)的趨勢與實踐
- 工業(yè)自動化中的Raspberry Pi:簡化經(jīng)濟實惠的邊緣計算
- 意法半導體宣布擴大在新加坡的“Lab-in-Fab”廠內實驗室合作項目
- 缺芯重壓下Mate斷更,華為未來路究竟在何方?
- 藍牙m(xù)esh網(wǎng)絡——商業(yè)互聯(lián)照明系統(tǒng)的首選技術
- 數(shù)據(jù)顯示2020年全球汽車顯示屏出貨量達1.27億片
- 過高的汽車零整比背后,汽車市場正悄然上演漲價潮
- 鋰離子電池原材料漲價背后的原因
- STM8S003F使用IO口模擬串口(二)接收數(shù)據(jù)
- 【嵌入式開發(fā)】STM8S103F3P6單線半雙工串口通信
- STM8S003F使用IO口模擬串口(三)使用中斷方式發(fā)送和接收數(shù)據(jù)
- 軟件模擬串行通信——UART協(xié)議實現(xiàn)
- STM8 IO口模擬串口通信