注意:訪問本站需要Cookie和JavaScript支持!請設置您的瀏覽器! • 打開購物車 • 查看留言 • 付款方式 • 聯系我們 |
![]() |
首頁 | 電子入門 | 學單片機 | 免費資源 | 下載中心 | 商品列表 | 象棋在線 | 在線繪圖 | 加盟五一 | 加入收藏 | 設為首頁 |
選擇分類:當前分類——學單片機 相關聯或者相類似的文章: 三十分鐘一個小時學會單片機(9045) 什么是單片機?單片機有什么用? (8723) 如何用STC板將代碼燒錄進IC(8681) 怎樣安裝AT51編程板的USB轉串口軟件?(8206) 送給單片機愛好者——LED在線編碼器(1814) 送給單片機愛好者——LED點陣在線編碼器(1544) 單片機系統中的漢字顯示(1492) 帶語音報數功能的搶答器(1489) 用VB進行串口實時數據采集(1347) 用AT89C2051設計超聲波測距儀(1171) 小小電子鬧鐘 生活學習良伴(1165) DS1820測溫原理(1129) 幾句代碼實現控制攝像頭(轉)(1117) STC單片機選型指南(1111) 自制PIC單片機編程器(1105) USB轉串口芯片CH340(1010) 快速學習單片機之黃金機會!(1010) 告戒購單片機開發實驗板初學者(970) 新款實用旋轉LED顯示屏A(890) 使用市售 USB轉RS232串口與PLC通信的測試報告 (881) 首頁 前頁 后頁 尾頁 本站推薦: | 1.紅外遙控噐軟件解碼及其應用 MCS-51系列MCU對TC9012紅外遙控噐軟件解碼實例清單如下: ;============================================== ;遙控器軟件解碼子程序,入口標號:TKEY ;影響4BH、4CH單元;4BH為循環計數器。 ;位地址00H為讀鍵標志:“1”為成功,“0”為讀 ;鍵無效, 若成功, 鍵值在4C單元中。 ;位地址04H為鍵值類型標志: ;“1” 實際值,“0” 映射值。 ;以下2個參數是紅外遙控信號的軟件解 ;碼參數,視CPU時鐘頻率而定,若晶振為6M,則 ;============================================== #HW EQU #08H ;引導脈沖特征寬度 #PW EQU #02H ;信號脈沖特征寬度 #ZGZQ EQU #90H;主工作區高位地址; TKE2: LJMP TKE;接力跳轉; TKEY: PUSH A ;子程序入口 PUSH PSW PUSH DPH PUSH DPL PUSH 00H PUSH 01H MOV TMOD,#01H MOV PSW, #00H MOV P2, #ZGZQ MOV R0, #70H MOV R1, #21H ;有效脈沖只有33個 CLR 00H TK3: MOV TH0,#0 MOV TL0,#0AH;測低電平寬度 SETB TR0 TK4: JB TF0, TKE2;超時無效轉結束 JNB P3.3, TK4 CLR TR0 MOV A, TH0 MOVX @R0, A INC R0 MOV A, TL0 MOVX @R0, A INC R0 MOV TH0, #00H MOV TL0, #0AH;測高電平寬度 SETB TR0 TK5: JB TF0, TKE2;超時無效轉結束 JB P3.3, TK5 CLR TR0 MOV A, TH0 MOVX @R0, A INC R0 MOV A, TL0 MOVX @R0, A INC R0 DJNZ R1, TK3;循環 ; ;分析脈沖流 ;脈沖波形數據存放在70H開始的連續84H個單元內, ;每個脈沖由一個低電平脈寬和高電平脈寬組成 ;每個脈寬數據占兩個字節,前一個字節為高8位 ;后一個字節為低8位 ; ;判引導脈沖是否有效 MOV R0, #70H MOVX A, @R0 CLR C SUBB A, #HW JC TKE ;低電平引導脈沖無效轉結束 INC R0 INC R0 MOVX A, @R0 SUBB A, #HW JC TKE ;高電平引導脈沖無效轉結束 ;分析鍵碼 ;鍵碼值在片內4CH單元 ! ;判9012遙控芯片特征碼是否有效, ;特征碼是連續兩個字節的0EH ;首先譯碼第1個特征碼,并判斷是否為“0EH” MOV 4BH, #8 MOV 4CH, #0 INC R0 INC R0 TK6: INC R0 INC R0 MOVX A, @R0 CLR C SUBB A, #PW MOV A, 4CH RRC A MOV 4CH, A INC R0 INC R0 DJNZ 4BH, TK6 ;循環 MOV A, 4CH CPL A CJNE A, #0EH, TK7 MOV A, R0 ;是9012芯片的特征碼 ADD A, #20H;跳過后一個特征碼的 MOV R0, A ;判斷,去譯碼鍵值----- LJMP TK9 ;--轉TK9 ;第1個特征碼無效 ;再譯碼第2個特征碼,并判斷是否為“0EH” TK7: MOV 4BH, #8 MOV 4CH, #0 TK8: INC R0 INC R0 MOVX A, @R0 CLR C SUBB A, #PW MOV A, 4CH RRC A MOV 4CH, A INC R0 INC R0 DJNZ 4BH, TK8 MOV A, 4CH CPL A CJNE A, #0EH, TKE;無效退出; ; 特征碼有效,進行鍵值譯碼 TK9: MOV 4BH, #8 MOV 4CH, #0 TK10: INC R0 INC R0 MOVX A, @R0 CLR C SUBB A, #PW MOV A, 4CH RRC A MOV 4CH, A INC R0 INC R0 DJNZ 4BH, TK10 MOV A, 4CH; CPL A ;得鍵碼 JB 04H, TKE1 MOV DPTR, #TAB ;鍵碼到鍵值 MOVC A, @A+DPTR;的查表映射 TKE1: MOV 4CH, A;或4CH中 SETB 00H ;置讀鍵有效標志 TKE: POP 01H POP 00H POP DPL ;返回 POP DPH POP PSW POP A MOV P2, #0FFH RET ;以下是針對某一具體應用的“重定義按鍵”映射表 TAB: DB 01H,02H,03H,04H,05H,06H,07H,08H DB 09H,00H,20H,20H,20H,20H,20H,20H DB 0EH,11H,14H,13H,0AH,0BH,0FH,20H DB 0CH,0DH,15H,20H,10H,12H,0FH,20H DB 20H,20H,20H,20H,20H,20H,20H,20H ; 以上是軟件譯碼的子程序。調用該子程序,必須首先檢測是否有遙控信號的到來,并進行同步。具體方法可以采用查詢方式,也可采用中斷方式。以下給出查詢方式的子程序: ;============================================== ;測試是否有遙控信號到來,子程序返回時 ;位標志00H置“1”時有遙控信號到來, ;位標志置“0”時無遙控信號到來. ;============================================== DKEY: SETB 00H MOV 2FH,#00H DK1: JNB P3.3,DKE NOP NOP NOP JNB P3.3,DKE NOP NOP NOP DJNZ 2FH,DK1 CLR 00H DKE: RET 2.一種8位I/O口的單片機顯示器和鍵盤接口 LED顯示和鍵盤查詢軟件匯編的子程序如下: DISP為LED顯示子程序,其功能是使P1.7=1,把顯示緩沖區(首址為DISB)中的數據依次送至P1.0~P1.3即U1/CD4511的輸入端,同時,P1.4~P1.6輸出對應各LED管位的BCD碼,每個LED管的顯示時間為1ms。 入口參數:DISB顯示緩沖區首址; 出口參數:無; 使用寄存器:A,R0,R2,R3,R4。 DISP: MOV R3,#04H ;LED數碼管個數 MOV R0,DISB ;顯示緩沖區首址 MOV R2,#08H ;輸出碼初值,使P1.7=1 DSP0: MOV A,R2 ;取初值 SWAP A ;高4位和低4位交換 ANL A,#0F0H ;屏蔽低4位 ORL A,@R0 ;與欲顯示數碼合成為輸出碼 MOV P1,A ;輸出至P1口 MOV R4,#0FAH ;延時計數器初值 DLP: DJNZ R4,DLP ;延時1ms INC R0 ;顯示緩沖器地址+1 INC R2 ;LED位地址+1 DJNZ R3,DSP0 ;共顯示4個LED RET 下面是鍵盤查詢子程序KSB。其功能是,使LED熄滅(P1.7=0),置P1.0~P1.3為輸入方式,P1.4~P1.6依次輸出數字“0~3”所對應的BCD碼,同時測量P1.0~P1.3是否有低電平;若有低電平即為有鍵按下,延時消鍵抖動,計算鍵值,測鍵是否被釋放,若釋放,延時退出。此時置累加器A=1,鍵值在寄存器R2中。若無鍵,則累加器A=0。 入口參數:無; 出口參數:A有無鍵標志:A=0時無鍵,A=1則有鍵; R2鍵位值(0~1FH); 使用寄存器:A,R0,R2,R3,R4。 KBS: MOV R3,#0F0H ;P1初值,P1.0~P1.3輸入,P1.4~P1.6=0,P1.7=0 MOV R4,#04H ;列計數器初值 MOV R2,#00H ;鍵位的初值 KS1: MOV A,R3 ;取輸出初值 SWAP A ;高低四位交換,形成輸出碼 MOV P1,A ;輸出至P1口 NOP MOV A,P1 ;測輸入 ANL A,#0FH ;屏蔽掉高四位 XRL A,#0F ;測是否有鍵 JNZ KSP ;有鍵,轉計算鍵值 INC R3 ;無鍵,輸出值+1 MOV A,R2 ;取鍵值 ADD A,#04H ;鍵值+4(因每列4鍵) MOV R2,A ;賦鍵值 DJNZ R4,KS1 ;4列掃完否 KSE0: CLR A ;無鍵,A清零 SJMP KSE ;退出 KSP: ACALL D20MS ;有鍵,延時20ms消鍵抖動 ORL P1,#0FH ;再測有鍵否 NOP MOV A,P1 ANL A,#0FH XRL A,#0FH JZ KSE0 ;無鍵退出 KSP0: RRC A ;循環右移 JC WAIT ;此位有鍵,轉等待 INC R2 ;無鍵,鍵值+1 SJMP KSP0 ;循環測鍵位,計算鍵值 WAIT: ORL P1,#0FH ;測鍵是否釋放 NOP MOV A,P1 ANL A,#0FH XRL A,#0FH JNZ WAIT ;鍵未釋放,等待 ACALL D20MS ;鍵釋放,延時20ms INC A ;有鍵,A=1 KSE: RET D20MS是延時20ms子程序。 入口參數:無; 出口參數:無; 使用寄存器:R6,R7。 D20MS: MOV R7,#14H DL1: MOV R6,#0F9H DL2: DJNZ R6,DL2 DJNZ R7,DL1 RET 3.如何在MCS-51系統中使用IDE硬盤
MCS-51程序主要部分如下: 主要部分MCS51程序: /* 以下是關于8255的一些定義: */ #define IDE_8255_LSB 0x2000 /* 低8位 */ #define IDE_8255_MSB 0x2001 /* 高8位 */ #define IDE_8255_CTL 0x2002 #define CFG_8255 0x2003 #define RD_IDE_8255 0x92 /*10010010b, 8255輸入 */ #define WR_IDE_8255 0x80 /*10000000b, 8255輸出 */ /* 8255和IDE接口連接 */ #define IDE_A0 0x01 /* 8255和IDE接口直接相連 */ #define IDE_A1 0x02 /* 8255和IDE接口直接相連 */ #define IDE_A2 0x04 /* 8255和IDE接口直接相連 */ #define IDE_CS0 0x08 /* 8255和IDE接口通過74LS04反相后相連 */ #define IDE_CS1 0x10 /* 8255和IDE接口通過74LS04反相后相連 */ #define IDE_WR 0x20 /* 8255和IDE接口通過74LS04反相后相連 */ #define IDE_RD 0x40 /* 8255和IDE接口通過74LS04反相后相連 */ #define IDE_RST 0x80 /* 8255和IDE接口通過74LS04反相后相連 */ #define IDE_DATA IDE_CS0 #define IDE_ERR IDE_CS0 + IDE_A0 #define IDE_SECCNT IDE_CS0 + IDE_A1 #define IDE_SECTOR IDE_CS0 + IDE_A1 + IDE_A0 #define IDE_LSB IDE_CS0 + IDE_A2 #define IDE_MSB IDE_CS0 + IDE_A2 + IDE_A0 #define IDE_HEAD IDE_CS0 + IDE_A2 + IDE_A1 #define IDE_COMMAND IDE_CS0 + IDE_A2 + IDE_A1 + IDE_A0 #define IDE_STATUS IDE_CS0 + IDE_A2 + IDE_A1 + IDE_A0 #define IDE_CONTROL IDE_CS1 + IDE_A2 + IDE_A1 #define IDE_ASTATUS IDE_CS1 + IDE_A2 + IDE_A1 + IDE_A0 /* IDE命令:*/ #define IDE_CMD_RECAL 0x10 #define IDE_CMD_READ 0x20 #define IDE_CMD_WRITE 0x30 #define IDE_CMD_INIT 0x91 #define IDE_CMD_ID 0xEC #define IDE_CMD_SPINDOWN 0xE0 #define IDE_CMD_SPINUP 0xE1 /* IDE初始化 */ int IDE_Init() { int status, i=0; IDE_Write(IDE_HEAD, 0xA0); status = IDE_Read(IDE_STATUS); while(!(status&0x40)) { /*等待RDY為”1”*/ delay(1); if(i++>5000){ printf("Time out, device error!\n"); exit(1); } } i = 0; while(status&0x80) { /*等待BSY為”0”*/ delay(1); if(i++>5000){ printf("Time out, device error!\n"); exit(1); } } IDE_Write(IDE_HEAD, 0x20); IDE_Write(IDE_SECCNT, 64); IDE_Write(IDE_COMMAND, IDE_CMD_INIT); if(IDE_Busy()==-1){ printf("Time out,device error!\n"); exit(1); } IDE_Write(IDE_COMMAND, IDE_CMD_RECAL); if(IDE_Busy()==-1){ printf("Time out,device error!\n"); exit(1); } } /* 從硬盤讀取一個扇區,放入到形參指定的內存中 */ int ReadSector(short *addr, long int LBA) { IDE_Busy(); /* 等待硬盤空閑 */ WriteLBA(LBA); IDE_Write(IDE_COMMAND,IDE_CMD_READ); IDE_DRQ(); ReadData(addr); } /* 向硬盤寫一個扇區,返回零表示成功,否則失敗。*/ int WriteSector(short * Buffer, long int LBA) { IDE_Busy(); WriteLBA(LBA); IDE_Write(IDE_COMMAND,IDE_CMD_WRITE); IDE_DRQ(); Wirte_Data(Buffer); IDE_Busy(); } /* 取得錯誤號 */ short GetError() { int res; res = IDE_Read(IDE_ERR); return res; } /* 讀取硬盤的標識! */ void GetDriverId(short * Buffer) { IDE_Busy(); IDE_Write(IDE_COMMAND,IDE_CMD_ID); IDE_DRQ(); ReadData(Buffer); } /* 激活硬盤(轉動)! */ void SpinUP() { IDE_Write(IDE_COMMAND,IDE_CMD_SPINUP); IDE_Busy(); } /* 讓硬盤休眠(停轉)! */ void SpinDown() { IDE_Busy(); IDE_Write(IDE_COMMAND,IDE_CMD_SPINDOWN); IDE_Busy(); } /* 從硬盤讀取512個字節! */ int ReadData(short * Buffer) { int i; for(i = 0; i < 256; i ++) { *(Buffer ++) = IDE_Read(IDE_DATA); } return 0; } /* 向硬盤寫入512個字節!*/ void WriteData(short * Buffer) { int i; for(i = 0; i < 256; i ++) { IDE_Write(IDE_DATA, *(Buffer++)); } } /* 向設備寄存器寫入邏輯塊地址 */ void WriteLBA(long int LBA) { short data = 0; data |= ((LBA&0xFF000000) >> 24); data &= 0x0F; data |= 0xE0; IDE_Write(IDE_HEAD, data); data = 0; data |= ((LBA&0xFF0000) >> 16); IDE_Write(IDE_MSB, data); data = 0; data |= ((LBA&0xFF00) >> 8); IDE_Write(IDE_LSB, data); data = 0; data |= (LBA&0xFF); IDE_Write(IDE_SECTOR, data); IDE_Write(IDE_SECCNT, 1); } /* 等待IDE設備空閑,返回設備的狀態. */ int IDE_Busy() { int res,i = 0; do { res = IDE_Read(IDE_STATUS); delay(1); /* 等待 1ms */ if(i++>5000) return -1; /* 重試5000次,如果失敗,返回錯誤*/ }while(res&0x80); return res; } /* 等待設備空閑直到可以傳送數據,返回設備的狀態 */ int IDE_Ready() { int i = 0, res; do { res = IDE_Read(IDE_STATUS); delay(1); /* 等待 1ms */ if(i++>5000) return -1; }while((res&0x80)&&(!(res&0x08))); return res; } /* 通過8255讀取硬盤數據(一個16位的字)。 */ short IDE_Read(unsigned char reg) { short res = 0; unsigned char MSB, LSB; *((char *)CFG_8255) = RD_IDE_8255; /* 8255為輸入模式,讀硬盤。 */ *((char *)IDE_8255_CTL) = reg; MSB = *((char *)IDE_MSB); LSB = *((char *)IDE_LSB); *((char *)IDE_8255_CTL) = 0x00; /* 清除控制寄存器! */ res = (MSB << 8)|LSB; return res; } /* 通過8255向硬盤寫入一個字。 */ void IDE_Write(unsigned char reg, short data) { unsigned char outdata = 0; *((char *)CFG_8255) = WR_IDE_8255; /* 8255為輸出模式,寫硬盤! */ outdata |= (data & 0x00ff); *((char *)IDE_8255_LSB) = outdata; /* 首先寫LSB! */ outdata = 0; outdata |= (data >> 8); *((char *)IDE_8255_MSB) = outdata; /* 寫MSB! */ *((char *)IDE_8255_CTL) = reg; reg |= IDE_WR; *((char *)IDE_8255_CTL) = reg; *((char *)IDE_8255_CTL) = 0x00; /* 清除控制寄存器! */ *((char *)CFG_8255) = RD_IDE_8255; /* 8255為輸入模式,讀硬盤! */ } /* 硬盤復位操作,當初始化結束后需要復位。 */ void IDE_Reset() { *((char *)CFG_8255) = WR_IDE_8255; /* 8255為輸出模式,寫硬盤。 */ *((char *)IDE_8255_CTL) = IDE_RST; delay(3); *((char *)IDE_8255_CTL) = 0x00; /* 清除控制寄存器! */ } 4.移動電話便攜通話裝置的按鍵掃描設計
原程序清單如下: Remote_Key.h文件代碼如下: #define REM_YES 0x1000 //接聽鍵YES #define REM_NO 0x2000 //拒接鍵NO #define REM_UP 0x4000 /音量增大鍵UP #define REM_DOWN 0x8000 //音量減低鍵DOWN /*以下決定每個按鍵對應的比特位置*/ #define _REM_YES 12 #define _REM_NO 13 #define _REM_UP 14 #define _REM_DOWN 15 /* 以下為函數聲明*/ void Key_IOINIT(void); Remote_Key.c文件代碼如下: #include #include "macro.h" #include "Remote_Key.h" #include "SCI.h" /*SCI串行通信模塊*/ unsigned int Remote_Keys; unsigned char RecByte; unsigned char* csAdd; void Key_IOINIT(void) { /*將P5.2從普通I/O引腳功能切換為外部中斷引腳3*/ P5C2R &= 0xfd; P5C2R |= 0x04; P5C1R |= 0x06; P5C0R |= 0x06; Disable_Interrupts(); spp(EXINT_PG); /*切換到外部中斷頁寄存器*/ /*外部中斷觸發寄存器設置*/ EITR = 0; /*設置成信號下降沿觸發中斷*/ /*外部中斷標志寄存器設置*/ EIPR = 0; /*清空所有標志位*/ /*外部中斷使能寄存器設置*/ EIMR |= EIm_ib1m| /*使能第3號外部中斷*/ /*外部中斷優先級寄存器設置*/ EIPLR |= 0x2d; /*設置第3號外部中斷優先級*/ EIPLR &= 0xeb; /* INT3(INT.B1 101:5) */ /*外部中斷向量寄存器*/ EIVR = 0x40 ; /*設置外部中斷向量*/ Enable_Interrupts(); } #pragma interrupt (EXT_INT_3) void EXT_INT_3(void) { SAVE_PAGE; /*當前頁壓棧*/ spp(EXINT_PG); EIPR &= ~EIm_ipb1m; /*清空第3號外部中斷發生標志位*/ /*片選MCP3201使其工作*/ csAdd=0x8001; *csAdd &= 0xef; /*通過SCI串行通信方式從MCP3201獲得數據*/ SCI_Receive_Buffer(&RecByte, 1); if (RecByte>=0xf0 && RecByte<=0xff) /*接聽鍵(YES)處理*/ { Remote_Keys = REM_YES; /*這里添加接聽鍵(YES)處理代碼......*/ ClrBit(Remote_Keys,_REM_YES); } if (RecByte>=0xcb && RecByte<=0xd7) /*拒接鍵(NO)處理*/ { Remote_Keys = REM_NO; /*這里添加拒接鍵(NO)處理代碼......*/ ClrBit(Remote_Keys,_REM_NO); } if (RecByte>=0xc2 && RecByte<=0xc6) /*音量增大鍵(UP)處理*/ { Remote_Keys = REM_UP; /*這里添加音量增大鍵(UP)處理代碼......*/ ClrBit(Remote_Keys,_REM_UP); } if (RecByte>=0x8d && RecByte<=0x96) /*音量減低鍵(DOWN)處理*/ { Remote_Keys = REM_DOWN; /*這里添加音量減低鍵(DOWN)處理代碼......*/ ClrBit(Remote_Keys,_REM_DOWN); } /*通過將片選信號設置為高電平停止MCP3201工作*/ *csAdd |= 0x10; /*當前頁出棧*/ RESTORE_PAGE; } 5.億恒C166系列單片機IIC總線的軟件模擬 測試原程序如下: 3.1 延時子程序 延時子程序Delay用于產生時鐘和數據信號的延時,延時時間為400ns×count。程序清單如下: void Delay(unsigned int count) { while (count--); } 3.2 SCL線檢查子程序 SCL線檢查子程序Check_SCL用于向串行時鐘線輸出高電平。該子程序將等待從設備釋放SCL,等待的時限為10ms,如果時鐘和數據線無誤,則返回值為0,否則為1。程序清單如下: unsigned char Check_SCL() { time_out = period; DSCL = 0; /*設置SCL為輸入*/ while (time_out--) { if (SCL) /* 等待從設備釋放SCL*/ { SCL = 1; /* 置時鐘線為高電平 */ DSCL = 1; /*設置SCL為輸出*/ return (0); } } return (1); /*出錯*/ } 3.3 初始化子程序 初始化子程序I2CInit用于主定時器T3和輔助定時器T2的設置,并檢查時鐘和數據線的錯誤,如SDL/SCL上無上拉電阻或者被從設備拉低。如時鐘和數據線無誤則返回值為0,否則為1。程序清單如下: unsigned char I2cInit() { T3CON = 0x0080; /*定時器模式;分辨率為400ns;向下計時*/ T2CON = 0x0027; /*重載模式;輸入為T3OTL的正負跳變*/ T2 = 0x0018; /*T2的重載值為24*/ T3 = 0x0018; /*T3的初值*/ T2IC = 0x0004; /*設置T2的中斷優先級*/ DSDA = 0; /*設置SDA和SCL為輸入*/ DSCL = 0; if (!SDA) /*檢查時鐘和數據線*/ if (I2cStop()) return (1); if (!SCL) if (I2cStop()) return (1); return (0); } 3.4 起動子程序 起動子程序I2Cstart用于在I2C總線上產生起始位。程序清單如下: void I2cStart() { SDA = 1; /*確認SDA和SCL均為高電平*/ SCL = 1; DSDA = 1; /*設置SDA和SCL為輸出*/ DSCL = 1; Delay(5); SDA = 0; Delay(10); SCL = 0; } 3.5 主設備寫子程序 主設備寫子程序I2CMasterWrite用于向從設備寫一個字節的數據,在寫數據前先檢查等待情況。傳送給從設備的數據為該子程序的參數。程序清單如下: void I2cMasterWrite(unsigned char input_byte) { input_data = input_byte; /*在中斷子程序中使用*/ COM_ON = 1; /*置通信標志位*/ TX_RX = 0; /*發送模式標志*/ mask = 0x80; /*先傳送MSB位*/ DSDA = 1; /*設置SDA為輸出*/ bit_count = 0; /*時鐘脈沖計數器*/ if (mask & input_data) /*發送數據的第一位*/ SDA = 1; else SDA = 0; mask = mask >> 1; /*發送數據右移一位*/ Check_SCL(); /*發送前檢查等待狀態*/ T2IE = 1; /*T2中斷使能*/ T3R = 1; /*定時器開始計時*/ } 3.6 主設備讀子程序 主設備讀子程序I2CmasterRead用于從從設備讀取一個字節的數據,在讀數據前先檢查等待情況。當該子程序的參數為0時,主設備在接收到一個字節的數據后輸出低電平,當參數為1時,輸出高電平。程序清單如下: void I2cMasterRead(unsigned char ack) { Ackge = ack; /*在中斷服務程序中使用*/ rec_data = 0; COM_ON = 1; /*置通信標志位*/ TX_RX = 1; /*設置接收標志*/ mask = 0x80; DSDA = 0; /*設置SDA為輸入*/ bit_count = 0; /*時鐘脈沖計數器*/ Check_SCL(); /*接收前檢查等待情況*/ T2IE = 1; /* T2中斷使能*/ T3R = 1; /*定時器開始計時*/ } 3.7 停止子程序 停止子程序I2CStop用于產生I2C總線上的停止位。此外,該子程序還用于產生時鐘脈沖直至從設備釋放SDA。當SDA正常時,I2Cstop的返回值為0,如果SDA被拉低的時間超過10ms,返回值為1。程序清單如下: unsigned char I2cStop() { time_out = period; DSDA =0; /*設置SDA為輸入*/ while (time_out --) {if (!SDA) /*檢查SDA線*/ { SCL = 1; /*如果SDA拉低則產生時鐘脈沖*/ Delay(6); SCL = 0; Delay(6); } else /*檢查SCL*/ {SDA = 0; DSDA = 1; /*設置SDA為輸出*/ if (Check_SCL()) /*產生停止位*/ return (1); /*錯誤*/ Delay(10); SDA = 1; return (0); } } return (1); /*錯誤*/ } 3.8 T2中斷服務程序 T2中斷服務程序int_timer2_handler用于發送、接受數據,每次中斷發送或接受一位數據。程序清單如下: void int_timer2_handler(void) interrupt 0x22 { if (TX_RX) {/*接收模式*/ SCL = 1; bit_count++; if (bit_count <= 8) { if (SDA) rec_data |= mask; /*接收字節存于變量rec_data中*/ else { time_out = period; /*用于延時*/ SCL = 1; } mask = mask >> 1; SCL = 0; if (bit_count == 8) { DSDA = 1; /*設置SDA為輸出*/ if (Ackge) /*置應答位*/ SDA = 1; else SDA = 0; } } else if (bit_count == 9) {/*一個字節接收結束*/ if (bit_count == 9) /*延時*/ { SCL = 1; SCL = 1; SCL = 1; T2IE = 0; /*中斷復位*/ T3IE = 0; T2IR = 0; T3R = 0; COM_ON = 0; /*通信結束*/ SCL = 0; } } } /*發送模式*/ else { SCL = 1; bit_count++; if (bit_count <= 8) { temp_SDA = 0; if (mask & input_data) /*準備下一位*/ temp_SDA = 1; mask = mask >> 1; SCL = 0; if (bit_count != 8) SDA = temp_SDA; /*當時鐘為低時發送一位數據 */ else DSDA = 0; /*釋放SDA以接收ack位*/ } else if (bit_count == 9) { RecAck = SDA; /*在第9個時鐘周期讀應答位*/ if (bit_count == 9) /*延時*/ { SCL = 1; /*1字節發送結束*/ T2IE = 0; T3IE = 0; T2IR = 0; T3R = 0; COM_ON = 0; /*通信結束*/ SCL = 0; } } } /*發送結束*/ } 虛擬軟件包見文件:I2c_hw。 6.MCS-51四字節浮點庫及其使用說明
浮點庫程序清單如下: 程序清單: (1) 標號: BTOF 功能:浮點BCD碼轉換成格式化浮點數 入口條件:浮點BCD碼操作數在[R0]中。 出口信息:轉換成的格式化浮點數仍在[R0]中。 BTOF: INC R0 INC R0 inc r0;read L MOV 07h,@R0 DEC R0 MOV 06h,@R0 DEC R0 mov 05h,@r0 ;r5r6r7=0.hml(dec) dec r0 ;;r0 to jie_ma mov a,r7 ORL A,R6 orl a,r5 jnz btf0 ;jb r5r6r7=0 MOV @R0,#41H RET BTF0: MOV A,@R0 MOV C,ACC.7 MOV 1DH,C CLR 1FH MOV C,ACC.6 MOV ACC.7,C MOV @R0,A JNC BTF1 ADD A,#19 JC BTF2 MOV @R0,#41H INC R0 MOV @R0,#0 INC R0 MOV @R0,#0 inc r0 MOV @R0,#0 DEC R0 DEC R0 dec r0 RET BTF1: SUBB A,#19 JC BTF2 MOV A,#3FH MOV C,1DH MOV ACC.7,C MOV @R0,A INC R0 MOV @R0,#0FFH INC R0 MOV @R0,#0FFH inc r0 MOV @R0,#0FFH dec r0 DEC R0 DEC R0 RET BTF2: CLR A ;use r1.r2r3r4 MOV R4,A MOV R3,A MOV R2,a mov r1,#24 ;3byte =3*8=24 BTF3: MOV A,R7 ADD A,R7 DA A MOV R7,A MOV A,R6 ADDC A,R6 DA A MOV R6,A mov a,r5 addc a,r5 da a mov r5,a;r5r6r7*2 MOV A,R4 RLC A MOV R4,A MOV A,R3 RLC A MOV R3,A mov a,r2 rlc a mov r2,a ;count .r5r6r7(10)=>.r2r3r4(2) DEC R1 JNB ACC.7,BTF3 MOV A,R5 ADD A,#0B0H CLR A ADDC A,R4 MOV R4,A CLR A ADDC A,R3 MOV R3,A CLR A ADDC A,R2 MOV R2,A JNC BTF4 MOV R2,#80H INC R1 BTF4: MOV DPTR,#BTFL MOV A,@R0 ADD A,#19 MOV B,#4 ;4 byte MUL AB ADD A,DPL MOV DPL,A JNC BTF5 INC DPH BTF5: CLR A MOVC A,@A+DPTR MOV C,ACC.6 MOV ACC.7,C MOV 0ch,A ;r4"=0ch MOV A,#1 MOVC A,@A+DPTR MOV 0dh,A MOV A,#2 MOVC A,@A+DPTR MOV 0eh,A MOV A,#3 MOVC A,@A+DPTR MOV 0fh,A LCALL MUL1 MOV C,1DH MOV 1FH,C LJMP MOV0 (2) 標號: FTOB 功能:格式化浮點數轉換成浮點BCD碼 入口條件:格式化浮點操作數在[R0]中。 出口信息:轉換成的浮點BCD碼仍在[R0]中。 FTOB: INC R0 MOV A,@R0 ;h INC R0 ORL A,@R0 ;m inc r0 orl a,@r0 ;l dec r0 DEC R0 DEC R0 JNZ FTB0 MOV @R0,#41H RET FTB0: MOV A,@R0 MOV C,ACC.7 MOV 1DH,C CLR ACC.7 MOV @R0,A LCALL MVR0 MOV DPTR,#BFL0 MOV B,#0 MOV A,R2 JNB ACC.7,FTB1 MOV DPTR,#BTFL MOV B,#0EDH ADD A,#16 JNC FTB1 MOV DPTR,#BFLN MOV B,#0FAH FTB1: CLR A MOVC A,@A+DPTR MOV C,ACC.6 MOV ACC.7,C MOV 0ch,A ;r4" MOV A,#1 MOVC A,@A+DPTR MOV 0dh,A MOV A,#2 MOVC A,@A+DPTR MOV 0eh,A MOV A,#3 MOVC A,@A+DPTR MOV 0fh,A MOV A,0ch ;r4" jie_ma CLR C SUBB A,R2 JB ACC.7,FTB2 JNZ FTB3 MOV A,0dh ;0.r5"r6"r7"-0.r3r4r5 CLR C SUBB A,R3 JC FTB2 JNZ FTB3 MOV A,0eh;r6"-r4;;;2002.6.18 CLR C SUBB A,r4 JC FTB2 JNZ FTB3 MOV 0ah,B INC 0ah MOV 0dh,#10h;0.100000 MOV r6,#0 MOV r7,#0 SJMP FTB6 FTB2: INC DPTR INC DPTR INC DPTR inc dptr ;4byte INC B SJMP FTB1 FTB3: PUSH B CALL DIV3 FTB4: MOV A,r2 JZ FTB5 CLR C LCALL RR1 SJMP FTB4 FTB5: POP 0ah LCALL HB2 MOV 0dh,A;r5" LCALL HB2 MOV R6,A LCALL HB2 MOV R7,A MOV A,R3 RLC A CLR A ADDC A,R7 DA A MOV R7,A CLR A ADDC A,R6 DA A MOV R6,A JNC FTB6 MOV R6,#10H INC 0dh FTB6: INC R0 INC R0 inc r0 MOV A,R7 MOV @R0,A DEC R0 MOV A,R6 MOV @R0,A DEC R0 MOV A,0dh mov @r0,a dec r0 mov a,0ah MOV C,1DH MOV ACC.7,C MOV @R0,A RET ;[r3r4r5*100]\10=>bcd1,2 HB2: MOV A,R5 MOV B,#100 MUL AB MOV R5,A MOV A,B XCH A,R4 MOV B,#100 MUL AB ADD A,R4 MOV R4,A ;JNC HB21 mov a,B addc a,#0 xch a ,r3 mov b,#100 mul ab add a,r3 mov r3,a mov a,b addc a,#0 HB21: ;MOV A,B MOV B,#10 DIV AB SWAP A ORL A,B RET BTFL: DB 41H,0ECH,1EH ,4ah;10e-19 DB 45H,93H,92H,0efh;10e-18 DB 48H,0B8H,77H,0aah;10e-17 DB 4BH,0E6H,95H,95h;10e-16 DB 4FH,90H,1DH ,7dh;10e-15 DB 52H,0B4H,24H,0dch;10e-14 DB 55H,0E1H,2EH,13h;10e-13 DB 59H,8CH,0BcH,0cch;10e-12 DB 5CH,0AFH,0EbH,0ffh;10e-11 DB 5FH,0DBH,0E6H,0ffh;10e-10 DB 63H,89H,70H ,5fh;10e-9 DB 66H,0ABH,0CCH,77h;10e-8 DB 69H,0D6H,0bfH,95h;10e-7 BFLN: DB 6DH,86H,37H ,0bdh;10e-6 DB 70H,0A7H,0C5H,0ach;10e-5 DB 73H,0D1H,0B7H,17h;10e-4 DB 77H,83H,12H ,6fh;10e-3 DB 7AH,0A3H,0D7H,0ah;10e-2 DB 7DH,0CCH,0CcH,0cdh;10e-1 BFL0: DB 1,80H,00H ,00h;10e0 DB 4,0A0H,00H,00h;10e1 DB 7,0C8H,00H,00h;10e2 DB 0AH,0FAH,00H,00h;10e3 DB 0EH,9CH,40H,00h;10e4 DB 11H,0C3H,50H,00;10e5 DB 14H,0F4H,24H,00h;10e6 DB 18H,98H,96H,80h;10e7 DB 1BH,0BEH,0BCH,20h;10e8 DB 1EH,0EEH,6BH,28h;10e9 DB 22H,95H,02H,0f9h;10e10 DB 25H,0BAH,43H,0b7h;10e11 DB 28H,0E8H,0D4h,0a5h;10e12 DB 2CH,91H,84H,0e7h;10e13 DB 2FH,0B5H,0E6H,20h;10e14 DB 32H,0E3H,5fH,0a9h;10e15 DB 36H,8EH,1bH,0cah;10e16 DB 39H,0c1H,0A2H,0cdh;10e17 DB 3CH,0DEH,0BH,5bh;10e18 DB 40H,8AH,0d7H,23h;10e19 (3) 標號: FMUL 功能:浮點數乘法 入口條件:被乘數在[R0]中,乘數在[R1]中。 出口信息:OV=0時,積仍在[R0]中,OV=1時,溢出。 FMUL: LCALL MVR0 MOV A,@R0 XRL A,@R1 RLC A MOV 1FH,C LCALL MUL0 LJMP MOV0 MUL0: LCALL MVR1 mov 01h,02h mov 02h,03h mov 03h,04h mov 04h,05h ;;**************8 MUL1: ;*********** MOV A,R2 ;;第一尾數為零否? ORL A,R3 orl a,r4 JZ MUL6 MOV A,0dh ;;第二尾數為零否? ORL A,0eh orl a,0fh JZ MUL5;計算r2R3R4×r5R6R7-→r2R3R4 ;************ mov 08h,r0;jie_ma piont mov 09h,r1;jie_ma mov 01h,r2 mov 02h,r3 mov 03h,r4 ;************ MOV R0,#25;右移相加25次 CLR A MOV R6,A MOV R7,A;ACC,R6,R7為部分積累加器 CLR C LOOP1:JNC M2 CALL ADD0 ADDC A,R1;乘數移出位等于1 ,被乘數往部分積里加1次 M2:CALL SRA1 XCH A,R5 CPL RS0 CALL SRA CPL RS0;部分積帶進位位整體右移1位 DJNZ R0,LOOP1 MOV R5,A JB ACC.7,M3;查積最高位 MOV A,0DH RLC A CALL H0;積最高位為0,積整體算術左移1位 JNB ACC.7,Mul3 CALL INC3;尾數截去部分四舍五入 SJMP mul3 M3: MOV A,0DH JNB ACC.7,mul3;2002 CALL INC3;尾數截去部分四舍五入 ;sjmp mul3 ;*************** MUL3: ;*********** mov r0,08h mov 03h,r5 mov 04h,r6 mov 05h,r7 ;************* MOV A,09h ADD A,0ch MD: MOV r2,A JB ACC.7,MUL4 JNB ACC.6,MUL6 MOV r2,#3FH SETB OV RET MUL4: JB ACC.6,MUL6 MUL5: CLR A mov r5,a ;out r2.r3r4r5=fu(2) MOV R3,A MOV R4,A MOV R2,#41H MUL6: CLR OV RET (4) 標號: FDIV 功能:浮點數除法 入口條件:被除數在[R0]中,除數在[R1]中。 出口信息:OV=0時,商仍在[R0]中,OV=1時,溢出。 FDIV: INC R0 MOV A,@R0 INC R0 ORL A,@R0 inc r0 orl a,@r0 dec r0 DEC R0 DEC R0 JNZ DIV1 MOV @R0,#41H CLR OV RET DIV1: INC R1 MOV A,@R1 INC R1 ORL A,@R1 inc r1 orl a,@r1 dec r1 DEC R1 DEC R1 JNZ DIV2 SETB OV RET DIV2: LCALL MVR0 MOV A,@R0 XRL A,@R1 RLC A MOV 1FH,C LCALL MVR1 LCALL DIV3 LJMP MOV0 DIV3: CLR C ;r3r4r5-r5"r6"r7" MOV A,R5 ;ASUBB A,0fh mov a,r4 subb a,0eh mov a,r3 subb a,0dh JC DIV4 CALL RR1 SJMP DIV3 DIV4: mov 08h,r0 mov 09h,r1 mov 0ah,r2 CLR A mov r0,a mov r1,a mov r2,a MOV B,#24 ;r3r4r5/r5"r6"r7"=>r0r1r2 DIV5: CLR C mov a,r2 rlc a mov r2,a MOV A,R1 RLC A MOV R1,A MOV A,R0 RLC A MOV R0,A MOV A,R5 RLC A MOV R5,A XCH A,R4 RLC A XCH A,R4 XCH A,R3 RLC A XCH A,R3 MOV F0,C CLR C SUBB A,0fh;r7" MOV r7,A ;r7 temp MOV A,R4 SUBB A,0eh MOV r6,A MOV A,R3 SUBB A,0dh ANL C,/F0 JC DIV6 MOV R3,A MOV 05h,07h;r7 mov 04h,06h INC R2 DIV6: DJNZ B,DIV5 MOV A,0dh CLR C RRC A SUBB A,R3 CLR A ADDC A,R2 MOV R5,A CLR A ADDC A,R1 MOV R4,A CLR A ADDC A,R0 MOV R3,A mov r0,08h mov r1,09h mov r2,0ah MOV A,R2 CLR C SUBB A,0ch LCALL MD LJMP RLN (5) 標號: FMOV 功能:浮點數傳送 入口條件:源操作數在[R1]中,目標地址為[R0]。 出口信息:[R0]=[R1],[R1]不變。 FMOV: INC R0 INC R0 inc r0 INC R1 INC R1 inc r1 MOV A,@R1 MOV @R0,A DEC R0 DEC R1 MOV A,@R1 MOV @R0,A DEC R0 DEC R1 MOV A,@R1 MOV @R0,A DEC R0 DEC R1 MOV A,@R1 MOV @R0,A RET (6) 標號: FCMP 功能:浮點數代數值比較(不影響待比較操作數) 入口條件:待比較操作數分別在[R0]和[R1]中。 出口信息:若CY=1,則[R0] < [R1],若CY=0且A=0則 [R0] = [R1],否則[R0] > [R1]。 FCMP: MOV A,@R0 XRL A,@R1 JNB ACC.7,CMP2 MOV A,@R0 RLC A MOV A,#0FFH RET CMP2: MOV A,@R1 MOV C,ACC.6 MOV ACC.7,C MOV B,A MOV A,@R0 MOV C,ACC.7 MOV F0,C MOV C,ACC.6 MOV ACC.7,C CLR C SUBB A,B JZ CMP6 RLC A JNB F0,CMP5 CPL C CMP5: MOV A,#0FFH RET ;************ CMP6: INC R0 INC R0 inc r0 inc r1 INC R1 INC R1 CLR C MOV A,@R0 SUBB A,@R1 MOV B,A DEC R0 DEC R1 MOV A,@R0 SUBB A,@R1 DEC R0 DEC R1 ;*********** mov 0fh,a;r7" MOV A,@R0 SUBB A,@R1 dec r0 dec r1 ORL A,0fh orl a,b JZ CMP7 JNB F0,CMP7 CPL C CMP7: RET (7) 標號: FADD 功能:浮點數加法 入口條件:被加數在[R0]中,加數在[R1]中。 出口信息:OV=0時,和仍在[R0]中,OV=1時,溢出。 FADD: CLR F0 ;設立加法標志 SJMP AS ;計算代數和 FADD: CLR F0 SJMP AS (8) 標號: FSUB 功能:浮點數減法 入口條件:被減數在[R0]中,減數在[R1]中。 出口信息:OV=0時,差仍在[R0]中,OV=1時,溢出。 FSUB: SETB F0 AS: LCALL MVR1 MOV C,F0 RRC A XRL A,@R1 MOV C,ACC.7 ASN: MOV 1EH,C XRL A,@R0 RLC A MOV F0,C LCALL MVR0 LCALL AS1 MOV0: INC R0 INC R0 inc r0 mov a,r5 mov @r0,a dec r0 MOV A,R4 MOV @R0,A DEC R0 MOV A,R3 MOV @R0,A DEC R0 MOV A,R2 MOV C,1FH MOV ACC.7,C MOV @R0,A CLR ACC.7 CLR OV CJnE A,#3FH,MV01 SETB OV MV01: MOV A,@R0 RET MVR0: MOV A,@R0 MOV C,ACC.7 MOV 1FH,C MOV C,ACC.6 MOV ACC.7,C MOV R2,A INC R0 MOV A,@R0 MOV R3,A INC R0 MOV A,@R0 MOV R4,A inc r0 mov a,@r0 mov r5,a dec r0 DEC R0 DEC R0 RET MVR1: MOV A,@R1 MOV C,ACC.7 MOV 1EH,C MOV C,ACC.6 MOV ACC.7,C MOV 0ch,A ;r4" INC R1 MOV A,@R1 MOV 0dh,A INC R1 MOV A,@R1 MOV 0eh,A INC R1 MOV A,@R1 MOV 0fh,A dec r1 DEC R1 DEC R1 RET AS1: MOV A,0dh ORL A,0eh orl a,0fh JZ AS2 MOV A,R3 ORL A,R4 orl a,r5 JNZ EQ1 mov r3,0dh mov r4,0eh mov r5,0fh ;a2=>a1 ;************ MOV r2,0ch ;************ MOV C,1EH MOV 1FH,C AS2: RET EQ1: MOV A,R2 XRL A,0ch ;jie_ma JZ AS4 JB ACC.7,EQ3 MOV A,R2 CLR C SUBB A,0ch JC EQ4 EQ2: CLR C MOV A,0dh RRC A MOV 0dh,A MOV A,0eh RRC A MOV 0eh,A MOV A,0fh RRC A MOV 0fh,A ;********** INC 0ch ;********** ORL A,0eh orl a,0dh JNZ EQ1 MOV A,R2 MOV 0ch,A ;r4" SJMP AS4 EQ3: MOV A,R2 JNB ACC.7,EQ2 EQ4: CLR C LCALL RR1 ;*************8 orl a,r4 ORL A,R3 JNZ EQ1 MOV A,0ch MOV R2,A AS4: JB F0,AS5 ;**************** MOV A,R5 ADD A,0fh MOV R5,A MOV A,R4 ADDC A,0eh MOV R4,A MOV A,R3 ADDC A,0dh MOV R3,A JNC AS2 LJMP RR1 AS5: CLR C MOV A,R5 SUBB A,0fh MOV B,A ;************ MOV A,R4 SUBB A,0eh mov r6,a;*****temp MOV A,R3 SUBB A,0dh JC AS6 MOV R5,B MOV R3,A mov r4,06h LJMP RLN AS6: CPL 1FH CLR C MOV A,0fh SUBB A,R5 MOV R5,A MOV A,0eh SUBB A,R4 MOV R4,A MOV A,0dh SUBB A,R3 MOV R3,A RLN: MOV A,R3 ORL A,R4 orl a,r5;****2002.6.18 JNZ RLN1 MOV R2,#0C1H RET RLN1: MOV A,R3 JB ACC.7,RLN2 CLR C LCALL RL1 SJMP RLN RLN2: CLR OV RET ;***************** RL1: MOV A,R5 RLC A MOV R5,a ;******* MOV A,R4 RLC A MOV R4,A MOV A,R3 RLC A MOV R3,A DEC R2 CJNE R2,#0C0H,RL1E CLR A MOV R3,A MOV R4,A MOV R5,A MOV R2,#0C1H RL1E: CLR OV RET RR1: MOV A,R3 RRC A MOV R3,A MOV A,R4 RRC A MOV R4,A ;********* MOV A,R5 RRC A MOV R5,A ;*********** INC R2 CLR OV CJNE R2,#40H,RR1E MOV R2,#3FH SETB OV RR1E: RET (9)標號: DTOF 功能:三字節十六進制定點數轉換成格式化浮點數 入口條件:三字節定點數的絕對值在[R0]中,數符在位1FH中,整數部分的位數在A中。 出口信息:轉換成格式化浮點數在[R0]中(四字節)。 DTOF: MOV R2,A ;;按整數的位數初始化階碼 MOV 03h,@R0 ;;將定點數作尾數 INC R0 MOV 04h,@R0 inc r0 mov 05h,@r0 dec r0 DEC R0 LCALL RLN ;;進行規格化 LJMP MOV0 ;;傳送結果到[R0]中 (10) 標號: FINT 功能:浮點取整函數 入口條件:操作數在[R0]中。 出口信息:結果仍在[R0]中。 FINT: LCALL MVR0 LCALL INT LJMP MOV0 ;**************** INT: MOV A,R3 ORL A,R4 orl a,r5 JNZ INTA CLR 1FH MOV R2,#41H RET INTA: MOV A,R2 JZ INTB JB ACC.7,INTB CLR C SUBB A,#24 ;;24 wei JC INTD RET INTB: CLR A MOV R5,A MOV R4,A MOV C,1FH rrc a MOV R3,A Rl A ;2002.6.20!!!!!!!!!! MOV R2,A JNZ INTC MOV R2,#41H INTC: RET INTD: CLR F0 INTE: CLR C LCALL RR1 ORL C,F0 MOV F0,C CJNE R2,#24,INTE JNB F0,INTF JNB 1FH,INTF INC R5 MOV A,R5 JNZ INTF mov a,r4 add a,#01;;;;in mov a,r3 addc a,#00 INTF: LJMP RLN ADD0:CLR C;雙精度加法子程序 ADC0:XCH A,R7;雙精度帶進位位加法子程序 ADDC A,R3 XCH A,R7 XCH A,R6 ADDC A,R2 XCH A,R6 RET SRA0:CLR C;尾數邏輯右移1位子程序 SRA:XCH A,R5;尾數帶進位位右移1位 SRA1:RRC A;A R6 R7帶進位位右移1位,結果在R5 R6 R7中 XCH A,R5 XCH A,R6 RRC A XCH A,R6 XCH A,R7 RRC A XCH A,R7 RET INC3: mov a,r7 add a,#1 mov r7,a mov a,r6 addc a,#0 mov r6,a mov a,r5 addc a,#0 jnz inc321 mov a,#80h inc321: mov r5,a mov a,09h addc a,#0;2002.6.18 mov 09h,a RET0:RET H0: XCH A,R7;尾數帶進位左移1位 RLC A XCH A,R7 XCH A,R6 RLC A XCH A,R6 XCH A,R5 RLC A XCH A,R5 push a dec 09h mov a,09h CJNE a,#0C0H,RL1E11 MOV R5,#0 MOV R6,#0 mov r7,#0 MOV 09h,#0C1H RL1E11: pop a CLR OV RET (11)標號: FSGN 功能:浮點符號函數
入口條件:操作數在[R0]中。 出口信息:累加器 A=1 時為正數,A=0FFH時為負數,A=0 時為零。 FSGN: INC R0 ;;讀尾數 MOV A,@R0 INC R0 ORL A,@R0 INC R0 ORL A,@R0 dec r0 DEC R0 DEC R0 JNZ SGN RET ;;尾數為零,結束 SGN: MOV A,@R0 ;;讀取操作數的階碼 RLC A ;;取數符 MOV A,#1 ;;按正數初始化 JNC SGN1 ;;是正數,結束 MOV A,#0FFH ;;是負數,改變標志 SGN1: RET (12) 標號: FCLR 功能:浮點數清零 入口條件:操作數在[R0]中。 出口信息:操作數被清零。 FCLR: INC R0 INC R0 inc r0 CLR A MOV @R0,A DEC R0 MOV @R0,A DEC R0 MOV @R0,A DEC R0 MOV @R0,#41H RET (13) 標號: FZER 功能:浮點數判零 入口條件:操作數在[R0]中。 出口信息:若累加器A為零,則操作數[R0]為零,否則不為零。 FZER: INC R0 mov a,@r0 INC R0 orl A,@R0 inc r0 orl a,@r0 dec r0 DEC R0 DEC R0 JNZ ZERO MOV @R0,#41H ZERO: RET (14) 標號: FPUSH 功能:浮點數壓棧 入口條件:操作數在[R0]中。 出口信息:操作數壓入棧頂。 FPUSH: POP ACC ;將返回地址保存在R2R3r4中 MOV R2,A POP ACC MOV R3,A pop acc mov r4,a ;******* MOV A,@R0 ;將操作數壓入堆棧 PUSH ACC INC R0 MOV A,@R0 PUSH ACC INC R0 MOV A,@R0 PUSH ACC inc r0 mov a,@r0 push a dec r0 DEC R0 DEC R0 mov a,r4 push a MOV A,R3 ;將返回地址壓入堆棧 PUSH ACC MOV A,R2 PUSH ACC RET ;*************** (15) 標號: FPOP 功能:浮點數出棧 入口條件:操作數處于棧頂。 出口信息:操作數彈至[R0]中。 FPOP: POP ACC ;將返回地址保存在R2R3r4中 MOV R2,A POP ACC MOV R3,A pop a mov r4,a ;********** INC R0 INC R0 inc r0 POP ACC ;將操作數彈出堆棧,傳送到[R0]中 MOV @R0,A DEC R0 POP ACC MOV @R0,A DEC R0 POP ACC MOV @R0,A dec r0 pop a mov @R0,A MOV A,R4 PUSH A MOV A,R3 ;將返回地址壓入堆棧 PUSH ACC MOV A,R2 PUSH ACC RET (16) 標號: FTOD 功能:格式化浮點數轉換成雙字節定點數 入口條件:格式化浮點操作數在[R0]中。 出口信息:OV=1時溢出,OV=0時轉換成功:定點數的絕對值在[R0]中(雙字節),數符 在位1FH中,F0=1 時為整數,CY=1時為一字節整數一字節小數,否則為純小數。 FTOD: LCALL MVR0 ;;將[R0]傳送到第一工作區 MOV A,R2 JZ FTD4 ;;階碼為零,純小數 JB ACC.7,FTD4;;階碼為負,純小數 SETB C SUBB A,#10H JC FTD1 SETB OV ;;階碼大于16,溢出 RET FTD1: SETB C MOV A,R2 SUBB A,#8 ;;階碼大于8否? JC FTD3 FTD2: MOV B,#10H ;;階碼大于8,按雙字節整數轉換 LCALL FTD8 SETB F0 ;;設立雙字節整數標志 CLR C CLR OV RET FTD3: MOV B,#8 ;;按一字節整數一字節小數轉換 LCALL FTD8 SETB C ;;設立一字節整數一字節小數標志 CLR F0 CLR OV RET FTD4: MOV B,#0 ;;按純小數轉換 LCALL FTD8 CLR OV ;;設立純小數標志 CLR F0 CLR C RET FTD8: MOV A,R2 ;;按規定的整數位數進行右規 CJNE A,B,FTD9 MOV A,R3 ;;將雙字節結果傳送到[R0]中 MOV @R0,A INC R0 MOV A,R4 MOV @R0,A inc r0 MOV A,R5 MOV @R0,A DEC R0 dec r0 RET FTD9: CLR C LCALL RR1 ;右規一次 SJMP FTD8 7.uClinux上的應用程序設計 在Project目錄下的Makefile文件如下: ########################################################### # # Makefile – Whole Project makefile. # # Copyright (c) 2001-2002, Tsinghua MAC # ########################################################### # # Get the core stuff worked out # ROOT_DIR = $(shell pwd) SRC_DIR = $(ROOT_DIR)/src CONFIG_DIR = $(ROOT_DIR)/config SCRIPTS_DIR = $(ROOT_DIR)/scripts CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \ else if [ -x /bin/bash ]; then echo /bin/bash; \ else echo sh; fi ; fi) TOPDIR := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi) HPATH = $(TOPDIR)/include FINDHPATH = $(HPATH)/asm $(HPATH)/linux $(HPATH)/scsi $(HPATH)/net export ROOT_DIR SRC_DIR CONFIG_DIR SCRIPTS_DIR HPATH FINDHPATH ########################################################### # normal make targets # # .PHONY: all all: $(MAKE) -C $(SRC_DIR) all ########################################################### # # Config stuff, we recall ourselves to load the new config.arch before # running the kernel and other config scripts # .PHONY: config config: $(CONFIG_DIR)/config.in cd $(CONFIG_DIR); $(CONFIG_SHELL) $(SCRIPTS_DIR)/Configure $(CONFIG_DIR)/config.in @rm -f $(SRC_DIR)/arch.config @if egrep "^CONFIG_DEFAULTS_INTEL_I386" $(CONFIG_DIR)/.config > /dev/null; then \ ln -s "$(CONFIG_DIR)/arch.i386" $(SRC_DIR)/arch.config; \ fi @if egrep "^CONFIG_DEFAULTS_MOTOROLA_M5272C3" $(CONFIG_DIR)/.config > /dev/null; then \ ln -s "$(CONFIG_DIR)/arch.m68k" $(SRC_DIR)/arch.config; \ fi @echo "#This dir.config file is automaticly generated by make config!" > $(SRC_DIR)/dir.config @echo "ROOT_DIR="$(ROOT_DIR) >> $(SRC_DIR)/dir.config @echo "CONFIG_DIR="$(CONFIG_DIR) >> $(SRC_DIR)/dir.config @echo "SRC_DIR="$(SRC_DIR) >> $(SRC_DIR)/dir.config @echo "SCRIPTS_DIR="$(SCRIPTS_DIR) >> $(SRC_DIR)/dir.config @echo "HPATH="$(HPATH) >> $(SRC_DIR)/dir.config @echo "FINDPATH="$(FINDPATH) >> $(SRC_DIR)/dir.config ########################################################### # # normal make dependancy # # .PHONY: dep dep: $(MAKE) -C $(SRC_DIR) dep # This one removes all executables from the tree and forces their relinking clean: $(MAKE) -C $(SRC_DIR) clean test: $(MAKE) -C $(SRC_DIR) test run: $(MAKE) -C $(SRC_DIR) run config_error: @echo "*************************************************" @echo "You have not run make config." @echo "The build sequence for this source tree is:" @echo "1. "make config" or "make xconfig"" @echo "2. "make dep"" @echo "3. "make"" @echo "*************************************************" @exit 1 ########################################################### src目錄下的Makefile文件,如下: VERSION = 2 PATCHLEVEL = 0 SUBLEVEL = 39 UCRELEASE = uc2 .EXPORT_ALL_VARIABLES: CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \ else if [ -x /bin/bash ]; then echo /bin/bash; \ else echo sh; fi ; fi) TOPDIR := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi) TARGET = ESGateway all: $(TARGET) # Include the make variables (CC, etc...) # SUBDIRS = public serial packet cal xml fifo main interface $(TARGET): @set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i all_targets; done linuxsubdirs: dummy set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i; done clean: @set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i clean; done dep: @set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i fastdep; done .PHONY: test test: @set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i test; done run: # @set -e; for i in $(SUBDIRS); do $(MAKE) -i -C $$i run; read junk; done make -C main run src目錄下的Rules.make文件給出了編譯的一些規則,如下: # # This file contains rules which are shared between multiple Makefiles. # # # False targets. # .PHONY: dummy # # Special variables which should not be exported # unexport EXTRA_ASFLAGS unexport EXTRA_CFLAGS ifneq "$(ARCH)" "h8300" unexport EXTRA_LDFLAGS endif unexport EXTRA_ARFLAGS unexport SUBDIRS unexport SUB_DIRS unexport ALL_SUB_DIRS unexport MOD_SUB_DIRS unexport O_TARGET unexport O_OBJS unexport L_OBJS unexport M_OBJS unexport MI_OBJS unexport ALL_MOBJS # objects that export symbol tables unexport OX_OBJS unexport LX_OBJS unexport MX_OBJS unexport MIX_OBJS unexport SYMTAB_OBJS unexport MOD_LIST_NAME include ../dir.config include $(SRC_DIR)/arch.config # # Get things started. # first_rule: sub_dirs $(MAKE) all_targets # # Common rules # INC_DIR = -I$(SRC_DIR)/cal -I$(SRC_DIR)/xml -I$(SRC_DIR)/serial -I$(SRC_DIR)/packet -I$(SRC_DIR)/fifo -I$(SRC_DIR)/ping -I$(SRC_DIR)/interface -I$(SRC_DIR)/public %.o: %.c @echo "Compiling..." @echo "$<" $(CXX) $(INC_DIR) $(CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $< %.o: %.cpp @echo "Compiling..." @echo "$<" $(CXX) $(INC_DIR) $(CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $< # Rule to compile a set of .o files into one .o file # ifeq (.depend,$(wildcard .depend)) include .depend else .depend: fastdep endif ifneq ($(O_TARGET),$(O_OBJS)) $(O_TARGET): .depend $(O_OBJS) @echo "Linking..." @echo $(O_OBJS) " --> " $@ @$(LD) $(EXTRA_LDFLAGS) -r -o $@ $(O_OBJS) else $(O_TARGET): .depend endif # # # all: $(O_OBJS) echo all all_targets: $(O_OBJS) $(O_TARGET) # # # Rule to compile a set of .o files into one .a file # ifdef L_TARGET $(L_TARGET): $(LX_OBJS) $(L_OBJS) rm -f $@ $(AR) $(EXTRA_ARFLAGS) rcs $@ $(LX_OBJS) $(L_OBJS) endif # # This make dependencies quickly # fastdep: dummy @echo "make fastdep" if [ -n "$(wildcard *.[chS])" ]; then \ $(SCRIPTS_DIR)/mkdep *.[chS] > .depend; fi if [ -n "$(wildcard *.cpp)" ]; then \ $(SCRIPTS_DIR)/mkdep *.cpp >> .depend; fi # # A rule to make subdirectories # sub_dirs: dummy ifdef SUB_DIRS set -e; for i in $(SUB_DIRS); do $(MAKE) -C $$i; done endif # # A rule to do nothing # dummy: config: cd $(ROOT_DIR); make config c clean: rm -f *.o rm -f *.gdb rm -f .depend rm -f test rm -f core rm -f *.elf rm -f *.elf2flt # # This is useful for testing # script: $(SCRIPT) run: test @echo ... running ... @echo `pwd`/test @./test # # This sets version suffixes on exported symbols # Uses SYMTAB_OBJS # Separate the object into "normal" objects and "exporting" objects # Exporting objects are: all objects that define symbol tables # $(MX_OBJS): $(CC) $(CFLAGS) -DEXPORT_SYMTAB -c $(@:.o=.c) $(LX_OBJS) $(OX_OBJS): $(CC) $(CFLAGS) -DMODVERSIONS -DEXPORT_SYMTAB -c $(@:.o=.c) $(M_OBJS): ifdef MAKING_MODULES $(O_OBJS) $(L_OBJS): endif 在config 目錄下,編寫兩個和架構有關的文件,對于x86平臺,是arch.i386,如下: .EXPORT_ALL_VARIABLES: ################################################################### # # Vendor specific settings # CONSOLE_BAUD_RATE = 19200 ################################################################### # # The makefiles need to know how to do things in different contexts # To save some pain we put it all here # # First settings we always want for all build # # ARCH = kernel, TARGET_ARCH = uClibc MACHINE = i386 ARCH = i386 CROSS_COMPILE = CROSS = $(CROSS_COMPILE) # We"ve used -m5307 here because the bulk of the 5272 instruction timings # happen to be closer to the 5307 than the 5200 series. Luckily, the # actual instructions on the two processors are essentially identical. # This should be fixed at some stage. CPUFLAGS = CC = $(CROSS_COMPILE)gcc AS = $(CROSS_COMPILE)as CXX = $(CROSS_COMPILE)g++ AR = $(CROSS_COMPILE)ar LD = $(CROSS_COMPILE)ld OBJCOPY = $(CROSS_COMPILE)objcopy RANLIB = $(CROSS_COMPILE)ranlib STRIPTOOL = $(CROSS_COMPILE)strip STRIP = $(STRIPTOOL) UCLINUX_BUILD_SET = 0 # have we set a special config below ################################################################### # # General purpose lib building rules, uClibc.config uses these when # possible # ################################################################### # Settings for building user apps # CFLAGS = -Wall -Wstrict-prototypes -O2 -g #CFLAGS = -Wstrict-prototypes -g LDFLAGS = -m elf_i386 ################################################################### # fall through, do other config options perhaps # ifeq ($(UCLINUX_BUILD_SET),1) endif ################################################################### 在config 目錄下,對于嵌入式平臺,是arch.m68k,如下: .EXPORT_ALL_VARIABLES: ################################################################### # # Vendor specific settings # CONSOLE_BAUD_RATE = 19200 ################################################################### # # The makefiles need to know how to do things in different contexts # To save some pain we put it all here # # First settings we always want for all build # # ARCH = kernel, TARGET_ARCH = uClibc MACHINE = m68k ARCH = m68knommu CROSS_COMPILE = m68k-elf- CROSS = $(CROSS_COMPILE) # We"ve used -m5307 here because the bulk of the 5272 instruction timings # happen to be closer to the 5307 than the 5200 series. Luckily, the # actual instructions on the two processors are essentially identical. # This should be fixed at some stage. CPUFLAGS = -m5200 CC = $(CROSS_COMPILE)gcc AS = $(CROSS_COMPILE)as CXX = $(CROSS_COMPILE)g++ AR = $(CROSS_COMPILE)ar LD = $(CROSS_COMPILE)ld OBJCOPY = $(CROSS_COMPILE)objcopy RANLIB = $(CROSS_COMPILE)ranlib ELF2FLT = elf2flt STRIPTOOL = $(CROSS_COMPILE)strip STRIP = $(STRIPTOOL) UCLINUX_BUILD_SET = 0 # have we set a special config below ################################################################### # # Settings for building user apps # #CFLAGS = -m5200 -msep-data -g CFLAGS = -m5200 -msep-data LDFLAGS = -Wl,-elf2flt SYSLIBS = -lc -lstdc++ -lgcc ################################################################### # # fall through, do other config options perhaps # ifeq ($(UCLINUX_BUILD_SET),1) endif ################################################################### 在config 目錄下的config.in文件如下: mainmenu_name "uClinux Configuration" mainmenu_option next_comment comment "Target Platform Selection" comment "Choose a Vendor/Product combination." choice "Vendor/Product [Intel/i386 | Motorola/M5307C3] " "1 CONFIG_DEFAULTS_INTEL_I386 \ 2 CONFIG_DEFAULTS_MOTOROLA_M5307C3 \ " Intel/i386 endmenubsp; /*產生停止位*/ return (1); /*錯誤*/ Delay(10); SDA = 1; return (0); } } return (1); /*錯誤*/ } 3.8 T2中斷服務程序 T2中斷服務程序int_timer2_handler用于發送、接受數據,每次中斷發送或接受一位數據。程序清單如下: void int_timer2_handler(void) interrupt 0x22 { if (TX_RX) {/*接收模式*/ SCL = 1; bit_count++; if (bit_count <= 8) { if (SDA) rec_data |= mask; /*接收字節存于變量rec_data中*/ else { time_out = period; /*用于延時*/ SCL = 1; } mask = mask >> 1; SCL = 0; if (bit_count == 8) { DSDA = 1; /*設置SDA為輸出*/ if (Ackge) /*置應答位*/ SDA = 1; else SDA = 0; } } else if (bit_count == 9) {/*一個字節接收結束*/ if (bit_count == 9) /*延時*/ { SCL = 1; SCL = 1; SCL = 1; T2IE = 0; /*中斷復位*/ T3IE = 0; T2IR = 0; T3R = 0; COM_ON = 0; /*通信結束*/ SCL = 0; } } } /*發送模式*/ else { SCL = 1; bit_count++; if (bit_count <= 8) { temp_SDA = 0; if (mask & input_data) /*準備下一位*/ temp_SDA = 1; mask = mask >> 1; SCL = 0; if (bit_count != 8) SDA = temp_SDA; /*當時鐘為低時發送一位數據 */ else DSDA = 0; /*釋放SDA以接收ack位*/ } else if (bit_count == 9) { RecAck = SDA; /*在第9個時鐘周期讀應答位*/ if (bit_count == 9) /*延時*/ { SCL = 1; /*1字節發送結束*/ T2IE = 0; T3IE = 0; T2IR = 0; T3R = 0; COM_ON = 0; /*通信結束*/ SCL = 0; } } } /*發送結束*/ } 虛擬軟件包見文件:I2c_hw。 6.MCS-51四字節浮點庫及其使用說明
浮點庫程序清單如下: 程序清單: (1) 標號: BTOF 功能:浮點BCD碼轉換成格式化浮點數 入口條件:浮點BCD碼操作數在[R0]中。 出口信息:轉換成的格式化浮點數仍在[R0]中。 BTOF: INC R0 INC R0 inc r0;read L MOV 07h,@R0 DEC R0 MOV 06h,@R0 DEC R0 mov 05h,@r0 ;r5r6r7=0.hml(dec) dec r0 ;;r0 to jie_ma mov a,r7 ORL A,R6 orl a,r5 jnz btf0 ;jb r5r6r7=0 MOV @R0,#41H RET BTF0: MOV A,@R0 MOV C,ACC.7 MOV 1DH,C CLR 1FH MOV C,ACC.6 MOV ACC.7,C MOV @R0,A JNC BTF1 ADD A,#19 JC BTF2 MOV @R0,#41H INC R0 MOV @R0,#0 INC R0 MOV @R0,#0 inc r0 MOV @R0,#0 DEC R0 DEC R0 dec r0 RET BTF1: SUBB A,#19 JC BTF2 MOV A,#3FH MOV C,1DH MOV ACC.7,C MOV @R0,A INC R0 MOV @R0,#0FFH INC R0 MOV @R0,#0FFH inc r0 MOV @R0,#0FFH dec r0 DEC R0 DEC R0 RET BTF2: CLR A ;use r1.r2r3r4 MOV R4,A MOV R3,A MOV R2,a mov r1,#24 ;3byte =3*8=24 BTF3: MOV A,R7 ADD A,R7 DA A MOV R7,A MOV A,R6 ADDC A,R6 DA A MOV R6,A mov a,r5 addc a,r5 da a mov r5,a;r5r6r7*2 MOV A,R4 RLC A MOV R4,A MOV A,R3 RLC A MOV R3,A mov a,r2 rlc a mov r2,a ;count .r5r6r7(10)=>.r2r3r4(2) DEC R1 JNB ACC.7,BTF3 MOV A,R5 ADD A,#0B0H CLR A ADDC A,R4 MOV R4,A CLR A ADDC A,R3 MOV R3,A CLR A ADDC A,R2 MOV R2,A JNC BTF4 MOV R2,#80H INC R1 BTF4: MOV DPTR,#BTFL MOV A,@R0 ADD A,#19 MOV B,#4 ;4 byte MUL AB ADD A,DPL MOV DPL,A JNC BTF5 INC DPH BTF5: CLR A MOVC A,@A+DPTR MOV C,ACC.6 MOV ACC.7,C MOV 0ch,A ;r4"=0ch MOV A,#1 MOVC A,@A+DPTR MOV 0dh,A MOV A,#2 MOVC A,@A+DPTR MOV 0eh,A MOV A,#3 MOVC A,@A+DPTR MOV 0fh,A LCALL MUL1 MOV C,1DH MOV 1FH,C LJMP MOV0 (2) 標號: FTOB 功能:格式化浮點數轉換成浮點BCD碼 入口條件:格式化浮點操作數在[R0]中。 出口信息:轉換成的浮點BCD碼仍在[R0]中。 FTOB: INC R0 MOV A,@R0 ;h INC R0 ORL A,@R0 ;m inc r0 orl a,@r0 ;l dec r0 DEC R0 DEC R0 JNZ FTB0 MOV @R0,#41H RET FTB0: MOV A,@R0 MOV C,ACC.7 MOV 1DH,C CLR ACC.7 MOV @R0,A LCALL MVR0 MOV DPTR,#BFL0 MOV B,#0 MOV A,R2 JNB ACC.7,FTB1 MOV DPTR,#BTFL MOV B,#0EDH ADD A,#16 JNC FTB1 MOV DPTR,#BFLN MOV B,#0FAH FTB1: CLR A MOVC A,@A+DPTR MOV C,ACC.6 MOV ACC.7,C MOV 0ch,A ;r4" MOV A,#1 MOVC A,@A+DPTR MOV 0dh,A MOV A,#2 MOVC A,@A+DPTR MOV 0eh,A MOV A,#3 MOVC A,@A+DPTR MOV 0fh,A MOV A,0ch ;r4" jie_ma CLR C SUBB A,R2 JB ACC.7,FTB2 JNZ FTB3 MOV A,0dh ;0.r5"r6"r7"-0.r3r4r5 CLR C SUBB A,R3 JC FTB2 JNZ FTB3 MOV A,0eh;r6"-r4;;;2002.6.18 CLR C SUBB A,r4 JC FTB2 JNZ FTB3 MOV 0ah,B INC 0ah MOV 0dh,#10h;0.100000 MOV r6,#0 MOV r7,#0 SJMP FTB6 FTB2: INC DPTR INC DPTR INC DPTR inc dptr ;4byte INC B SJMP FTB1 FTB3: PUSH B CALL DIV3 FTB4: MOV A,r2 JZ FTB5 CLR C LCALL RR1 SJMP FTB4 FTB5: POP 0ah LCALL HB2 MOV 0dh,A;r5" LCALL HB2 MOV R6,A LCALL HB2 MOV R7,A MOV A,R3 RLC A CLR A ADDC A,R7 DA A MOV R7,A CLR A ADDC A,R6 DA A MOV R6,A JNC FTB6 MOV R6,#10H INC 0dh FTB6: INC R0 INC R0 inc r0 MOV A,R7 MOV @R0,A DEC R0 MOV A,R6 MOV @R0,A DEC R0 MOV A,0dh mov @r0,a dec r0 mov a,0ah MOV C,1DH MOV ACC.7,C MOV @R0,A RET ;[r3r4r5*100]\10=>bcd1,2 HB2: MOV A,R5 MOV B,#100 MUL AB MOV R5,A MOV A,B XCH A,R4 MOV B,#100 MUL AB ADD A,R4 MOV R4,A ;JNC HB21 mov a,B addc a,#0 xch a ,r3 mov b,#100 mul ab add a,r3 mov r3,a mov a,b addc a,#0 HB21: ;MOV A,B MOV B,#10 DIV AB SWAP A ORL A,B RET BTFL: DB 41H,0ECH,1EH ,4ah;10e-19 DB 45H,93H,92H,0efh;10e-18 DB 48H,0B8H,77H,0aah;10e-17 DB 4BH,0E6H,95H,95h;10e-16 DB 4FH,90H,1DH ,7dh;10e-15 DB 52H,0B4H,24H,0dch;10e-14 DB 55H,0E1H,2EH,13h;10e-13 DB 59H,8CH,0BcH,0cch;10e-12 DB 5CH,0AFH,0EbH,0ffh;10e-11 DB 5FH,0DBH,0E6H,0ffh;10e-10 DB 63H,89H,70H ,5fh;10e-9 DB 66H,0ABH,0CCH,77h;10e-8 DB 69H,0D6H,0bfH,95h;10e-7 BFLN: DB 6DH,86H,37H ,0bdh;10e-6 DB 70H,0A7H,0C5H,0ach;10e-5 DB 73H,0D1H,0B7H,17h;10e-4 DB 77H,83H,12H ,6fh;10e-3 DB 7AH,0A3H,0D7H,0ah;10e-2 DB 7DH,0CCH,0CcH,0cdh;10e-1 BFL0: DB 1,80H,00H ,00h;10e0 DB 4,0A0H,00H,00h;10e1 DB 7,0C8H,00H,00h;10e2 DB 0AH,0FAH,00H,00h;10e3 DB 0EH,9CH,40H,00h;10e4 DB 11H,0C3H,50H,00;10e5 DB 14H,0F4H,24H,00h;10e6 DB 18H,98H,96H,80h;10e7 DB 1BH,0BEH,0BCH,20h;10e8 DB 1EH,0EEH,6BH,28h;10e9 DB 22H,95H,02H,0f9h;10e10 DB 25H,0BAH,43H,0b7h;10e11 DB 28H,0E8H,0D4h,0a5h;10e12 DB 2CH,91H,84H,0e7h;10e13 DB 2FH,0B5H,0E6H,20h;10e14 DB 32H,0E3H,5fH,0a9h;10e15 DB 36H,8EH,1bH,0cah;10e16 DB 39H,0c1H,0A2H,0cdh;10e17 DB 3CH,0DEH,0BH,5bh;10e18 DB 40H,8AH,0d7H,23h;10e19 (3) 標號: FMUL 功能:浮點數乘法 入口條件:被乘數在[R0]中,乘數在[R1]中。 出口信息:OV=0時,積仍在[R0]中,OV=1時,溢出。 FMUL: LCALL MVR0 MOV A,@R0 XRL A,@R1 RLC A MOV 1FH,C LCALL MUL0 LJMP MOV0 MUL0: LCALL MVR1 mov 01h,02h mov 02h,03h mov 03h,04h mov 04h,05h ;;**************8 MUL1: ;*********** MOV A,R2 ;;第一尾數為零否? ORL A,R3 orl a,r4 JZ MUL6 MOV A,0dh ;;第二尾數為零否? ORL A,0eh orl a,0fh JZ MUL5;計算r2R3R4×r5R6R7-→r2R3R4 ;************ mov 08h,r0;jie_ma piont mov 09h,r1;jie_ma mov 01h,r2 mov 02h,r3 mov 03h,r4 ;************ MOV R0,#25;右移相加25次 CLR A MOV R6,A MOV R7,A;ACC,R6,R7為部分積累加器 CLR C LOOP1:JNC M2 CALL ADD0 ADDC A,R1;乘數移出位等于1 ,被乘數往部分積里加1次 M2:CALL SRA1 XCH A,R5 CPL RS0 CALL SRA CPL RS0;部分積帶進位位整體右移1位 DJNZ R0,LOOP1 MOV R5,A JB ACC.7,M3;查積最高位 MOV A,0DH RLC A CALL H0;積最高位為0,積整體算術左移1位 JNB ACC.7,Mul3 CALL INC3;尾數截去部分四舍五入 SJMP mul3 M3: MOV A,0DH JNB ACC.7,mul3;2002 CALL INC3;尾數截去部分四舍五入 ;sjmp mul3 ;*************** MUL3: ;*********** mov r0,08h mov 03h,r5 mov 04h,r6 mov 05h,r7 ;************* MOV A,09h ADD A,0ch MD: MOV r2,A JB ACC.7,MUL4 JNB ACC.6,MUL6 MOV r2,#3FH SETB OV RET MUL4: JB ACC.6,MUL6 MUL5: CLR A mov r5,a ;out r2.r3r4r5=fu(2) MOV R3,A MOV R4,A MOV R2,#41H MUL6: CLR OV RET (4) 標號: FDIV 功能:浮點數除法 入口條件:被除數在[R0]中,除數在[R1]中。 出口信息:OV=0時,商仍在[R0]中,OV=1時,溢出。 FDIV: INC R0 MOV A,@R0 INC R0 ORL A,@R0 inc r0 orl a,@r0 dec r0 DEC R0 DEC R0 JNZ DIV1 MOV @R0,#41H CLR OV RET DIV1: INC R1 MOV A,@R1 INC R1 ORL A,@R1 inc r1 orl a,@r1 dec r1 DEC R1 DEC R1 JNZ DIV2 SETB OV RET DIV2: LCALL MVR0 MOV A,@R0 XRL A,@R1 RLC A MOV 1FH,C LCALL MVR1 LCALL DIV3 LJMP MOV0 DIV3: CLR C ;r3r4r5-r5"r6"r7" MOV A,R5 ;ASUBB A,0fh mov a,r4 subb a,0eh mov a,r3 subb a,0dh JC DIV4 CALL RR1 SJMP DIV3 DIV4: mov 08h,r0 mov 09h,r1 mov 0ah,r2 CLR A mov r0,a mov r1,a mov r2,a MOV B,#24 ;r3r4r5/r5"r6"r7"=>r0r1r2 DIV5: CLR C mov a,r2 rlc a mov r2,a MOV A,R1 RLC A MOV R1,A MOV A,R0 RLC A MOV R0,A MOV A,R5 RLC A MOV R5,A XCH A,R4 RLC A XCH A,R4 XCH A,R3 RLC A XCH A,R3 MOV F0,C CLR C SUBB A,0fh;r7" MOV r7,A ;r7 temp MOV A,R4 SUBB A,0eh MOV r6,A MOV A,R3 SUBB A,0dh ANL C,/F0 JC DIV6 MOV R3,A MOV 05h,07h;r7 mov 04h,06h INC R2 DIV6: DJNZ B,DIV5 MOV A,0dh CLR C RRC A SUBB A,R3 CLR A ADDC A,R2 MOV R5,A CLR A ADDC A,R1 MOV R4,A CLR A ADDC A,R0 MOV R3,A mov r0,08h mov r1,09h mov r2,0ah MOV A,R2 CLR C SUBB A,0ch LCALL MD LJMP RLN (5) 標號: FMOV 功能:浮點數傳送 入口條件:源操作數在[R1]中,目標地址為[R0]。 出口信息:[R0]=[R1],[R1]不變。 FMOV: INC R0 INC R0 inc r0 INC R1 INC R1 inc r1 MOV A,@R1 MOV @R0,A DEC R0 DEC R1 MOV A,@R1 MOV @R0,A DEC R0 DEC R1 MOV A,@R1 MOV @R0,A DEC R0 DEC R1 MOV A,@R1 MOV @R0,A RET (6) 標號: FCMP 功能:浮點數代數值比較(不影響待比較操作數) 入口條件:待比較操作數分別在[R0]和[R1]中。 出口信息:若CY=1,則[R0] < [R1],若CY=0且A=0則 [R0] = [R1],否則[R0] > [R1]。 FCMP: MOV A,@R0 XRL A,@R1 JNB ACC.7,CMP2 MOV A,@R0 RLC A MOV A,#0FFH RET CMP2: MOV A,@R1 MOV C,ACC.6 MOV ACC.7,C MOV B,A MOV A,@R0 MOV C,ACC.7 MOV F0,C MOV C,ACC.6 MOV ACC.7,C CLR C SUBB A,B JZ CMP6 RLC A JNB F0,CMP5 CPL C CMP5: MOV A,#0FFH RET ;************ CMP6: INC R0 INC R0 inc r0 inc r1 INC R1 INC R1 CLR C MOV A,@R0 SUBB A,@R1 MOV B,A DEC R0 DEC R1 MOV A,@R0 SUBB A,@R1 DEC R0 DEC R1 ;*********** mov 0fh,a;r7" MOV A,@R0 SUBB A,@R1 dec r0 dec r1 ORL A,0fh orl a,b JZ CMP7 JNB F0,CMP7 CPL C CMP7: RET (7) 標號: FADD 功能:浮點數加法 入口條件:被加數在[R0]中,加數在[R1]中。 出口信息:OV=0時,和仍在[R0]中,OV=1時,溢出。 FADD: CLR F0 ;設立加法標志 SJMP AS ;計算代數和 FADD: CLR F0 SJMP AS (8) 標號: FSUB 功能:浮點數減法 入口條件:被減數在[R0]中,減數在[R1]中。 出口信息:OV=0時,差仍在[R0]中,OV=1時,溢出。 FSUB: SETB F0 AS: LCALL MVR1 MOV C,F0 RRC A XRL A,@R1 MOV C,ACC.7 ASN: MOV 1EH,C XRL A,@R0 RLC A MOV F0,C LCALL MVR0 LCALL AS1 MOV0: INC R0 INC R0 inc r0 mov a,r5 mov @r0,a dec r0 MOV A,R4 MOV @R0,A DEC R0 MOV A,R3 MOV @R0,A DEC R0 MOV A,R2 MOV C,1FH MOV ACC.7,C MOV @R0,A CLR ACC.7 CLR OV CJnE A,#3FH,MV01 SETB OV MV01: MOV A,@R0 RET MVR0: MOV A,@R0 MOV C,ACC.7 MOV 1FH,C MOV C,ACC.6 MOV ACC.7,C MOV R2,A INC R0 MOV A,@R0 MOV R3,A INC R0 MOV A,@R0 MOV R4,A inc r0 mov a,@r0 mov r5,a dec r0 DEC R0 DEC R0 RET MVR1: MOV A,@R1 MOV C,ACC.7 MOV 1EH,C MOV C,ACC.6 MOV ACC.7,C MOV 0ch,A ;r4" INC R1 MOV A,@R1 MOV 0dh,A INC R1 MOV A,@R1 MOV 0eh,A INC R1 MOV A,@R1 MOV 0fh,A dec r1 DEC R1 DEC R1 RET AS1: MOV A,0dh ORL A,0eh orl a,0fh JZ AS2 MOV A,R3 ORL A,R4 orl a,r5 JNZ EQ1 mov r3,0dh mov r4,0eh mov r5,0fh ;a2=>a1 ;************ MOV r2,0ch ;************ MOV C,1EH MOV 1FH,C AS2: RET EQ1: MOV A,R2 XRL A,0ch ;jie_ma JZ AS4 JB ACC.7,EQ3 MOV A,R2 CLR C SUBB A,0ch JC EQ4 EQ2: CLR C MOV A,0dh RRC A MOV 0dh,A MOV A,0eh RRC A MOV 0eh,A MOV A,0fh RRC A MOV 0fh,A ;********** INC 0ch ;********** ORL A,0eh orl a,0dh JNZ EQ1 MOV A,R2 MOV 0ch,A ;r4" SJMP AS4 EQ3: MOV A,R2 JNB ACC.7,EQ2 EQ4: CLR C LCALL RR1 ;*************8 orl a,r4 ORL A,R3 JNZ EQ1 MOV A,0ch MOV R2,A AS4: JB F0,AS5 ;**************** MOV A,R5 ADD A,0fh MOV R5,A MOV A,R4 ADDC A,0eh MOV R4,A MOV A,R3 ADDC A,0dh MOV R3,A JNC AS2 LJMP RR1 AS5: CLR C MOV A,R5 SUBB A,0fh MOV B,A ;************ MOV A,R4 SUBB A,0eh mov r6,a;*****temp MOV A,R3 SUBB A,0dh JC AS6 MOV R5,B MOV R3,A mov r4,06h LJMP RLN AS6: CPL 1FH CLR C MOV A,0fh SUBB A,R5 MOV R5,A MOV A,0eh SUBB A,R4 MOV R4,A MOV A,0dh SUBB A,R3 MOV R3,A RLN: MOV A,R3 ORL A,R4 orl a,r5;****2002.6.18 JNZ RLN1 MOV R2,#0C1H RET RLN1: MOV A,R3 JB ACC.7,RLN2 CLR C LCALL RL1 SJMP RLN RLN2: CLR OV RET ;***************** RL1: MOV A,R5 RLC A MOV R5,a ;******* MOV A,R4 RLC A MOV R4,A MOV A,R3 RLC A MOV R3,A DEC R2 CJNE R2,#0C0H,RL1E CLR A MOV R3,A MOV R4,A MOV R5,A MOV R2,#0C1H RL1E: CLR OV RET RR1: MOV A,R3 RRC A MOV R3,A MOV A,R4 RRC A MOV R4,A ;********* MOV A,R5 RRC A MOV R5,A ;*********** INC R2 CLR OV CJNE R2,#40H,RR1E MOV R2,#3FH SETB OV RR1E: RET (9)標號: DTOF 功能:三字節十六進制定點數轉換成格式化浮點數 入口條件:三字節定點數的絕對值在[R0]中,數符在位1FH中,整數部分的位數在A中。 出口信息:轉換成格式化浮點數在[R0]中(四字節)。 DTOF: MOV R2,A ;;按整數的位數初始化階碼 MOV 03h,@R0 ;;將定點數作尾數 INC R0 MOV 04h,@R0 inc r0 mov 05h,@r0 dec r0 DEC R0 LCALL RLN ;;進行規格化 LJMP MOV0 ;;傳送結果到[R0]中 (10) 標號: FINT 功能:浮點取整函數 入口條件:操作數在[R0]中。 出口信息:結果仍在[R0]中。 FINT: LCALL MVR0 LCALL INT LJMP MOV0 ;**************** INT: MOV A,R3 ORL A,R4 orl a,r5 JNZ INTA CLR 1FH MOV R2,#41H RET INTA: MOV A,R2 JZ INTB JB ACC.7,INTB CLR C SUBB A,#24 ;;24 wei JC INTD RET INTB: CLR A MOV R5,A MOV R4,A MOV C,1FH rrc a MOV R3,A Rl A ;2002.6.20!!!!!!!!!! MOV R2,A JNZ INTC MOV R2,#41H INTC: RET INTD: CLR F0 INTE: CLR C LCALL RR1 ORL C,F0 MOV F0,C CJNE R2,#24,INTE JNB F0,INTF JNB 1FH,INTF INC R5 MOV A,R5 JNZ INTF mov a,r4 add a,#01;;;;in mov a,r3 addc a,#00 INTF: LJMP RLN ADD0:CLR C;雙精度加法子程序 ADC0:XCH A,R7;雙精度帶進位位加法子程序 ADDC A,R3 XCH A,R7 XCH A,R6 ADDC A,R2 XCH A,R6 RET SRA0:CLR C;尾數邏輯右移1位子程序 SRA:XCH A,R5;尾數帶進位位右移1位 SRA1:RRC A;A R6 R7帶進位位右移1位,結果在R5 R6 R7中 XCH A,R5 XCH A,R6 RRC A XCH A,R6 XCH A,R7 RRC A XCH A,R7 RET INC3: mov a,r7 add a,#1 mov r7,a mov a,r6 addc a,#0 mov r6,a mov a,r5 addc a,#0 jnz inc321 mov a,#80h inc321: mov r5,a mov a,09h addc a,#0;2002.6.18 mov 09h,a RET0:RET H0: XCH A,R7;尾數帶進位左移1位 RLC A XCH A,R7 XCH A,R6 RLC A XCH A,R6 XCH A,R5 RLC A XCH A,R5 push a dec 09h mov a,09h CJNE a,#0C0H,RL1E11 MOV R5,#0 MOV R6,#0 mov r7,#0 MOV 09h,#0C1H RL1E11: pop a CLR OV RET (11)標號: FSGN 功能:浮點符號函數
入口條件:操作數在[R0]中。 出口信息:累加器 A=1 時為正數,A=0FFH時為負數,A=0 時為零。 FSGN: INC R0 ;;讀尾數 MOV A,@R0 INC R0 ORL A,@R0 INC R0 ORL A,@R0 dec r0 DEC R0 DEC R0 JNZ SGN RET ;;尾數為零,結束 SGN: MOV A,@R0 ;;讀取操作數的階碼 RLC A ;;取數符 MOV A,#1 ;;按正數初始化 JNC SGN1 ;;是正數,結束 MOV A,#0FFH ;;是負數,改變標志 SGN1: RET (12) 標號: FCLR 功能:浮點數清零 入口條件:操作數在[R0]中。 出口信息:操作數被清零。 FCLR: INC R0 INC R0 inc r0 CLR A MOV @R0,A DEC R0 MOV @R0,A DEC R0 MOV @R0,A DEC R0 MOV @R0,#41H RET (13) 標號: FZER 功能:浮點數判零 入口條件:操作數在[R0]中。 出口信息:若累加器A為零,則操作數[R0]為零,否則不為零。 FZER: INC R0 mov a,@r0 INC R0 orl A,@R0 inc r0 orl a,@r0 dec r0 DEC R0 DEC R0 JNZ ZERO MOV @R0,#41H ZERO: RET (14) 標號: FPUSH 功能:浮點數壓棧 入口條件:操作數在[R0]中。 出口信息:操作數壓入棧頂。 FPUSH: POP ACC ;將返回地址保存在R2R3r4中 MOV R2,A POP ACC MOV R3,A pop acc mov r4,a ;******* MOV A,@R0 ;將操作數壓入堆棧 PUSH ACC INC R0 MOV A,@R0 PUSH ACC INC R0 MOV A,@R0 PUSH ACC inc r0 mov a,@r0 push a dec r0 DEC R0 DEC R0 mov a,r4 push a MOV A,R3 ;將返回地址壓入堆棧 PUSH ACC MOV A,R2 PUSH ACC RET ;*************** (15) 標號: FPOP 功能:浮點數出棧 入口條件:操作數處于棧頂。 出口信息:操作數彈至[R0]中。 FPOP: POP ACC ;將返回地址保存在R2R3r4中 MOV R2,A POP ACC MOV R3,A pop a mov r4,a ;********** INC R0 INC R0 inc r0 POP ACC ;將操作數彈出堆棧,傳送到[R0]中 MOV @R0,A DEC R0 POP ACC MOV @R0,A DEC R0 POP ACC MOV @R0,A dec r0 pop a mov @R0,A MOV A,R4 PUSH A MOV A,R3 ;將返回地址壓入堆棧 PUSH ACC MOV A,R2 PUSH ACC RET (16) 標號: FTOD 功能:格式化浮點數轉換成雙字節定點數 入口條件:格式化浮點操作數在[R0]中。 出口信息:OV=1時溢出,OV=0時轉換成功:定點數的絕對值在[R0]中(雙字節),數符 在位1FH中,F0=1 時為整數,CY=1時為一字節整數一字節小數,否則為純小數。 FTOD: LCALL MVR0 ;;將[R0]傳送到第一工作區 MOV A,R2 JZ FTD4 ;;階碼為零,純小數 JB ACC.7,FTD4;;階碼為負,純小數 SETB C SUBB A,#10H JC FTD1 SETB OV ;;階碼大于16,溢出 RET FTD1: SETB C MOV A,R2 SUBB A,#8 ;;階碼大于8否? JC FTD3 FTD2: MOV B,#10H ;;階碼大于8,按雙字節整數轉換 LCALL FTD8 SETB F0 ;;設立雙字節整數標志 CLR C CLR OV RET FTD3: MOV B,#8 ;;按一字節整數一字節小數轉換 LCALL FTD8 SETB C ;;設立一字節整數一字節小數標志 CLR F0 CLR OV RET FTD4: MOV B,#0 ;;按純小數轉換 LCALL FTD8 CLR OV ;;設立純小數標志 CLR F0 CLR C RET FTD8: MOV A,R2 ;;按規定的整數位數進行右規 CJNE A,B,FTD9 MOV A,R3 ;;將雙字節結果傳送到[R0]中 MOV @R0,A INC R0 MOV A,R4 MOV @R0,A inc r0 MOV A,R5 MOV @R0,A DEC R0 dec r0 RET FTD9: CLR C LCALL RR1 ;右規一次 SJMP FTD8 7.uClinux上的應用程序設計 在Project目錄下的Makefile文件如下: ########################################################### # # Makefile – Whole Project makefile. # # Copyright (c) 2001-2002, Tsinghua MAC # ########################################################### # # Get the core stuff worked out # ROOT_DIR = $(shell pwd) SRC_DIR = $(ROOT_DIR)/src CONFIG_DIR = $(ROOT_DIR)/config SCRIPTS_DIR = $(ROOT_DIR)/scripts CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \ else if [ -x /bin/bash ]; then echo /bin/bash; \ else echo sh; fi ; fi) TOPDIR := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi) HPATH = $(TOPDIR)/include FINDHPATH = $(HPATH)/asm $(HPATH)/linux $(HPATH)/scsi $(HPATH)/net export ROOT_DIR SRC_DIR CONFIG_DIR SCRIPTS_DIR HPATH FINDHPATH ########################################################### # normal make targets # # .PHONY: all all: $(MAKE) -C $(SRC_DIR) all ########################################################### # # Config stuff, we recall ourselves to load the new config.arch before # running the kernel and other config scripts # .PHONY: config config: $(CONFIG_DIR)/config.in cd $(CONFIG_DIR); $(CONFIG_SHELL) $(SCRIPTS_DIR)/Configure $(CONFIG_DIR)/config.in @rm -f $(SRC_DIR)/arch.config @if egrep "^CONFIG_DEFAULTS_INTEL_I386" $(CONFIG_DIR)/.config > /dev/null; then \ ln -s "$(CONFIG_DIR)/arch.i386" $(SRC_DIR)/arch.config; \ fi @if egrep "^CONFIG_DEFAULTS_MOTOROLA_M5272C3" $(CONFIG_DIR)/.config > /dev/null; then \ ln -s "$(CONFIG_DIR)/arch.m68k" $(SRC_DIR)/arch.config; \ fi @echo "#This dir.config file is automaticly generated by make config!" > $(SRC_DIR)/dir.config @echo "ROOT_DIR="$(ROOT_DIR) >> $(SRC_DIR)/dir.config @echo "CONFIG_DIR="$(CONFIG_DIR) >> $(SRC_DIR)/dir.config @echo "SRC_DIR="$(SRC_DIR) >> $(SRC_DIR)/dir.config @echo "SCRIPTS_DIR="$(SCRIPTS_DIR) >> $(SRC_DIR)/dir.config @echo "HPATH="$(HPATH) >> $(SRC_DIR)/dir.config @echo "FINDPATH="$(FINDPATH) >> $(SRC_DIR)/dir.config ########################################################### # # normal make dependancy # # .PHONY: dep dep: $(MAKE) -C $(SRC_DIR) dep # This one removes all executables from the tree and forces their relinking clean: $(MAKE) -C $(SRC_DIR) clean test: $(MAKE) -C $(SRC_DIR) test run: $(MAKE) -C $(SRC_DIR) run config_error: @echo "*************************************************" @echo "You have not run make config." @echo "The build sequence for this source tree is:" @echo "1. "make config" or "make xconfig"" @echo "2. "make dep"" @echo "3. "make"" @echo "*************************************************" @exit 1 ########################################################### src目錄下的Makefile文件,如下: VERSION = 2 PATCHLEVEL = 0 SUBLEVEL = 39 UCRELEASE = uc2 .EXPORT_ALL_VARIABLES: CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \ else if [ -x /bin/bash ]; then echo /bin/bash; \ else echo sh; fi ; fi) TOPDIR := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi) TARGET = ESGateway all: $(TARGET) # Include the make variables (CC, etc...) # SUBDIRS = public serial packet cal xml fifo main interface $(TARGET): @set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i all_targets; done linuxsubdirs: dummy set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i; done clean: @set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i clean; done dep: @set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i fastdep; done .PHONY: test test: @set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i test; done run: # @set -e; for i in $(SUBDIRS); do $(MAKE) -i -C $$i run; read junk; done make -C main run src目錄下的Rules.make文件給出了編譯的一些規則,如下: # # This file contains rules which are shared between multiple Makefiles. # # # False targets. # .PHONY: dummy # # Special variables which should not be exported # unexport EXTRA_ASFLAGS unexport EXTRA_CFLAGS ifneq "$(ARCH)" "h8300" unexport EXTRA_LDFLAGS endif unexport EXTRA_ARFLAGS unexport SUBDIRS unexport SUB_DIRS unexport ALL_SUB_DIRS unexport MOD_SUB_DIRS unexport O_TARGET unexport O_OBJS unexport L_OBJS unexport M_OBJS unexport MI_OBJS unexport ALL_MOBJS # objects that export symbol tables unexport OX_OBJS unexport LX_OBJS unexport MX_OBJS unexport MIX_OBJS unexport SYMTAB_OBJS unexport MOD_LIST_NAME include ../dir.config include $(SRC_DIR)/arch.config # # Get things started. # first_rule: sub_dirs $(MAKE) all_targets # # Common rules # INC_DIR = -I$(SRC_DIR)/cal -I$(SRC_DIR)/xml -I$(SRC_DIR)/serial -I$(SRC_DIR)/packet -I$(SRC_DIR)/fifo -I$(SRC_DIR)/ping -I$(SRC_DIR)/interface -I$(SRC_DIR)/public %.o: %.c @echo "Compiling..." @echo "$<" $(CXX) $(INC_DIR) $(CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $< %.o: %.cpp @echo "Compiling..." @echo "$<" $(CXX) $(INC_DIR) $(CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $< # Rule to compile a set of .o files into one .o file # ifeq (.depend,$(wildcard .depend)) include .depend else .depend: fastdep endif ifneq ($(O_TARGET),$(O_OBJS)) $(O_TARGET): .depend $(O_OBJS) @echo "Linking..." @echo $(O_OBJS) " --> " $@ @$(LD) $(EXTRA_LDFLAGS) -r -o $@ $(O_OBJS) else $(O_TARGET): .depend endif # # # all: $(O_OBJS) echo all all_targets: $(O_OBJS) $(O_TARGET) # # # Rule to compile a set of .o files into one .a file # ifdef L_TARGET $(L_TARGET): $(LX_OBJS) $(L_OBJS) rm -f $@ $(AR) $(EXTRA_ARFLAGS) rcs $@ $(LX_OBJS) $(L_OBJS) endif # # This make dependencies quickly # fastdep: dummy @echo "make fastdep" if [ -n "$(wildcard *.[chS])" ]; then \ $(SCRIPTS_DIR)/mkdep *.[chS] > .depend; fi if [ -n "$(wildcard *.cpp)" ]; then \ $(SCRIPTS_DIR)/mkdep *.cpp >> .depend; fi # # A rule to make subdirectories # sub_dirs: dummy ifdef SUB_DIRS set -e; for i in $(SUB_DIRS); do $(MAKE) -C $$i; done endif # # A rule to do nothing # dummy: config: cd $(ROOT_DIR); make config c clean: rm -f *.o rm -f *.gdb rm -f .depend rm -f test rm -f core rm -f *.elf rm -f *.elf2flt # # This is useful for testing # script: $(SCRIPT) run: test @echo ... running ... @echo `pwd`/test @./test # # This sets version suffixes on exported symbols # Uses SYMTAB_OBJS # Separate the object into "normal" objects and "exporting" objects # Exporting objects are: all objects that define symbol tables # $(MX_OBJS): $(CC) $(CFLAGS) -DEXPORT_SYMTAB -c $(@:.o=.c) $(LX_OBJS) $(OX_OBJS): $(CC) $(CFLAGS) -DMODVERSIONS -DEXPORT_SYMTAB -c $(@:.o=.c) $(M_OBJS): ifdef MAKING_MODULES $(O_OBJS) $(L_OBJS): endif 在config 目錄下,編寫兩個和架構有關的文件,對于x86平臺,是arch.i386,如下: .EXPORT_ALL_VARIABLES: ################################################################### # # Vendor specific settings # CONSOLE_BAUD_RATE = 19200 ################################################################### # # The makefiles need to know how to do things in different contexts # To save some pain we put it all here # # First settings we always want for all build # # ARCH = kernel, TARGET_ARCH = uClibc MACHINE = i386 ARCH = i386 CROSS_COMPILE = CROSS = $(CROSS_COMPILE) # We"ve used -m5307 here because the bulk of the 5272 instruction timings # happen to be closer to the 5307 than the 5200 series. Luckily, the # actual instructions on the two processors are essentially identical. # This should be fixed at some stage. CPUFLAGS = CC = $(CROSS_COMPILE)gcc AS = $(CROSS_COMPILE)as CXX = $(CROSS_COMPILE)g++ AR = $(CROSS_COMPILE)ar LD = $(CROSS_COMPILE)ld OBJCOPY = $(CROSS_COMPILE)objcopy RANLIB = $(CROSS_COMPILE)ranlib STRIPTOOL = $(CROSS_COMPILE)strip STRIP = $(STRIPTOOL) UCLINUX_BUILD_SET = 0 # have we set a special config below ################################################################### # # General purpose lib building rules, uClibc.config uses these when # possible # ################################################################### # Settings for building user apps # CFLAGS = -Wall -Wstrict-prototypes -O2 -g #CFLAGS = -Wstrict-prototypes -g LDFLAGS = -m elf_i386 ################################################################### # fall through, do other config options perhaps # ifeq ($(UCLINUX_BUILD_SET),1) endif ################################################################### 在config 目錄下,對于嵌入式平臺,是arch.m68k,如下: .EXPORT_ALL_VARIABLES: ################################################################### # # Vendor specific settings # CONSOLE_BAUD_RATE = 19200 ################################################################### # # The makefiles need to know how to do things in different contexts # To save some pain we put it all here # # First settings we always want for all build # # ARCH = kernel, TARGET_ARCH = uClibc MACHINE = m68k ARCH = m68knommu CROSS_COMPILE = m68k-elf- CROSS = $(CROSS_COMPILE) # We"ve used -m5307 here because the bulk of the 5272 instruction timings # happen to be closer to the 5307 than the 5200 series. Luckily, the # actual instructions on the two processors are essentially identical. # This should be fixed at some stage. CPUFLAGS = -m5200 CC = $(CROSS_COMPILE)gcc AS = $(CROSS_COMPILE)as CXX = $(CROSS_COMPILE)g++ AR = $(CROSS_COMPILE)ar LD = $(CROSS_COMPILE)ld OBJCOPY = $(CROSS_COMPILE)objcopy RANLIB = $(CROSS_COMPILE)ranlib ELF2FLT = elf2flt STRIPTOOL = $(CROSS_COMPILE)strip STRIP = $(STRIPTOOL) UCLINUX_BUILD_SET = 0 # have we set a special config below ################################################################### # # Settings for building user apps # #CFLAGS = -m5200 -msep-data -g CFLAGS = -m5200 -msep-data LDFLAGS = -Wl,-elf2flt SYSLIBS = -lc -lstdc++ -lgcc ################################################################### # # fall through, do other config options perhaps # ifeq ($(UCLINUX_BUILD_SET),1) endif ################################################################### 在config 目錄下的config.in文件如下: mainmenu_name "uClinux Configuration" mainmenu_option next_comment comment "Target Platform Selection" comment "Choose a Vendor/Product combination." choice "Vendor/Product [Intel/i386 | Motorola/M5307C3] " "1 CONFIG_DEFAULTS_INTEL_I386 \ 2 CONFIG_DEFAULTS_MOTOROLA_M5307C3 \ " Intel/i386 endmenu 1、 本站不保證以上觀點正確,就算是本站原創作品,本站也不保證內容正確。 2、如果您擁有本文版權,并且不想在本站轉載,請書面通知本站立即刪除并且向您公開道歉! |
本站協議。
版權信息。
關于我們。
本站地圖。
營業執照。
發票說明。
付款方式。
聯系方式
深圳市寶安區西鄉五壹電子商行——粵ICP備16073394號-1;地址:深圳西鄉河西四坊183號;郵編:518102 E-mail:51dz$163.com($改為@);Tel:(0755)27947428 工作時間:9:30-12:00和13:30-17:30和18:30-20:30,無人接聽時可以再打手機13537585389 |