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 เพื่อรอการส่งข้อมูลครั้งต่อไป
สัญญาณ DIN มีขนาด 16 บิต แต่ส่งไป 2 ครั้ง เพื่อให้ข้อมูลมีจำนวน 32 บิต
สัญญาณ CLK 1 cycle เป็นการส่งข้อมูลขนาด 1 บิต ดังนั้น เราต้องการส่งข้อมูลขนาด 32 บิต สัญญาณ CLK ต้องมีจำนวน 32 cycle
สัญญาณ CS จากเดิมเป็นลอจิก HIGH จะเป็นลอจิก LOW เพื่อทำการโหลดข้อมูลและเมื่อทำการส่งข้อมูล 16 บิต จำนวน 2 ครั้ง เสร็จแล้ว ก็ให้สัญญาณ CS เป็นลอจิก HIGH เพื่อรอการส่งข้อมูลครั้งต่อไป
สัญญาณแสดงจำนวนข้อมูล
(สัญญาณสีแหลือง : CLK 32 cycle, สัญญาณสีฟ้า : CS)
(สัญญาณสีแหลือง : 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
|
วิดีโอสาธิตการแสดงการทำงาน
ไม่มีความคิดเห็น:
แสดงความคิดเห็น