[STM32#34] 블루필보드로 로봇하드웨어개발기사 공개문제에 있는 i2c가 아닌 1602lcd를 작동시키는 방법을 데이터시트로 알아보기!(녹칸다 내맘대로 STM32)
프로그래밍/STM32 2026. 2. 11. 16:49반응형

https://youtube.com/live/X9i3F1bRd_M
[STM32#34] 블루필보드로 로봇하드웨어개발기사 공개문제에 있는 i2c가 아닌 1602lcd를 작동시키는 방법을 데이터시트로 알아보기!(녹칸다 내맘대로 STM32)
심심한녹칸다의 내맘대로 STM32시리즈이다!
STM32시리즈의 모든 자료는 구글 슬라이드에 작성하고 모두에게 공유되어있음!
https://docs.google.com/presentation/d/1myA5iYbjuKsLWLqtRLKAiRfwUwvqB1d1RGjiMIIgp3I/edit?slide=id.g3bd7e320f89_10_229#slide=id.g3bd7e320f89_10_229
로봇하드웨어개발기사에 있는 일부 내용을 STM32보드로 한번 접근해보는 것입니다!
1.블루필보드에 1602LCD를 회로도에 맞게 연결한다음 데이터시트를 해석해서 첫번째 줄에는 “NOCKANDA”라고 출력하고 두번째 줄에는 “SUBSCRIBE!”라고 출력해보도록 한다!

/* USER CODE BEGIN 0 */
void lcd_write4(uint8_t n)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, (n >> 0) & 1);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, (n >> 1) & 1);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, (n >> 2) & 1);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, (n >> 3) & 1);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_RESET);
HAL_Delay(1);
}
void lcd_write8(uint8_t data, uint8_t rs)
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, rs);
lcd_write4(data >> 4); // 상위 4비트
lcd_write4(data & 0x0F); // 하위 4비트
}
void lcd_cmd(uint8_t cmd)
{
lcd_write8(cmd, 0);
}
void lcd_data(uint8_t data)
{
lcd_write8(data, 1);
}
void lcd_puts(char *s)
{
while(*s)
lcd_data(*s++);
}
/* USER CODE END 0 */
/* USER CODE BEGIN 2 */
//STM32가 부팅된 후 15ms이상 기다려줘야한다!
HAL_Delay(15);
//그다음 0b0011을 전송한다
lcd_write4(0b0011);
HAL_Delay(5); //4.1ms이상 대기
lcd_write4(0b0011);
HAL_Delay(1); //100us(0.1ms)이상 대기
lcd_write4(0b0011);
//HAL_Delay(1);
lcd_write4(0b0010);
lcd_cmd(0b00101000); // 4bit, 2line
lcd_cmd(0b00001000); // Display OFF
lcd_cmd(0b00000001); // Clear
//HAL_Delay(5);
lcd_cmd(0b00000110); // Entry mode
lcd_cmd(0b00001100); // Display ON
lcd_cmd(0x80);
lcd_puts("NOCKANDA");
lcd_cmd(0xC0);
lcd_puts("SUBSCRIBE!");
/* USER CODE END 2 */
2.첫번째줄에 왼쪽부터 2번째칸에서 시작해서 NOCKANDA라고 출력하고 두번째줄의 3번째 칸부터 시작해서 SUBSCRIBE!를 출력하시오!

