忍者ブログ

覚え書き

パソコン・マイコン関連の、あとで必要になりそうな情報を残しておくための、健忘録てきななにかです。

"パソコン・マイコン"カテゴリーの記事一覧

  • [PR]
    ×

    [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

  • STM32F030F4P6で1602LCD表示(その2)
    先日のLCD1602の件なのですが、コードが大量に張り巡らされていて、ちょっとした衝撃で直ぐに動作不良を起こすという大問題がありました。
    そこで、「基板化」を試みました。


    (配線効率を考慮した結果、ピンに割り振っていた役割が変更された箇所が幾つかあります)


    どちらが上でどちらが下かはともかく、一方はこんな感じ。電源はマイクロUSB端子からもらうことにしました。

    もう一方の側から見ると、こう。
    一応、文字表示は行われているので、最低限の目標は達成したという事にしておきましょう。

    左側の抵抗が幾つもくっついているのは、「良い子は絶対に真似をしてはいけません」的な処理です。可変抵抗を組み込んでおいたのですが、それだと正常に作動しなかったので、こういう風に対処したのですが、ショートしてここに5V電流が流れこむと、加熱して最悪出火します。
    うっかりやらかしてしまった私は、触って指の先に水ぶくれが出来ました。

    まぁ、「プロトタイプ以前」のテストタイプという事で、ご了承ください。

    (とはいえ、実際に稼働することも事実なので、こんなものでも、実験機材としては十分に活躍の場面があるような気がします)

    ちなみに、USB端子に差し込んで計測する簡易電流計で測定た所、これ一式の消費電流は10ミリアンペア程度のようです。
    (以前、DigiSparkでこれと同じようなシステムを構築した時は2〜30mAだった気がする。あぁ、でも、あっちは、I2C変換するアダプタを噛ましていたので、消費電力が多くて当然なのか……。ダイソーの500円のモバイルバッテリーが900mAなので、それを使ったら90時間ぐらい動き続ける計算。ただ、消費電力が少ないので、ひと工夫しないと、自動的にOffになる)


    それにしても、STM32F030、解ってくるとかなり楽しいです。
    なにせ、ものすごく安価だし。
    初心者が初心者っぽいことを楽しでいる分には、もてあますぐらい高性能だし。

    拍手[2回]

    PR
  • STM32F030F4P6で1602LCD表示(EmBitz-サンプルプログラム)



    STM32F030F4P6でLCD表示を行いました。
    LCDは1602規格のもので、市場に安価に大量に出回っているので、供給についての不安は無用だと思います。

    /*
    **                     Main.c
    **                     LCD1602
    **                     EmBitz
    **
    **                     A1-Input      ボタン
    **                     A2-Output    RS
    **                     A3-Output    E
    **                     A4-Output    D4
    **                     A5-Output    D5
    **                     A6-Output    D6
    **                     A7-Output    D7
    **
    **  空のprojectを作成し、設定をhexファイルが取得できるように変更して、
    **  main.cにこの文章をcopy&pasteして、コンパイルすれば完成です
    **
    **********************************************************************/
    /*
       Last committed:     $Revision:   16 $
       Last changed by:    $Author:     Masaomi.Takahashi.$
       Last changed date:  $Date:       2019-08-09
       ID:                 $Id:         0002$
    **********************************************************************/
    #include "stm32f0xx.h"

    int main(void)
    {
        RCC   ->AHBENR |= (1<<17);  // GPIO-Aの初期化(最初は0クロックで無可動状態)
        GPIOA -> IDR   |= (1<<2);      // ピン A - 1 を入力モードに
        GPIOA -> PUPDR |= (1<<2);   // ピン A - 1 を プルアップ指定

        GPIOA -> MODER |= (1<<4);   // ピン A - 2 を出力モードに lcd-Rs
        GPIOA -> MODER |= (1<<6);   // ピン A - 3 を出力モードに lcd-E
        GPIOA -> MODER |= (1<<8);   // ピン A - 4 を出力モードに lcd-D4
        GPIOA -> MODER |= (1<<10);  // ピン A - 5 を出力モードに lcd-D5
        GPIOA -> MODER |= (1<<12);  // ピン A - 6 を出力モードに lcd-D6
        GPIOA -> MODER |= (1<<14);  // ピン A - 7 を出力モードに lcd-D7

        lcd_init();                         // lcd初期設定

        lcd_clear();                        // 全消去
        lcd_put_str("STM32F030F4P6");
        lcd_position(0,1);                  // カーソル位置 桁0,行1
        lcd_put_str("Make By EmBitz");

        delay_ms(7500);

        lcd_clear();                        // 全消去
        lcd_put_str("Vol.1.03");

        delay_ms(2500);

        lcd_clear();                        // 全消去
        lcd_put_str("ワレワレハシンリャクシャダ ト");
        lcd_position(0,1);                  // カーソル位置 桁0,行1
        lcd_put_str("イッテミル TEST");

        delay_ms(7000);

    while(1){

        if(!(GPIOA->IDR & GPIO_IDR_1)){

        delay_ms(7500);

        lcd_clear();                        // 全消去
        lcd_put_str("ワレワレテキニハ コノワクセイヲ");
        lcd_position(0,1);                  // カーソル位置 桁0,行1
        lcd_put_str("シハイカニオク ヨテイデアル");

        delay_ms(7500);

        lcd_clear();                        // 全消去
        lcd_put_str("タダシ イカノ");
        lcd_position(0,1);                  // カーソル位置 桁0,行1
        lcd_put_str("アンゴウ ヲ");

        delay_ms(7500);

        lcd_clear();                        // 全消去
        lcd_put_str("カイドクデキタラ ");
        lcd_position(0,1);                  // カーソル位置 桁0,行1
        lcd_put_str("カンベンシテヤル");

        delay_ms(7500);

        lcd_clear();                        // 全消去
        lcd_put_str("1899190119251968");
        lcd_position(0,1);                  // カーソル位置 桁0,行1
        lcd_put_str("1975197919922011");

        delay_ms(7500);

        lcd_clear();                        // 全消去
        lcd_put_str("20192027");
        lcd_position(0,1);                  // カーソル位置 桁0,行1
        lcd_put_str("ヒント ハ  - ワクセイ -");

        delay_ms(7500);

        lcd_clear();                        // 全消去
        lcd_put_str("ドウカ・・・");       // "ドウカ・・・"表示
        lcd_position(0,1);                  // カーソル位置 桁0,行1
        lcd_put_str("セカイガヘイワデスヨウニ");

        delay_ms(7000);

        } else {
        delay_ms(500);

        lcd_clear();                        // 全消去
        lcd_put_str("Hello World!!");       // "Hello World!!"表示
        lcd_position(0,1);                  // カーソル位置 桁0,行1
        lcd_put_str("コンニチハ セカイ!!");

    }   }   }

    //---------- 文字列出力 ----------
    //      *str:文字列の先頭ポインタ
    void lcd_put_str(char *str)
    {
        while(*str != 0){
            lcd_put_ch( *str );
            str++;
        }
    }

    //---------- LCD初期化 ----------
    void lcd_init()
    {
        delay_ms(30);
        lcd_put_4bit(0x30, 1);  //8bit mode set
        delay_ms(5);
        lcd_put_4bit(0x30, 1);  //8bit mode set
        delay_ms(1);
        lcd_put_4bit(0x30, 1);  //8bit mode set
        delay_ms(1);
        lcd_put_4bit(0x20, 1);  //4bit mode set
        delay_ms(1);
        lcd_put_cmd(0x2E);      //DL=0 4bit mode
        lcd_put_cmd(0x08);      //display off C=D=B=0
        lcd_put_cmd(0x0D);      //display on C=D=1 B=0
        lcd_put_cmd(0x06);      //entry I/D=1 S=0
        lcd_put_cmd(0x02);      //cursor home
    }

    //---------- 表示位置設定 ----------
    //      tx:x座標  ty:y座標
    void lcd_position(char tx, char ty)
    {
            GPIOA ->ODR &= ~(1<<2); //GPIOA-Pin4をOffにする(コマンドデータ)
        lcd_put_cmd(0x80 | tx | (0x40 * ty));
            GPIOA ->ODR |= (1<<2);  //GPIOA-Pin2をOnにする(表示データ)
    }

    //---------- データ4bit出力 ----------
    //      code:DB4~DB7 に与えるデータ
    //      flag:0=表示モード 1=コマンドモード
    void lcd_put_4bit(char code, int flag)
    {
        if(code & 0x80)
            GPIOA ->ODR |= (1<<7);  //GPIOA-Pin7をOnにする
        else
            GPIOA ->ODR &= ~(1<<7); //GPIOA-Pin7をOffにする
        if(code & 0x40)
            GPIOA ->ODR |= (1<<6);  //GPIOA-Pin6をOnにする
        else
            GPIOA ->ODR &= ~(1<<6); //GPIOA-Pin6をOffにする
        if(code & 0x20)
            GPIOA ->ODR |= (1<<5);  //GPIOA-Pin5をOnにする
        else
            GPIOA ->ODR &= ~(1<<5); //GPIOA-Pin5をOffにする
        if(code & 0x10)
            GPIOA ->ODR |= (1<<4);  //GPIOA-Pin4をOnにする
        else
            GPIOA ->ODR &= ~(1<<4); //GPIOA-Pin4をOffにする
        if (flag == 0)
            GPIOA ->ODR |= (1<<2);  //GPIOA-Pin2をOnにする(表示データ)
        else
            GPIOA ->ODR &= ~(1<<2); //GPIOA-Pin2をOffにする(コマンドデータ)

        delay_us(1);
            GPIOA ->ODR |= (1<<3);  //GPIOA-Pin3をOnにする
        delay_us(2);
            GPIOA ->ODR &= ~(1<<3); //GPIOA-Pin3をOffにする
    }

    //---------- 1文字出力 ----------
    //      ch:出力するデータ
    void lcd_put_ch(char ch)
    {
        lcd_put_4bit(ch, 0);    //上位4bit出力
        lcd_put_4bit(ch<<4, 0); //下位4bit出力
        delay_us(50);
    }


    //---------- コマンド出力 ----------
    //      cmd:コマンド
    void lcd_put_cmd(char cmd)
    {
        lcd_put_4bit(cmd, 1);   //上位4bit出力
        lcd_put_4bit(cmd<<4, 1);//下位4bit出力
        delay_ms(2);               //2msec待ち
    }

    //---------- 全消去 ----------
    void lcd_clear()
    {
      lcd_put_cmd(0x01);        //初期化コマンド出力
      delay_ms(15);                //15msec待ち
    }


            void delay_ms(uint32_t i)
    {
        i=i*100;
            while(i>0){
            asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");
            asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");
            asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");
            asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");
            i--;
    }   }

            void delay_us(uint32_t i)
    {
            while(i>0){
            asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");        asm("NOP");
             i--;
    }   }


    以上をEmBitzで新規に作成したProjectのmain.cにまるごとコピペして、コンパイルすれば(ライブラリ等を新たに設定しなくても)動きます。
    注意点は、LCDのEとRS端子の間にあるRW端子をGNDに繋げてやらないとダメ、という点です。
    これが判らなくて、私は延々とドツボにはまり続けました。

    なお、プログラムの主要部分は、

    ohkinというブログの、

    STM32と Arduino IDE で
    液晶ディスプレイに文字表示(その1)
    ~ライブラリ未使用~

    という記事を参考(丸パクリ)にさせていただきました。


    なお、delayに関しては、完全に「適当」です。一切計測とかしてません。カンです。動いたから、そのままにしているだけです。他のプログラムにこれを流用して、そのままタイミングをとるとか無茶なことをされても、一切責任は負いません。

    あと、割り込みとかしてないので、delay中にボタンを押しても反応しません。ので、次の処理へ移行させるためには、延々とボタンを押し続ける必要があります。

    ちなみに、このプログラムによって使用される容量は4.5KBぐらい。
    STM32F030F4P6のメモリは16KBだから、メインの処理を他に作って、こちら(ディスプレイ表示)を隠しモードとして潜ませておく、なんて事も可能ではないかと思います。

    STM32F030F4P6はものすごく安くて高性能なので、もっと使いこなせるようになりたいです。

    拍手[0回]

  • STM32F030F4P6でボタン入力(EmBitz-サンプルプログラム)
    EmBitzは思ったよりも資料が少ない感じで、もしかしたらおすすめでは無いかもしれません。

    ですが、後々私自身が必要になりそうな気がするので、判ったことを、忘れないように書き留めておきます。




    STM32F030F4P6の乗ったミニ基版で、わりとメジャーな存在のボードと、タクトスイッチで作った押しボタン回路を接続しています。接続先はGPIOAの01番Pinです。


    このボタンを押したら、ボード上のLEDが点灯するというプログラムを書きました。


    /*
    **                     GPIO-IDR-Main.c
    **                     ボタンを押すとLEDが光るプログラム
    **                     EmBitz
    **                     A1-Input
    **                     A4-LED
    **
    **********************************************************************/
    /*
       Last committed:     $Revision:   03 $
       Last changed by:    $Author:     Masaomi.Takahashi.$
       Last changed date:  $Date:       2019-07-02
       ID:                 $Id:         0002$
    **********************************************************************/
    #include "stm32f0xx.h"
    int main(void)
    {
        RCC ->AHBENR |= (1<<17);    //GPIO-Aの初期化(最初は0クロックで無可動状態)
        GPIOA -> MODER |= (1<<8);   // ピン A - 4 を出力モードに
        GPIOA -> IDR   |= (1<<2);   // ピン A - 1 を入力モードに
        GPIOA -> PUPDR |= (1<<2);   // ピン A - 1 を プルアップ指定
    while(1){
        if(!(GPIOA->IDR & GPIO_IDR_1)){
            GPIOA ->ODR |= (1<<4);  //GPIOA-Pin4をOnにする  - - - - - - - - 9.4.6(ポート出力)
        } else {
            GPIOA ->ODR &= ~(1<<4); //GPIOA-Pin4をOffにする - - - - - - - - 9.4.6(ポート出力)
    }   }   }



    これだけです。



    一応、動画にアップロードしました。


    下はオマケ(蛇足)です。

    自作した、ほぼ同等の回路。市販のミニ基板とほぼ同面積です。プログラムの書き込み、吸い出し、消去も出来ますし、LEDもミニ基板と同様のGPIOA-4番Pinに接続してあります。その上で、スイッチを追加出来るようになってます。


    その前進の形。この時点では、スイッチ部分の回路がまだ未確定でした。
    プログラムに関してもよく判らない、ハードウェアについてもよく解らない。
    そんな状況下での開発だったので、開発はものすごく難航しました。当初は「点きっぱなしだったLEDが消えたぞ。やった、成功だ!!」と思ったら、単に回路がショートしているだけだったりとか。

    まぁ、そんな感じです。

    拍手[0回]

  • STM32F030F4P6でLチカ(EmBitz-サンプルプログラム)
    STM32F030F4P6というマイコンで、なんとか自力でLチカプログラムを制作することが出来ました。
    (もちろん、幾つもの資料を参考にしています)

    まず、IDEはEmBitz(Ver1.11)を採用しました。

    このIDEは、ユーザー登録などしなくても使用できます。
    XP以降のWindowsマシンに対応しているようなので、古いXPマシンを用意するとか、仮想マシン上でプログラミング環境を作ってしまうのが良いと思います。
    ※LinuxのWineだと、上手く動きませんでした。

    新規作成すると、プロジェクトの中にSTM32シリーズがちゃんと用意されているので、そこからF0xxを選択します。

    main.cを選択すると、最低限の情報が記載されたプログラムが表示されます。
    (これをビルドすると、「何もしないプログラム」を得ることが出来ます)


    これを、以下のプログラムで置き換えてしまうと、LEDが点滅するプログラムが得られます。
    ですが、初期状態ではHEXファイルは作成されません。
    Hexファイルを入手するためには、Project >> Projectties >> Build targets と選択して、そこにあるGenerate Hex Fileの項目にチェックを入れてください。
    ここにチェックを入れた状態でBuildを行うと、Hexファイルが作成されるので、あとはこのHexファイルをマイコンに書き込んでやれば、制作したプログラムが実行されるはずです。
    STM32に関して、私はほぼ完全な初心者なのでHALとかの事はよく判りませんが、EmBitzだけでも、とりあえずプログラミングは可能なのだと思いました。


    ※LEDは10番目のGPIOA-4Pinの位置に接続されているものとします。

    /*
    **
    **                           Main.c
    **
    **
    **********************************************************************/
    /*
       Last committed:     $Revision: 01 $
       Last changed by:    $Masaomi Takahashi: $
       Last changed date:  $Date:  20190623$
       ID:                 $Id:  STM32F030F4P6-LED$

    **********************************************************************/
    #include "stddef.h"
    #include "stm32f0xx.h"
    #include "stm32f0xx_conf.h"
    uint32_t count;
    int main(void)
    {
            volatile unsigned int x=0;
        RCC ->AHBENR |= (1<<17);   //Enable CLK for Port A
    //    RCC ->AHBENR |= (1<<18);   //Enable CLK for Port B
    //    RCC ->AHBENR |= (1<<19);   //Enable CLK for Port C
        GPIOA -> MODER |= (1<<8); //Enable Port A Pin4 as a digital output
    //    GPIOA -> MODER |= (1<<12); //Enable Port A Pin6 as a digital output
    //    GPIOA -> MODER |= (1<<14); //Enable Port A Pin7 as a digital output
    //    GPIOA -> MODER |= (1<<16); //Enable Port A Pin8 as a digital output

    while(1){
    // LED4 (blue) is controlled by Port C Pin8 output

            GPIOA ->ODR |= (1<<4); //Turn GPIOA Pin 4 On
            for (x=0; x<1000000; x++);
            GPIOA ->ODR &= ~(1<<4); //Turn GPIOA Pin 4 Off
            for (x=0; x<1000000; x++);
    }
    }

    拍手[0回]

  • SDL2+gcc-Sample-progrum01(サンプルプログラム)
    前の記事に載せた、サンプルプログラムです。
    SDL2/gcc/Linuxという組み合わせで作成しています。
    動作を確認することが目的なので、女の子の初期位置が微妙とか、色々ありますが、気にしないでください。
    また、画面左上の数字はFPSのつもりですが、精度がどれほどのものかは、まったく当てになりません。

    実行中の画面は、前記事を参考にしてください。
    (本当に、期待するようなものじゃないです)


    //
    //        2019.01.28
    //        PNG-timer-02a.CPP
    //        png画像を扱い、透過処理を行うサンプルプログラム
    //        カーソルキーで左右に動き、ESCキーでプログラム終了
    //        画像の一部分だけを切り出してコピーできる(画面左上のカウンターに使用している)
    //
    //        製作者の環境はgcc/ubuntu18.04(KonaLinux4.0)
    //        コンパイルコマンドは以下の通り
    //        gcc -g -o png-01 png-01.cpp `sdl2-config --cflags --libs` -lSDL2_image
    //        geany用コマンド
    //        gcc -g -o "%e" "%f" `sdl2-config --cflags --libs` -lSDL2_image
    //

    #include <stdio.h>

    int loopy=1; //無限ループ処理で、whileを回し続けるためのもの
    int va=0;
    int vga=0; //画面のサイズ0ならウィンドーモード、1ならフル画面
    int iw,ih; //テクスチャ画像の処理の為に用意する変数
    int cx=200; //カーソルキーで左右にテクスチャを動かす実験用
    int cxx=00; //カーソルキーで左右にテクスチャを動かす実験用

    SDL_atomic_t frames;

    /* 設定された間隔で平均フレームレートの計算と表示を行う */
    Uint32 fps_timer_callback(Uint32 interval, void *data)
    {
    const float f = SDL_AtomicGet(&frames);
    const float iv = (float)interval / 1000.0f;
    // printf("%.2f\tfps\n", f / iv);

    va=(f/iv)/60;

    /* フレームカウンタをリセットする */
    SDL_AtomicSet(&frames, 0);

    return interval;
    }

    int main(int, char ** const){
    SDL_Init(SDL_INIT_VIDEO); //Windows作成処理開始
    SDL_Window* window = SDL_CreateWindow("SDL-Test", //Windows作成処理・タイトル
    SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED, //Windows作成処理
    320,240,vga); //Windows作成処理・サイズ&モード
    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0); //Windows作成処理終了

    SDL_Surface *screen = SDL_GetWindowSurface(window);


    int flags = IMG_INIT_PNG; //SDL_Image初期化開始
    int initted = IMG_Init(flags); //エラー対応
    if((initted & flags) != flags) { //エラー対応
    printf("IMG_Init: Failed to init required jpg and png support!\n");
    printf("IMG_Init: %s\n", IMG_GetError()); //エラー対応
    }; //SDL_Image初期化終了
    SDL_Surface *image = IMG_Load("image/myw4sss.png"); //png画像読み込み(フロント)
    SDL_Surface *backg = IMG_Load("image/spring.png"); //png画像読み込み(背景)
    if(!image & !backg){ //エラー対応
    printf("IMG_Load: %s\n", IMG_GetError()); //エラー対応
    }; //png画像読み込み終了

    SDL_Texture *backg_texture; //png画像の変数化(背景)
    backg_texture = SDL_CreateTextureFromSurface(renderer, backg); //png画像の変数化(背景)
    SDL_FreeSurface(backg); //RGBサーフェイス開放
    SDL_Texture *image_texture; //png画像の変数化(フロント)
    SDL_SetColorKey( image, SDL_TRUE, //透過色の設定
    SDL_MapRGB(image->format, 255, 0, 255));//透過色の設定
    image_texture = SDL_CreateTextureFromSurface(renderer, image); //png画像の変数化(フロント)
    SDL_FreeSurface(image); //RGBサーフェイス開放
    SDL_Event ev; //エラー確認
    if (SDL_PollEvent(&ev)) { //エラーへの対応。対象はev
    if (ev.type == SDL_QUIT) { //戻り値の如何によって処理は終了となる
    loopy=0; //戻り値の如何によって処理は終了となる
    }; //戻り値の如何によって処理は終了となる
    }; //戻り値の如何によって処理は終了となる

    SDL_QueryTexture(backg_texture, NULL, NULL, &iw, &ih); //画像テクスチャのサイズを取得
    SDL_Rect backg_rect = (SDL_Rect){0,0,iw,ih}; //取得したサイズから、構造体を定義
    SDL_QueryTexture(image_texture, NULL, NULL, &iw, &ih); //画像テクスチャのサイズを取得
    // SDL_Rect image_rect = (SDL_Rect){0,0,iw/2,ih/2}; //取得したサイズから、構造体を定義

    SDL_Rect SrcR; /*呪い少女A&B*/ //テクスチャから一部を切り出すための前処理
    SrcR.x = 8; /*左端X座標 */ //テクスチャから一部を切り出すための前処理
    SrcR.y = 0; /*左端Y座標 */ //テクスチャから一部を切り出すための前処理
    SrcR.w = 56; /*取出し横量 */ //テクスチャから一部を切り出すための前処理
    SrcR.h = 88; /*取出し縦量 */ //テクスチャから一部を切り出すための前処理
    SDL_Rect DestR1; /*呪い少女 A */ //テクスチャから一部を切り出すための前処理
    // DestR1.x = cx; /*表示X座標 */ //移動に関係するため、ループ中に設定
    DestR1.y = 100; /*表示Y座標 */ //テクスチャから一部を切り出すための前処理
    DestR1.w = (56); /*取出し横量 */ //テクスチャから一部を切り出すための前処理
    DestR1.h = (88); /*取出し縦量 */ //テクスチャから一部を切り出すための前処理
    SDL_Rect DestR2; /*呪い少女 B */ //テクスチャから一部を切り出すための前処理
    // DestR2.x = cx; /*表示X座標 */ //移動に関係するため、ループ中に設定
    DestR2.y = 100; /*表示Y座標 */ //テクスチャから一部を切り出すための前処理
    DestR2.w = (56); /*取出し横量 */ //テクスチャから一部を切り出すための前処理
    DestR2.h = (88); /*取出し縦量 */ //テクスチャから一部を切り出すための前処理

    SDL_Rect NunbD3; /*数字3桁目 */ //テクスチャから数字部分を切り出す為の前処理
    NunbD3.x = 30; //テクスチャから数字部分を切り出す為の前処理
    NunbD3.y = 30; //テクスチャから数字部分を切り出す為の前処理
    NunbD3.w = 16; //テクスチャから数字部分を切り出す為の前処理
    NunbD3.h = 24; //テクスチャから数字部分を切り出す為の前処理

    SDL_Rect NunbD2; //テクスチャから数字部分を切り出す為の前処理
    NunbD2.x = 46; //テクスチャから数字部分を切り出す為の前処理
    NunbD2.y = 30; //テクスチャから数字部分を切り出す為の前処理
    NunbD2.w = 16; //テクスチャから数字部分を切り出す為の前処理
    NunbD2.h = 24; //テクスチャから数字部分を切り出す為の前処理

    SDL_Rect NunbD1; //テクスチャから数字部分を切り出す為の前処理
    NunbD1.x = 62; //テクスチャから数字部分を切り出す為の前処理
    NunbD1.y = 30; //テクスチャから数字部分を切り出す為の前処理
    NunbD1.w = 16; //テクスチャから数字部分を切り出す為の前処理
    NunbD1.h = 24; //テクスチャから数字部分を切り出す為の前処理

    SDL_AddTimer((1000/60), fps_timer_callback, NULL); //サブルーチン呼び出し設定(1/60秒に1回)


    //////////////////////////////////////////////////////////////////////
    // 以下、メインアルゴリズム
    //////////////////////////////////////////////////////////////////////
    int vvga; //変数の設定(カウンター補佐用)
    while(loopy){ //メインルーチン開始(無限ループ)
    vvga=va/100;
    SDL_Rect NunbU3; //テクスチャから一部を切り出すための前処理
    NunbU3.x = 0+(vvga*8); //テクスチャから一部を切り出すための前処理
    NunbU3.y = 180; //テクスチャから一部を切り出すための前処理
    NunbU3.w = 8; //「8」はコピー元の数字で、2倍表示している
    NunbU3.h = 12; //「12」はコピー元の数字で、2倍表示している
    vvga=(va-(vvga*100))/10;
    SDL_Rect NunbU2; //テクスチャから一部を切り出すための前処理
    NunbU2.x = 0+(vvga*8); //テクスチャから一部を切り出すための前処理
    NunbU2.y = 180; //テクスチャから一部を切り出すための前処理
    NunbU2.w = 8; //「8」はコピー元の数字で、2倍表示している
    NunbU2.h = 12; //「12」はコピー元の数字で、2倍表示している
    vvga=0+va%10;
    SDL_Rect NunbU1; //テクスチャから一部を切り出すための前処理
    NunbU1.x = 0+(vvga*8); //テクスチャから一部を切り出すための前処理
    NunbU1.y = 180; //テクスチャから一部を切り出すための前処理
    NunbU1.w = 8; //「8」はコピー元の数字で、2倍表示している
    NunbU1.h = 12; //「12」はコピー元の数字で、2倍表示している

    DestR1.x = cx; //テクスチャから一部を切り出すための前処理
    DestR2.x = 220-cx; //テクスチャから一部を切り出すための前処理

    SDL_SetRenderDrawColor(renderer, 200, 200, 200, 255); //色指定(灰色)
    SDL_RenderClear(renderer); //指定色による塗りつぶし(画面初期化)
    SDL_RenderCopy(renderer,backg_texture, //描写のための処理(背景)
    NULL, NULL); //描写のための処理(背景)

    // SDL_Rect draw_rect = (SDL_Rect){640-cx,200,iw/2,ih/2}; //取得したサイズから、構造体を定義
    SDL_RenderCopy(renderer,image_texture, //描写のための処理(フロント)
    &SrcR,&DestR1); //描写のための処理(フロント)
    SDL_RenderCopy(renderer,image_texture, //描写のための処理(フロント)
    &SrcR,&DestR2); //描写のための処理(フロント)
    SDL_RenderCopy(renderer,image_texture, //描写のための処理(数字)
    &NunbU3,&NunbD3); //描写のための処理(数字)
    SDL_RenderCopy(renderer,image_texture, //描写のための処理(数字)
    &NunbU2,&NunbD2); //描写のための処理(数字)
    SDL_RenderCopy(renderer,image_texture, //描写のための処理(数字)
    &NunbU1,&NunbD1); //描写のための処理(数字)
    SDL_Delay(0); //待機
    SDL_RenderPresent(renderer); //描写を反映させる
    SDL_AtomicAdd(&frames, 1); //FPS用のカウンターに加算する

    SDL_Event e; //キーボード入力のための待機
    while(SDL_PollEvent(&e)){ //イベントがなければ内部が実行される
    if (e.type==SDL_KEYDOWN){ //キーボード入力があるかどうか調べている
    switch (e.key.keysym.sym){ //キーをチェックしている
    case SDLK_ESCAPE: //ESCキーだった場合
    loopy=0; //looyt=0は、メインループからの脱出=終了
    break;
    case SDLK_RIGHT: //右カーソルキーだった場合
    cx=cx+2;
    break;
    case SDLK_LEFT: //左カーソルキーだった場合
    cx=cx-2;
    break;
    }}};
    if (cx>=640){cx=cx-2;
    };
    if (cx<=0) {cx=cx+2;
    };

    };

    //////////////////////////////////////////////////////////////////////
    // 以下、プログラム終了処理
    //////////////////////////////////////////////////////////////////////

    IMG_Quit(); //プログラム終了処理
    SDL_FreeSurface(image); //プログラム終了処理
    SDL_DestroyTexture(image_texture); //プログラム終了処理
    SDL_DestroyRenderer(renderer); //プログラム終了処理
    SDL_DestroyWindow(window); //プログラム終了処理
    SDL_Quit(); //SDL終了処理
    return 0;
    };

    使用した画像ファイル。

    /image/myw4sss.png

    / image/spring.png

    2つの画像ファイルは、「image」というフォルダ内に収めてください。
    ってか、背景画像は、640x480になってますね。
    最初はこのサイズで作っていたので。

    拍手[0回]