user: Converte this assembly snippet into its equivalent C code:

```asm
<character>:
  endbr64
  push   %r15
  mov    %r8d,%r15d
  push   %r14
  push   %r13
  mov    %r9d,%r13d
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  lea    0x8(%rbx),%rbp
  sub    $0x28,%rsp
  mov    0x60(%rsp),%r14d
  mov    0x68(%rsp),%r12d
  mov    %rsi,0x8(%rsp)
  mov    %rdx,0x10(%rsp)
  movzbl %r14b,%edi
  mov    %rcx,0x18(%rsp)
  call   <LCD_WriteCommand@plt>
  nopl   0x0(%rax)
L15:
  movzbl (%rbx),%edi
  add    $0x1,%rbx
  call   <LCD_WriteData@plt>
  cmp    %rbp,%rbx
  jne    L15
  movzbl %r15b,%edi
  lea    0x1(%r12),%ebp
  call   <LCD_WriteCommand@plt>
  movzbl %r12b,%edi
  call   <LCD_WriteData@plt>
  mov    $0xa,%edi
  call   <delay_ms@plt>
  lea    0x8(%r14),%edi
  lea    0x1(%r15),%eax
  movzbl %dil,%edi
  mov    %al,0x7(%rsp)
  call   <LCD_WriteCommand@plt>
  mov    0x8(%rsp),%rbx
  lea    0x8(%rbx),%r15
  nopl   0x0(%rax,%rax,1)
L1:
  movzbl (%rbx),%edi
  add    $0x1,%rbx
  call   <LCD_WriteData@plt>
  cmp    %r15,%rbx
  jne    L1
  movzbl 0x7(%rsp),%edi
  lea    0x2(%r12),%ebx
  call   <LCD_WriteCommand@plt>
  movzbl %bpl,%edi
  call   <LCD_WriteData@plt>
  mov    $0xa,%edi
  call   <delay_ms@plt>
  lea    0x10(%r14),%edi
  movzbl %dil,%edi
  call   <LCD_WriteCommand@plt>
  mov    0x10(%rsp),%r15
  lea    0x8(%r15),%rbp
  nopl   0x0(%rax)
L29:
  movzbl (%r15),%edi
  add    $0x1,%r15
  call   <LCD_WriteData@plt>
  cmp    %r15,%rbp
  jne    L29
  movzbl %r13b,%edi
  add    $0x3,%r12d
  add    $0x1,%r13d
  call   <LCD_WriteCommand@plt>
  movzbl %bl,%edi
  call   <LCD_WriteData@plt>
  mov    $0xa,%edi
  call   <delay_ms@plt>
  lea    0x18(%r14),%edi
  movzbl %dil,%edi
  call   <LCD_WriteCommand@plt>
  mov    0x18(%rsp),%rbx
  lea    0x8(%rbx),%rbp
  nopl   0x0(%rax,%rax,1)
L19:
  movzbl (%rbx),%edi
  add    $0x1,%rbx
  call   <LCD_WriteData@plt>
  cmp    %rbx,%rbp
  jne    L19
  movzbl %r13b,%edi
  call   <LCD_WriteCommand@plt>
  movzbl %r12b,%edi
  call   <LCD_WriteData@plt>
  mov    $0xa,%edi
  call   <delay_ms@plt>
  add    $0x28,%rsp
  xor    %edi,%edi
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1080 <LCD_Cursor@plt>
```

assistant: ```c
void character(unsigned char TL[], unsigned char TR[], unsigned char BL[], unsigned char BR[], unsigned char L1, unsigned char L2, unsigned char SA, unsigned char DN) {
  unsigned char index = 0;
  unsigned char displayNumber = DN;
  LCD_WriteCommand(SA);
  for (index = 0; index < 8; ++index)
    LCD_WriteData(TL[index]);
  LCD_WriteCommand(L1);
  LCD_WriteData(displayNumber);
  delay_ms(10);
  SA += 0x08;
  ++displayNumber;
  ++L1;
  LCD_WriteCommand(SA);
  for (index = 0; index < 8; ++index)
    LCD_WriteData(TR[index]);
  LCD_WriteCommand(L1);
  LCD_WriteData(displayNumber);
  delay_ms(10);
  SA += 0x08;
  ++displayNumber;
  LCD_WriteCommand(SA);
  for (index = 0; index < 8; ++index)
    LCD_WriteData(BL[index]);
  LCD_WriteCommand(L2);
  LCD_WriteData(displayNumber);
  delay_ms(10);
  SA += 0x08;
  ++displayNumber;
  ++L2;
  LCD_WriteCommand(SA);
  for (index = 0; index < 8; ++index)
    LCD_WriteData(BR[index]);
  LCD_WriteCommand(L2);
  LCD_WriteData(displayNumber);
  delay_ms(10);
  LCD_Cursor(0);
}
```