/* USER CODE BEGIN 0 */
void lcd_write4(uint8_t n)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, (n >> 0) & 1);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, (n >> 1) & 1);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, (n >> 2) & 1);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, (n >> 3) & 1);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_RESET);
HAL_Delay(1);
}
void lcd_write8(uint8_t data, uint8_t rs)
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, rs);
lcd_write4(data >> 4); // 상위 4비트
lcd_write4(data & 0x0F); // 하위 4비트
}
void lcd_cmd(uint8_t cmd)
{
lcd_write8(cmd, 0);
}
void lcd_data(uint8_t data)
{
lcd_write8(data, 1);
}
void lcd_puts(char *s)
{
while(*s)
lcd_data(*s++);
}
void set_cursor(uint8_t x, uint8_t y){
uint8_t cursor = 0b10000000;
if(y != 0){
cursor = cursor | 0b01000000;
}
cursor = cursor + x;
lcd_cmd(cursor);
}
/* USER CODE END 0 */
/* USER CODE BEGIN 2 */
//STM32가 부팅된 후 15ms이상 기다려줘야한다!
HAL_Delay(15);
//그다음 0b0011을 전송한다
lcd_write4(0b0011);
HAL_Delay(5); //4.1ms이상 대기
lcd_write4(0b0011);
HAL_Delay(1); //100us(0.1ms)이상 대기
lcd_write4(0b0011);
//HAL_Delay(1);
lcd_write4(0b0010);
lcd_cmd(0b00101000); // 4bit, 2line
lcd_cmd(0b00001000); // Display OFF
lcd_cmd(0b00000001); // Clear
//HAL_Delay(5);
lcd_cmd(0b00000110); // Entry mode
lcd_cmd(0b00001100); // Display ON
set_cursor(2,0);
lcd_puts("NOCKANDA");
set_cursor(3,1);
lcd_puts("SUBSCRIBE!");
/* USER CODE END 2 */
3.로봇하드웨어개발기사에서 공개되어있는 부분만 STM32보드로 간단하게 구현해보시오!(조이스틱x축PA0, y축PA1, 서보모터PB11)

/* USER CODE BEGIN 0 */
void lcd_write4(uint8_t n)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, (n >> 0) & 1);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, (n >> 1) & 1);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, (n >> 2) & 1);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, (n >> 3) & 1);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_RESET);
HAL_Delay(1);
}
void lcd_write8(uint8_t data, uint8_t rs)
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, rs);
lcd_write4(data >> 4); // 상위 4비트
lcd_write4(data & 0x0F); // 하위 4비트
}
void lcd_cmd(uint8_t cmd)
{
lcd_write8(cmd, 0);
}
void lcd_data(uint8_t data)
{
lcd_write8(data, 1);
}
void lcd_puts(char *s)
{
while(*s)
lcd_data(*s++);
}
void set_cursor(uint8_t x, uint8_t y){
uint8_t cursor = 0b10000000;
if(y != 0){
cursor = cursor | 0b01000000;
}
cursor = cursor + x;
lcd_cmd(cursor);
}
void set_servo(uint8_t degree){
//degree는 0~180도 범위이고 CCR4는 600부터 2400의 범위이다!
TIM2->CCR4 = (uint32_t)(600+(2400-600)*degree/180.0);
}
uint16_t map(uint16_t analog){
return 180*analog/4095.0;
}
/* USER CODE END 0 */
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_4);
//STM32가 부팅된 후 15ms이상 기다려줘야한다!
HAL_Delay(15);
//그다음 0b0011을 전송한다
lcd_write4(0b0011);
HAL_Delay(5); //4.1ms이상 대기
lcd_write4(0b0011);
HAL_Delay(1); //100us(0.1ms)이상 대기
lcd_write4(0b0011);
//HAL_Delay(1);
lcd_write4(0b0010);
lcd_cmd(0b00101000); // 4bit, 2line
lcd_cmd(0b00001000); // Display OFF
lcd_cmd(0b00000001); // Clear
//HAL_Delay(5);
lcd_cmd(0b00000110); // Entry mode
lcd_cmd(0b00001100); // Display ON
set_cursor(0,0);
lcd_puts("ROBOT ARM ");
set_cursor(0,1);
lcd_puts("NUMBER:001 ");
HAL_Delay(5000);
uint16_t adc_value0 = 0;
uint16_t adc_value1 = 0;
uint8_t line1[20];
uint8_t line2[20];
/* USER CODE END 2 */
while (1)
{
//M1:AAAA M2:BBBB
//M3:CCCC
//PA0 ADC1 RANK1
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 100);
adc_value0 = HAL_ADC_GetValue(&hadc1);
//PA1 ADC1 RANK2
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 100);
adc_value1 = HAL_ADC_GetValue(&hadc1);
sprintf(line1,"M1:%4d M2:%4d",adc_value0,adc_value1);
sprintf(line2,"M3:%13d",HAL_GetTick());
set_cursor(0,0);
lcd_puts(line1);
set_cursor(0,1);
lcd_puts(line2);
//서보모터제어
set_servo(map(adc_value1));
HAL_Delay(100);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}반응형


