3.2 STDIO.H:一般I/O函數(shù)
C51編譯器包含字符I/O函數(shù),它們通過處理器的串行接口操作,為支持其它I/O機制,只需修改getkey()和putchar()函數(shù),其它所有I/O支持函數(shù)依賴這兩個模塊,不需要改動。在使用8051串行口之前,必須將它們初始化,下例以2400波特率,12MHz初始化串口:
SCON=0x52
TMOD=0x20
TR1=1
TH1=0Xf3
其它工作模式和波特率等細節(jié)問題可以從8051用戶手冊中得到。
函數(shù)名: _getkey
原 型: extern char _getkey();
功 能: _getkey()從8051串口讀入一個字符,然后等待字符輸入,這個函數(shù)是改變整個
輸入端口機制應作修改的唯一一個函數(shù)。
函數(shù)名: getchar
原 型: extern char _getchar();
功 能: getchar()使用_getkey從串口讀入字符,除了讀入的字符馬上傳給putchar函數(shù)
以作響應外,與_getkey相同。
函數(shù)名: gets
原 型: extern char *gets(char *s,int n);
功能:該函數(shù)通過getchar從控制臺設備讀入一個字符送入由‘s’指向的數(shù)據(jù)組???/p>
慮到ANSI標準的建議,限制每次調用時能讀入的最大字符數(shù),函數(shù)提供了一個字符計數(shù)器‘n’,在所有情況下,當檢測到換行符時,放棄字符輸入。
函數(shù)名: ungetchar
原 型: extern char ungetchar(char);
功 能: ungetchar將輸入字符推回輸入緩沖區(qū),因此下次gets或getchar可用該字符。
ungetchar成功時返回‘char’,失敗時返回EOF,不可能用ungetchar處理多個字符。
函數(shù)名: _ungetchar
原 型: extern char _ungetchar(char);
功 能: _ungetchar將傳入字符送回輸入緩沖區(qū)并將其值返回給調用者,下次使用getkey
時可獲得該字符,寫回多個字符是不可能的。
函數(shù)名: putchar
原 型: extern putchar(char);
功 能: putchar通過8051串口輸出‘char’,和函數(shù)getkey一樣,putchar是改變整個
輸出機制所需修改的唯一一個函數(shù)。
函數(shù)名: printf
原 型: extern int printf(const char*,…);
功 能: printf以一定格式通過8051串口輸出數(shù)值和串,返回值為實際輸出的字符數(shù),
參量可以是指針、字符或數(shù)值,第一個參量是格式串指針。
注:允許作為printf參量的總字節(jié)數(shù)由C51庫限制,因為8051結構上存貯空間有限,在SMALL和COMPACT模式下,最大可傳遞15個字節(jié)的參數(shù)(即5個指針,或1個指針和3個長字節(jié)),在LARGE模式下,至多可傳遞40個字節(jié)的參數(shù)。格式控制串包含下列域(方括號內的域是可能的):
%[flags][width][.precision]type
“width”域定義了參量欲顯示的字符數(shù),它必須是一個十進制數(shù),如果實際顯示的字符數(shù)小于“width”,輸出左端補以空格,如果“width”域以0開始,則左端補0。
“flag”域用來定義下面選項:
Falg
意 義
-
輸出左齊
+
輸出值如果是有符號數(shù)值,則加上+/-號
‘ ‘(空格)
輸出值如果為正則左邊補以空格顯示
#
如果它與0,x或X聯(lián)用,則在輸出前加上字符0、0x,0X。當與值類型g、G、f、e、E聯(lián)用時,‘#’使輸出數(shù)產(chǎn)生一個十進制小數(shù)點。
b,B
它們與格式類型d、i、o、u、x、X聯(lián)用,這樣參量類型被接受為‘[unsigned]char’,如:%bu,%bd或%bx。
L,L
它們與格式類型d、i、o、u、x、X聯(lián)用,這樣參量類型被接受為‘[unsigned]long’,如:%lu,%ld或%lx。
*
下一個參量不作輸出。
“type“域定義參量如下類型:
字 符
類 型
輸 出 格 式
d
int
有符號十進制數(shù)(16位)
U
int
無符號十進制數(shù)
o
int
無符號八進制數(shù)
X,x
int
無符號十六進制數(shù)
f
float
[-]dddd.dddd形式的浮點數(shù)
e,E
float
[-]d.ddddE[sign]dd形式的浮點數(shù)
g,G
float
e或f形式浮點數(shù),看哪一種輸出形式好。
c
char
字符
s
pointer
指向一個帶結束符號的串
p
pointer
帶存貯器指示符和偏移的指針。M:aaaa。
M:=C(ode),D(ata),I(data),P(data) aaaa:指針偏移值。
例子:
printf(“Int-Val%d,Char-Val%bd,Long-Val%d”,I,c,l);
printf(“String%s,Character%c”,array,character);
printf(“Pointer%p”,&array[10]);
函數(shù)名: sprintf
原 型: extern int sprintf(char *s,const char*,…);
功 能: sprintf與printf相似,但輸出不顯示在控制臺上,而是通過一個指針S,送入
可尋址的緩沖區(qū)。
注:sprintf允許輸出的參量總字節(jié)數(shù)與printf完全相同。
函數(shù)名: puts
原 型: extern int puts(const char*,…);
功 能: puts將串‘s’和換行符寫入控制臺設備,錯誤時返回EOF,否則返回一非負數(shù)。
函數(shù)名: scanf
原 型: extern int scanf(const char*,…);
功 能: scanf在格式串控制下,利用getcha函數(shù)由控制臺讀入數(shù)據(jù),每遇到一個值(符
號格式串規(guī)定),就將它按順序賦給每個參量,注意每個參量必須都是指針。scanf返回它所發(fā)現(xiàn)并轉換的輸入項數(shù)。若遇到錯誤返回EOF。格式串包括:
l 空格、制表符等,這些空白字符被忽略。
l 字符,除需匹配的“%”(格式控制字符)外。
l 轉換指定字符“%”,后隨幾個可選字符;賦值抑制符“*”,一個指定最大域寬的數(shù)。
注:scanf參量允許的總字節(jié)數(shù)與printf相同,格式控制串可包括下列域(方括號內是可選的):
%[flags][width]type
格式串總是以百分號開始,每個域包含一個或多個字符或數(shù)。
“width”域定義了參量可接受的字符數(shù),“width”必須是一個正十進制數(shù)。如果實際輸入字符數(shù)量小于“width”,則不會進行填充。
‘flag’域用來定義下面選項:
Flag
意 義
*
輸入被忽略
b,h
它們用作格式類型d,i,o,u和x的前綴,用這些變量可定義參量是字符指針還是無符號字符指針。如%bu,%bd,%bx。
L
它們被作格式類型d,i,o,u和x的前綴,使用這個前綴可定義參量是長指針還是無符號字長指針。如%lu,%ld,%lx。
“type”域定義參量為如下類型:
描 述 符
類 型
輸 入 格 式
d
ptr to int
有符號十進制數(shù)(16位)
i
ptr to int
如C中記號一樣,整型值
u
ptr to int
無符號十進制數(shù)
o
ptr to int
無符號八進制數(shù)
x
ptr to int
無符號十六進制數(shù)
f,e,g
ptr to float
浮點數(shù)
c
ptr to char
一個字符
s
ptr to string
一個字串
例子:
scanf(“%d%bd%ld”,&i,&c,&l);
scanf(“%f”,&f);
scanf(“%3s,%c”,&string[0],&character);
函數(shù)名: sscanf
原 型: extern int sscanf(const *s,const char*,…);
功 能: sscanf與scanf方式相似,但串輸入不是通過控制臺,而是通過另一個以空結束
的指針。
注:sscanf參量允許的總字節(jié)數(shù)由C-51庫限制,這是因為8051處理器結構內存的限制,在SMALL和COMPACT模式,最大允許15字節(jié)參數(shù)(即至多5個指針,或2個指針,2個長整型或1個字符型)的傳遞。在LARGE模式下,最大允許傳送40個字節(jié)的參數(shù)。