x 原因は、わからないが液晶がちらつく場合は、ウェートを調整してね!!
STM32L010F4P6でmbedを使い16文字2行液晶に
Hello Worldを表示するプログラム
74hc164シフトレジスターを使用した。
液晶とのピン数を節約した。信号線10本から
信号線3本に減らした。
1 CLK クロック端子(緑)
2 RSDATA RS端子とデータの共有端子(黄)
3 E 読み込み書き込み同期信号(青)
x 初心者コロシのVSCのcubeideに行く予定 いきなりドラゴンが出てくる
#include "mbed.h"
#define swdclk GPIO_PIN_5 //A4
#define swdio GPIO_PIN_7 //A6
#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
int lcd_int[]={
0x30,0x30,0x30,0x38,0x08,0x01,0x06,0x08+0x04
};//lcd_init
//メイン関数
int main() {
//クロックの初期化
HAL_RCC_DeInit();
//CPUへの電圧の設定
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);//1.8V
// 32mz
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_4;
RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
//GPIOの初期化
GPIO_INIT1();
//GPIOの初期化
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( 0x01 , 0 );
HAL_Delay(1000);
seg1( 0x80+0x00 , 0 ); //1ライン目にカーソルを移動
ns_printf("Hello World !");HAL_Delay(500); //debug
//無限ループ
while(1){
}//while
}//main