C compilers for 8051
Chin-Shiuh Shih
Assembly Language
Machine DependentExecutable
Machine Code
Symbolic version of machine codeMachine dependent Direct, low-level hardware control
one instruction to one machine code
Assembler
High-levelLanguage
Machine independent (portable)High productivity
Compiler
one statement to many machine codes
Editor
XXX.cSource Program
Compiler
XXX.objObject Program
Linker
Library
XXX.exeExecutable
C:\XXX↓
Debugger
Development Cycle
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.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 t
he starting address of external data memory.
• 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 0void T0_ISR(void) __interrupt 1; // ISR for Timer0/Counter0 Overflowvoid INT1_ISR(void) __interrupt 2; // ISR for External Interrupt 1void T1_ISR(void) __interrupt 3; // ISR for Timer1/Counter1 Overflowvoid 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– P1=0xFF;– MOV P1,#0FFh– A=P1;– MOV A,P1
• Output– P2=0xF5;– MOV P2,#0F5h
• Check button in assemblyCHECK_BUTTON:JB P3.2,CBRET; Task for button pressedWAIT_BUTTON_RELEASE:JNB P3.2,WAIT_BUTTON_RELEASECBRET:
• Check button in Cif(P3_2==0){…while(P3_2==0);
}
• Wait button in assemblyWAIT_BUTTON:
JB P3.2,WAIT_BUTTON
WAIT_RELEASE:
JNB P3.2,WAIT_RELEASE
• Wait button in Cwhile(P3_2==1);
while(P3_2==0);
• Left Rotation10010011 00100111
• Left Rotation in assemblyRL A
• Left Rotation in Cunsigned char i;
if(i>=128)
i=i*2+1;
else
i=i*2;
• Right Rotation10010011 11001001
• Right Rotation in assemblyRR A
• Right Rotation in Cunsigned 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;
• ADC=0;
• X=ADC;
• xdata at 0x3000 unsigned char x[1024];
• for(i=0;i<1024;i++)– x[i]=i;