前回アセンブラでLチカを実行しましたが、今回SDCCによるC言語で実行したいと思います。
回路図は、アセンブラでLチカを実行ものと同じです。

SDCCをインストールします。(下記ではすでにインストール済となっています。)

$ sudo apt-get install sdcc
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
sdcc はすでに最新バージョン (4.0.0+dfsg-2) です。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 23 個。

開発環境は、Raspberry Pi3 上のRaspbianで、SDCCのバージョンは下記のとおりです。

$ sdcc -v
SDCC : mcs51/z80/z180/r2k/r3ka/gbz80/tlcs90/ez80_z80/ds390/TININative/ds400/hc08/s08/stm8/pdk13/pdk14/pdk15 4.0.0 #11528 (Linux)
published under GNU General Public License (GPL)

下記のプログラムは、for文で時間稼ぎして、P3.3端子とP5.4端子のLEDを交互に点滅するプログラムです。
P3M0,P3M1,P5M0,P5M1は素の8052には存在しないので、新たにレジスターを定義します。

//BYTE 指定可能なレジスター
__sfr __at  0xb2 P3M0  ;	
__sfr __at  0xb1 P3M1  ;	
__sfr __at  0xca P5M0  ;	
__sfr __at  0xc9 P5M1  ;

P5ポートも素の8052には存在しないので、新たにビットごとのポートを定義します。

//BIT 指定可能なレジスター
__sbit __at 0xc8 P5_0	;
__sbit __at 0xc9 P5_1	;
__sbit __at 0xca P5_2	;
__sbit __at 0xcb P5_3	;
__sbit __at 0xcc P5_4	;
__sbit __at 0xcd P5_5	;

P3、P5ポートを準双方向ポートに設定します。

    P3M0 = 0x00;	//P3ポートを準双方向モードに
	P3M1 = 0x00;
	P5M0 = 0x00;	//P5ポートを準双方向モードに
	P5M1 = 0x00;

全体のプログラムは下記のとおりです。

// STC8G1K08A LED 点滅 (P3.3 - P5.4)
//
// STC8G1K08A   MPU
// Flash ROM 8Kbyte
// RAM       1Kbyte
// 
// SDCC 4.0.0
//
// file name STC8G1K08A_led_blink.c
// $ sdcc -mmcs51 --model-small --xram-size 0x400 --xram-loc 0x0000 --code-size 0x2000 STC8G1K08A_led_blink.c
// $ packihx STC8G1K08A_led_blink.ihx > STC8G1K08A_led_blink.hex
// $ stcgal -P stc8g -t 22118.4 -p /dev/ttyUSB0 STC8G1K08A_led_blink.hex
//

#include <8052.h>

//BYTE 指定可能なレジスター
__sfr __at  0xb2 P3M0  ;    
__sfr __at  0xb1 P3M1  ;    
__sfr __at  0xca P5M0  ;    
__sfr __at  0xc9 P5M1  ;

//BIT 指定可能なレジスター
__sbit __at 0xc8 P5_0   ;
__sbit __at 0xc9 P5_1   ;
__sbit __at 0xca P5_2   ;
__sbit __at 0xcb P5_3   ;
__sbit __at 0xcc P5_4   ;
__sbit __at 0xcd P5_5   ;

 
void wait_time(void);   //時間待ち関数宣言
 
void main(void)         //main関数
{

    P3M0 = 0x00;    //P3ポートを準双方向モードに
    P3M1 = 0x00;
    P5M0 = 0x00;    //P5ポートを準双方向モードに
    P5M1 = 0x00;    
    
    
    while(1)            //無限ループ
    {
         P3_3 = 1;      //ポートP3_3をハイレベルにする
       P5_4 = 0;      //ポートP5_4をローレベルにする
         wait_time();       //時間待ち
         P3_3 = 0;      //ポートP3_3をローレベルにする
       P5_4 = 1;      //ポートP5_4をハイレベルにする
         wait_time();       //時間待ち
    }
}
 
void wait_time(void)    //時間待ち関数
{
    int i,j,k;          //forループによる時間待ち
    for(i=0;i < 18 ;i++)
      for(j=0;j < 255;j++)
        for(k=0;k < 255;k++);
}

コンパイルします

$ sdcc -mmcs51 --model-small --xram-size 0x400 --xram-loc 0x0000 --code-size 0x2000 STC8G1K08A_led_blink.c

SDCCは吐き出すヘキサコード(ihx)をインテルヘキサコード(hex)に変換します。

$ packihx STC8G1K08A_led_blink.ihx > STC8G1K08A_led_blink.hex
packihx: read 14 lines, wrote 19: OK.

STC8G1K08Aへ書き込みします。

$ stcgal -P stc8g -t 22118.4 -p /dev/ttyUSB0 STC8G1K08A_led_blink.hex
Waiting for MCU, please cycle power: done
Target model:
  Name: STC8G1K08A-8PIN
  Magic: F794
  Code flash: 8.0 KB
  EEPROM flash: 4.0 KB
Target frequency: 22.116 MHz
Target BSL version: 7.3.13U
Target wakeup frequency: 36.125 KHz
Target ref. voltage: 1191 mV
Target mfg. date: 2024-07-01
Target options:
  reset_pin_enabled=False
  clock_gain=high
  watchdog_por_enabled=False
  watchdog_stop_idle=True
  watchdog_prescale=64
  low_voltage_reset=False
  low_voltage_threshold=2
  eeprom_erase_enabled=True
  bsl_pindetect_enabled=False
  por_reset_delay=long
  rstout_por_state=high
  uart1_remap=False
  uart2_passthrough=True
  uart2_pin_mode=push-pull
  epwm_open_drain=True
  program_eeprom_split=8192
Loading flash: 191 bytes (Intel HEX)
Target frequency: Target 22.118 MHz
Adjusted frequency: 22.123 MHz(0.022%)
Switching to 115200 baud: done
Erasing flash: done
Writing flash: 576 Bytes [00:00, 8291.61 Bytes/s]
Finishing write: done
Setting options: done
Target UID: F794C4840AEBF6
Disconnected!

P3.3,P5.4端子に接続したLEDが相互に点滅します。

おすすめの記事