วันพฤหัสบดีที่ 4 มิถุนายน พ.ศ. 2558

การใช้งานโมดูลแสดงผลด้วย LED แบบ Dotmatrix ขนาด 16x8 โดย MAX 7219

MiniProject 010123120 Embedded System Design Lab นาฬิกาปลุก


การใช้งานโมดูลแสดงผลด้วย LED แบบ Dotmatrix ขนาด 16x8 โดย MAX 7219 (RED)


               การใช้งานครั้งนี้ เรานำ LED8x8 2 ตัว มาต่อกัน 2 ตัว เพื่อทำให้การแสดงผลมีขาด LED16x8 ซึ่งหลักการในการเขียนโค้ดเพื่อให้แสดงผลได้นั้น เราต้องทำการ shift register จำนวน 16 บิต 2 ครั้ง รวมเป็นจำนวนทั้งหมดขนาด 32 บิต โดย 16 บิตแรกประกอบไปด้วย address 8 บิต และ data  8 บิต และ 16 บิตหลังประกอบไปด้วย address 8 บิต และ data  8 บิต เช่นกัน โดยขาควบคุมของไอซี MAX7219 ประกอบไปด้วย 3 ขา คือ สัญญาณ CLK, สัญญาณ CS (Load), สัญญาณ DS


                โดยระหว่างการ shift register ข้อมูลจำนวน 32 บิตนั้น
                สัญญาณ
DIN มีขนาด 16 บิต แต่ส่งไป 2 ครั้ง เพื่อให้ข้อมูลมีจำนวน 32 บิต
                สัญญาณ
CLK 1 cycle เป็นการส่งข้อมูลขนาด 1 บิต ดังนั้น เราต้องการส่งข้อมูลขนาด 32 บิต สัญญาณ CLK ต้องมีจำนวน 32 cycle
                สัญญาณ
CS จากเดิมเป็นลอจิก HIGH จะเป็นลอจิก LOW เพื่อทำการโหลดข้อมูลและเมื่อทำการส่งข้อมูล 16 บิต จำนวน 2 ครั้ง เสร็จแล้ว ก็ให้สัญญาณ CS เป็นลอจิก HIGH เพื่อรอการส่งข้อมูลครั้งต่อไป
                 


สัญญาณแสดงจำนวนข้อมูล
(สัญญาณสีแหลือง : CLK 32 cycle, สัญญาณสีฟ้า : CS)

LED16x8 Code Example for STM32F103 RBT6 
main.c
#include "stm32f1xx_hal.h"
SPI_HandleTypeDef hspi1;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_SPI1_Init(void);

void max7219_write_reg(uint8_t address1, uint8_t data1,uint8_t address2, uint8_t data2){
  uint8_t datas1[] = {data1,address1};
  uint8_t datas2[] = {data2,address2};
  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET); // CS signal : LOW
  HAL_SPI_Transmit(&hspi1, &datas1, 1, 1); // Transmit 16 bit
  HAL_SPI_Transmit(&hspi1, &datas2, 1, 1); // Transmit 16 bit
  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET); // CS signal : HIGH
}

void max7219_init(void){
  max7219_write_reg(0x9, 0x00, 0x9, 0x00); // decode mode : no decode for digit
  max7219_write_reg(0xA, 0x07, 0xA, 0x07); // set intensity
  max7219_write_reg(0xB, 0x07, 0xB, 0x07); // scan limit
  max7219_write_reg(0xC, 0x01, 0xC, 0x01); // shut down
  max7219_write_reg(0xF, 0x00, 0xF, 0x00); // display test : no display test
}

void flashing(){
  max7219_write_reg(0xC, 0x01, 0xC, 0x01); // normal operation
  max7219_write_reg(0xF, 0x01, 0xF, 0x01); // enter display test mode
  HAL_Delay(100);
  max7219_write_reg(0xF, 0x00, 0xF, 0x00); // exit display test mode
  max7219_write_reg(0xC, 0x00, 0xC, 0x00); // shutdown operation
  HAL_Delay(900);
}

uint8_t digit[8] =  {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; // Digit "0” … “Digit7" : address
uint8_t rom_data[][8] = { // data
  { 0b00000000,
    0b01111110,
    0b01000010,
    0b01111110,//0
    0b00000000,
    0b01111110,
    0b01000010,
    0b01111110 },//0
  { 0b00000000,
    0b01111110,
    0b00000000,
    0b00000000,
    0b00000000,//1
    0b01111110,
    0b01000010,
    0b01111110 }
  };

void show_esl(uint8_t ch, uint8_t a){
  uint8_t i;
  for(i=0; i<8; i++){
    max7219_write_reg(digit[i], rom_data[ch][i], digit[i], rom_data[a][i] );
  }
  HAL_Delay(500);
  ch = (ch+1)%1;
  a = (a+1)%1;
}

int main(void)
{
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_SPI1_Init();

  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET); // CS Signal : HIGH
  max7219_init();

   uint8_t i;
  for(i=0; i<8; i++){
    flashing();
  }
  max7219_write_reg(0xC, 0x01,0xC, 0x01); // normal operation

  while (1)  {
    show_esl(0,1);
  }
}

void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = 16;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  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_0);

  __HAL_RCC_AFIO_CLK_ENABLE();

}

/* SPI1 init function */
void MX_SPI1_Init(void)
{
  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_16BIT; // data size : 16 bit
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_HARD_OUTPUT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLED;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
  HAL_SPI_Init(&hspi1);
}

/** Configure pins as
        * Analog
        * Input
        * Output
        * EVENT_OUT
        * EXTI
*/
void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __GPIOA_CLK_ENABLE();
  __GPIOB_CLK_ENABLE();

  /*Configure GPIO pin : PA1 */
  GPIO_InitStruct.Pin = GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */

}

#endif





รูปแสดงตัวอย่างการต่อวงจรทดลอง


วิดีโอสาธิตการแสดงการทำงาน

ไม่มีความคิดเห็น:

แสดงความคิดเห็น