常用函数

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

運算結果 hex=0xFFFF
7
5.4 16进转ASCII码函数
16进转ASCII码函数
程式範例如 ch5-4.c,傳入函數中的引數 hex 為 4 位數的 16 進制數值,經函數轉 換之後將被儲存於陣列 asc[]中。
hex2asc 程式
void hex2asc(unsigned int hex) { int i; asc[0]=((hex>>12)&0xf)+0x30; asc[1]=((hex>>8)&0xf)+0x30; asc[2]=((hex>>4)&0xf)+0x30; asc[3]=(hex&0xf)+0x30; for(i=0;i<4;i++) if(asc[i]>0x39) asc[i]+=7; }
12
5.6 BCD码转七段显示码函数
表5-1 BCD 碼 10 進
0 1 2 3 4 5 6 7 8 9
BCD 碼轉共陽極七段顯示碼 七段顯示碼
2進
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001
dp
1 1 1 1 1 1 1 1 1 1
g
1 1 0 0 0 0 0 1 0 0
運算結果 LED 閃爍
3
5.2 16进转10进函数
16进转10进函数
程式範例如 ch5-2.c,傳入函數中的引數 hex 為 16 進值,因為 16 位元無號數範圍 為 0~65535,所以轉換成 10 進值後必須以 5 個位元組 bcd[5]陣列來存放。例如傳 入函數中的 16 進制數值 hex=0xFFFF,經函數轉換之後,其 10 進制數值為 65535, 依序儲存於 bcd 陣列中。
程式範例:ch5-4.c
#include "reg51.h" unsigned int asc[4]={0,0,0,0}; main() { void hex2asc(unsigned int); unsigned int hex=0x89ab; hex2asc(hex); } void hex2asc(unsigned int hex) { int i; asc[0]=((hex>>12)&0xf)+0x30; asc[1]=((hex>>8)&0xf)+0x30; asc[2]=((hex>>4)&0xf)+0x30; asc[3]=(hex&0xf)+0x30; for(i=0;i<4;i++) if(asc[i]>0x39) asc[i]+=7; } /* hex 為 A~F? */ /* 若hex 為A~F 則再加7 修正 */ , /* 轉換第 1 位 hex 碼 */ /* 轉換第 2 位 hex 碼 */ /* 轉換第 3 位 hex 碼 */ /* 轉換第 4 位 hex 碼 */ /* hex2asc 函數 */ /* hex2asc 函數宣告 */ /* hex 變數宣告 */ /* 呼叫 hex2asc 函數 */ /* 8051 接腳定義 */ /* asc 碼 */
8
/* hex2asc 函數 */
/* 轉換第 1 位 hex 碼 */ /* 轉換第 2 位 hex 碼 */ /* 轉換第 3 位 hex 碼 */ /* 轉換第 4 位 hex 碼 */ /* hex 為 A~F? */ /* 若hex為A~F 則再加7修正 */ ,
5.4 16进转ASCII码函数
4
5.2 16进转10进函数
程式範例:ch5-2.c
#include "reg51.h" unsigned char bcd[5]; main() { void hex2bcd(unsigned int); while(1) hex2bcd(0xFFFF); } void hex2bcd(unsigned int hex) { bcd[0]=hex/10000; bcd[1]=(hex%10000)/1000; bcd[2]=((hex%10000)%1000)/100; bcd[3]=(((hex%10000)%1000)%100)/10; bcd[4]=(((hex%10000)%1000)%100)%10; } /* 轉換萬位數 */ /* 轉換千位數 */ /* 轉換百位數 */ /* 轉換十位數 */ /* 轉換個位數 */ /* hex2bcd 函數 */ /* 呼叫 hex2bcd 函數 */ /* 宣告 hex2bcd 函數 */ /* 8051 接腳定義 */ /* 外部陣列變數宣告 */
運算結果 bcd[0]=6, bcd[1]=5, bcd[2]=5, bcd[3]=3, bcd[4]=5
5
5.3 10进转16进函数
10进转16进函数
此函數為 5-2 節的反運算,可將 5 位數的 10 進值轉換成 16 進值。利用傳址呼 叫,將 bcd 矩陣的起始位址傳入函數中,經函數轉換後的 16 進值存入 hex 中。 程式範例如 ch5-3.c,傳入函數中的 10 進數值 bcd[5]={6,5,5,3,5},經函數轉換之 後,其 16 進數值為 0xFFFF,並儲存於 hex 中。轉換公式如下: hex =bcd[0]10000+bcd[1]1000+bcd[2]100+bcd[3]10+bcd[4] =10(10(10(10bcd[0]+bcd[1])+bcd[2])+bcd[3])+bcd[4]
f
0 1 1 1 0 0 0 1 0 0
e
0 1 0 1 1 1 0 1 0 1
d
0 1 0 0 1 0 0 1 0 0
c
0 0 1 0 0 0 0 0 0 0
b
0 0 0 0 0 1 1 0 0 0
asc2hex 函數
void asc2hex(unsigned char *asc) */ { int i; for(i=0;i<4;i++) { hex<<=4; if(*(asc+i)>='0' && *(asc+i)<='9') hex+=(*(asc+i)-'0'); else if(*(asc+i)>='A' && *(asc+i)<='F') hex+=(*(asc+i)-'0'-7); else if(*(asc+i)>='a' && *(asc+i)<='f') hex+=(*(asc+i)-'0'-0x20-7); } }
hex2bcd 函數
void hex2bcd(unsigned int hex) { bcd[0]=hex/10000; bcd[1]=(hex%10000)/1000; bcd[2]=((hex%10000)%1000)/100; bcd[3]=(((hex%10000)%1000)%100)/10; bcd[4]=(((hex%10000)%1000)%100)%10; } /* 轉換萬位數 */ /* 轉換千位數 */ /* 轉換百位數 */ /* 轉換十位數 */ /* 轉換個位數 */ /* hex2bcd 函數 */
delay 函數
void delay(int count) { int i; for(i=0;i<count;i++) ; } /* 迴圈變數 */ /* 延遲時間視 CPU 速度而異 */ /* delay 函數 */
2
5.1 延迟函数
程式範例:ch5-1.c
#include "reg51.h" main() { void delay(int); P1=0xFF; while(1) { P1=P1^0xFF; delay(10000); } } void delay(int count) { int i; for(i=0;i<=count;i++) ; } /* 迴圈 */ /* 延遲時間因 CPU 速度而異 */ /* delay 函數 */ /* LED 狀態反相 */ /* 呼叫 delay 函數 */ /* 宣告 delay 函數 */ /* LED 初值,全暗 */ /* 8051 接腳定義 */
bcd2hex 函數
void bcd2hex(unsigned int *bcd) { int i; for(i=0;i<5;i++) hex=hex*10+bcd[i]; } /* 整數變數 i */ /* 迴圈 */ /* bcd 值轉 hex 值 */ /* bcd2hex 函數 */
6
5.3 10进转16进函数

