C compilers for 8051 Chin-Shiuh Shih
High-level Language Machine independent (portable) High productivity Assembly Language one instruction to one machine code Assembler Compiler Symbolic version of machine code Machine dependent Direct, low-level hardware control one statement to many machine codes Machine Code Machine Dependent Executable
Development Cycle Library Editor Compiler Linker XXX.c Source Program XXX.obj Object Program XXX.exe Executable C:\XXX↓ Debugger
C compilers for 8051 C compilers for 8051 SDCC - Small Device C Compiler Raisonance RIDE-51 Keil … Some issues in using 8051 C compilers Access to SFR (Special Function Register) Implement Interrupt Service Subroutine Memory allocation in variable declaration
SDCC - Small Device C Compiler SDCC - Small Device C Compiler is a free C compiler for 8051, although library is incomplete. http://sdcc.sourceforge.net Download sdcc-2.8.0-setup.exe and install.
Issue "sdcc test. c" within DOS box will generate "test Issue "sdcc test.c" within DOS box will generate "test.ihx" in Intel-HEX format. Issue "sdcc --code-loc 0x4000 --xram-loc 0x8000 test.c" within DOS box will generate "test.ihx" in Intel-HEX format. Option "--code-loc 0x4000" is used to specify starting code address. Option "--xram-loc 0x8000" is used to specify the starting address of external data memory.
Refer to "c:\sdcc\share\doc\sdcc\sdccman Refer to "c:\sdcc\share\doc\sdcc\sdccman.pdf" for SDCC Compiler User Guide. uart.c is a UART library by Chin-Shiuh Shieh, including Character, String, and Integer I/O. Refer to sample.c for its usage.
// Template for SDCC 8051 C Language #include <at89x51.h> // Definitions of registers, SFRs and Bits // ISR Prototypes =================================================== void INT0_ISR(void) __interrupt 0; // ISR for External Interrupt 0 void T0_ISR(void) __interrupt 1; // ISR for Timer0/Counter0 Overflow void INT1_ISR(void) __interrupt 2; // ISR for External Interrupt 1 void T1_ISR(void) __interrupt 3; // ISR for Timer1/Counter1 Overflow void UART_ISR(void) __interrupt 4; // ISR for UART Interrupt void main(void) { } void INT0_ISR(void) __interrupt 0 {} void T0_ISR(void) __interrupt 1 void INT1_ISR(void) __interrupt 2 void T1_ISR(void) __interrupt 3 void UART_ISR(void) __interrupt 4
Input Output P1=0xFF; MOV P1,#0FFh A=P1; MOV A,P1 P2=0xF5; MOV P2,#0F5h
Check button in assembly JB P3.2,CBRET ; Task for button pressed WAIT_BUTTON_RELEASE: JNB P3.2,WAIT_BUTTON_RELEASE CBRET: Check button in C if(P3_2==0) { … while(P3_2==0); }
Wait button in assembly JB P3.2,WAIT_BUTTON WAIT_RELEASE: JNB P3.2,WAIT_RELEASE Wait button in C while(P3_2==1); while(P3_2==0);
Left Rotation in assembly Left Rotation in C 10010011 00100111 Left Rotation in assembly RL A Left Rotation in C unsigned char i; if(i>=128) i=i*2+1; else i=i*2;
Right Rotation in assembly Right Rotation in C 10010011 11001001 Right Rotation in assembly RR A Right Rotation in C unsigned char i; if(i%2==1) i=i/2+128; else i=i/2;
data unsigned char test_data; xdata unsigned char test_data; xdata at 0x7ffe unsigned int chksum; idata unsigned char test_data; code unsigned char test_code; bit test_bit;
xdata at 0x0000 unsigned char ADC; X=ADC;
xdata at 0x3000 unsigned char x[1024]; for(i=0;i<1024;i++) x[i]=i;