c compilers for 8051 chin-shiuh shih. assembly language machine dependent executable machine code...

Post on 22-Dec-2015

225 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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;

top related