STM32L010を使た、MbedでHALのアナログ入力 (約5Kバイト)(ACM1602Kキャラクター液晶)


目的
最軽量化

PA0(6ピン)から入力してACM1602K-NLW-BBWに表示する。

x Mbedのリビジョンは、143




```c++



#include "mbed.h"


//10の割り算 0から1028までは、正しい。主に0から999
#define DVI10(n) ((n*205)>>11)

#define swdio  GPIO_PIN_7   //A6
#define swdclk GPIO_PIN_5   //A4
#define en     GPIO_PIN_4   //A3

#define DW(AAA,BBB)  HAL_GPIO_WritePin(GPIOA,AAA,BBB)

GPIO_PinState bi1[]={GPIO_PIN_RESET,GPIO_PIN_SET};

void seg1(char v,int rs)
{
    for(int jj=0;jj<8;jj++){
        if( (v<<jj) & 0x80 ){
                DW(swdio,GPIO_PIN_SET);   //ビットが1 
        } else {
                DW(swdio,GPIO_PIN_RESET); //ビットが0
        }//endif
        DW(swdclk,GPIO_PIN_SET);DW(swdclk,GPIO_PIN_RESET); //clk
    }//for
    DW(swdio, bi1[rs] );
    DW(en,GPIO_PIN_SET);   HAL_Delay(1); //ビットが1 
    DW(en,GPIO_PIN_RESET);               //ビットが0      
}//seg1


//文字列の表示 nana_seg
int ns_printf(char *str1) {

    //文字の中身がゼロか
    while(*str1){

        //一文字出力
        seg1( *str1 ++ , 1  );

    } //while

    //戻り値
    return(0);

}//ns_printf

//GPIOの初期化
void GPIO_INIT1() {
    
    __HAL_RCC_GPIOA_CLK_ENABLE();

    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}//GPIO_INIT1


ADC_HandleTypeDef hadc;
    
void ADC_INIT1(){
    
    //__HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_ADC1_CLK_ENABLE();

    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    //ADC_HandleTypeDef hadc;

    hadc.Instance = ADC1;
    hadc.Init.OversamplingMode = DISABLE;
    hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV1;
    hadc.Init.Resolution = ADC_RESOLUTION_12B;
    hadc.Init.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
    hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
    hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    hadc.Init.ContinuousConvMode = DISABLE;
    hadc.Init.DiscontinuousConvMode = DISABLE;
    hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
    hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    hadc.Init.DMAContinuousRequests = DISABLE;
    hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
    hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED;
    hadc.Init.LowPowerAutoWait = DISABLE;
    hadc.Init.LowPowerFrequencyMode = ENABLE;
    hadc.Init.LowPowerAutoPowerOff = DISABLE;
    HAL_ADC_Init(&hadc);

    ADC_ChannelConfTypeDef sConfig = {0};
    sConfig.Channel = ADC_CHANNEL_0;
    sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
    HAL_ADC_ConfigChannel(&hadc, &sConfig);
   
}//ADC_INIT1


//液晶初期化配列
int lcd_int[]={
  0x30,0x30,0x30,0x38,0x08,0x01,0x06,0x08+0x04
};//lcd_init

//メイン関数
int main() {

    char data_read[8]; //バッファー
    int  tempval;      //温度

    wait(0.2); //なぜかwait(ウエート)を呼ばないとHAL_Delay(2)がおかしい

    //GPIOの初期化
    GPIO_INIT1();

    //ADCの初期化
    ADC_INIT1();

    //7セグの初期化
    DW(en,GPIO_PIN_RESET);     //ビットが0 
    DW(swdclk,GPIO_PIN_RESET); //ビットが0 

    //液晶の初期化
    for(int ii=0;ii<8;ii++){ 
        seg1( lcd_int[ii] , 0);HAL_Delay(2);
    }//for

    seg1( 0x80+0x00 , 0  ); //1ライン目にカーソルを移動
    ns_printf("START");HAL_Delay(1500); //debug

    //画面クリア
    seg1(   0x01  , 0  ); 
    HAL_Delay(5);
    
    int a;

    //無限ループ
    while(1){

        seg1( 0x80+0x00 , 0  ); //1ライン目にカーソルを移動

        //温度センサーの初期化
        //set address 0

        //温度の読み込み
        // Read temperature register
        a=9999;
        HAL_ADC_Start(&hadc);
        if( HAL_ADC_PollForConversion(&hadc, 1000) == HAL_OK )
        {
            a = HAL_ADC_GetValue(&hadc);
        }
        HAL_ADC_Stop(&hadc);

        //温度の保存
        // Calculate temperature value in Celcius

        tempval = a;
        //tempval = 1234; //debug

        //表示用の変数の初期化
        int s = tempval;
        int n0,n10,n100,n1000;

        n10   = (s*6554)>>16;;     // 1234 -> 123
        n0    = s - (n10 *10);     // 1234 -  1230 -> 4
        n100  = DVI10(n10);        // 123  -> 12
        n10   = n10 - (n100 *10);  // 123  -  120 -> 3
        n1000 = DVI10(n100);       // 12   -> 1
        n100  = n100 - (n1000*10); // 12   -  10  -> 2

        //画面に表示
        data_read[0] = '0' + n1000;
        data_read[1] = '0' + n100;
        data_read[2] = '0' + n10;
        data_read[3] = '0' + n0;
        data_read[4] = '.';
        data_read[5] = 0;
        ns_printf(data_read);

        //1.7秒待つ ちらつき防止
        HAL_Delay(1700);

    }//while

}//main



```