運算結果 hex=1A2B
11
5.6 BCD码转七段显示码函数
BCD码转七段显示码函数
a f e g b c d dp
(a) 接腳名稱 圖 5-1
com
(b) 數字 0~9 顯示情形 七段顯示器
com
a
b
c
d
e
f
g
dp
a
b
c
d
e
f
g
dp
(a) 共陽極 圖 5-2 七段顯示器內部結構
(b) 共陰極
程式範例:ch5-3.c
#include "reg51.h" unsigned int hex; main() { unsigned int bcd[5]={6,5,5,3,5}; void bcd2hex(unsigned int *); bcd2hex(bcd); } void bcd2hex(unsigned int *bcd) { int i; for(i=0;i<5;i++) hex=hex*10+bcd[i]; } /* 整數變數 i */ /* 迴圈 */ /* bcd 值轉 hex 值 */ /* bcd2hex 函數 */ /* 10 進值 */ /* bcd2hex 函數宣告 */ /* 呼叫 bcd2hex 函數 */ /* 8051 接腳定義 */ /* 16 進值 */
運算結果 asc[0]=0x38, asc[1]=0x39, asc[2]=0x41, asc[3]=0x42
9
5.5 ASCII码转16进码函数
ASCII码转16进码函数
程式範例如 ch5-5.c,傳入函數中的引數*asc 為包含 4 個 ASCII 碼的字元陣列,經 函數轉換後將被儲存變數 hex 中。
第五章 常用函数
5.1 延迟函数 5.2 16进转10进函数 5.3 10进转16进函数 5.4 16进转ASCII码函数 5.5 ASCII码转16进码函数 5.6 BCD码转七段显示码函数 5.7 除弹跳函数
1
5.1 延迟函数
延迟函数
程式範例如 ch5-1.c,傳入函數的引數 count 決定延遲時間的相對長度,由使用者 自行設定,延遲時間為 countT,其中 T 因不同的 CPU 執行速度而有所不同,因此 傳入引數 count 值依實際情形調整所需的延遲時間。
10
/* asc2hex 函數
/* 4 位數 ascii 碼 */ /* 左移 4 位元 */ /* 0~9? */ /* A~F? */ /* a~f? */
5.5 ASCII码转16进码函数
Hale Waihona Puke Baidu
程式範例:ch5-5.c
#include "reg51.h" unsigned int hex=0; main() { unsigned char *asc="1A2b"; void asc2hex(unsigned char *); asc2hex(asc); } void asc2hex(unsigned char *asc) { int i; for(i=0;i<4;i++) { hex<<=4; if(*(asc+i)>='0' && *(asc+i)<='9') hex+=(*(asc+i)-'0'); else if(*(asc+i)>='A' && *(asc+i)<='F') hex+=(*(asc+i)-'0'-7); else if(*(asc+i)>='a' && *(asc+i)<='f') hex+=(*(asc+i)-'0'-0x20-7); } } /* a~f? */ /* A~F? */ /* 左移 4 位元 */ /* 0~9? */ /* 4 位數 ascii 碼 */ /* asc2hex 函數 */ /* 4 位數 ascii 碼 */ /* asc2hex 函數宣告 */ /* 呼叫 asc2hex 函數 */ /* 8051 接腳定義 */ /* 整數變數 hex */
相关文档
最新文档