Страницы

Страницы

понедельник, 5 декабря 2016 г.

STM32F429ZI & SSD1298 & 3.2" TFT LSD GPIO control












main.c

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f4xx_hal.h"


/* USER CODE BEGIN Includes */
#include "NewFont.h"
/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
  uint16_t Display_ID;   
  uint32_t X;  // Эти две переменные у меня глобальные
  uint32_t Y; // от них ведется отсчет для следующего вывода букв
  uint32_t paper=0x0000, ink=0xffff; // Глобальные переменные - цвет фона и буквы  0000 - black  ffff - white
  
  uint16_t value[16]={0};
  uint16_t read_data;  
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
void Error_Handler(void);
static void MX_GPIO_Init(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
void Delay_mks(void){
//uint32_t delay = 5;
//while(delay!=0){delay--;}
}


void MX_GPIO_Init_input(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;

  /*Configure GPIO pins : D4_Pin D5_Pin D6_Pin D7_Pin 
                           D8_Pin D9_Pin D10_Pin D11_Pin 
                           D12_Pin */
  GPIO_InitStruct.Pin = D4_Pin|D5_Pin|D6_Pin|D7_Pin 
                          |D8_Pin|D9_Pin|D10_Pin|D11_Pin 
                          |D12_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  /*Configure GPIO pins : D13_Pin D14_Pin D15_Pin D0_Pin 
                           D1_Pin D2_Pin D3_Pin */
  GPIO_InitStruct.Pin = D13_Pin|D14_Pin|D15_Pin|D0_Pin 
                          |D1_Pin|D2_Pin|D3_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);    
}

void MX_GPIO_Init_out(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOE, D4_Pin|D5_Pin|D6_Pin|D7_Pin 
                          |D8_Pin|D9_Pin|D10_Pin|D11_Pin 
                          |D12_Pin, GPIO_PIN_RESET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOD, D13_Pin|D14_Pin|D15_Pin|RS_Pin 
                          |D0_Pin|D1_Pin|D2_Pin|D3_Pin 
                          , GPIO_PIN_RESET);

  /*Configure GPIO pins : D4_Pin D5_Pin D6_Pin D7_Pin 
                           D8_Pin D9_Pin D10_Pin D11_Pin 
                           D12_Pin */
  GPIO_InitStruct.Pin = D4_Pin|D5_Pin|D6_Pin|D7_Pin 
                          |D8_Pin|D9_Pin|D10_Pin|D11_Pin 
                          |D12_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  /*Configure GPIO pins : D13_Pin D14_Pin D15_Pin RS_Pin 
                           D0_Pin D1_Pin D2_Pin D3_Pin 
                           RD_Pin WR_Pin CS_Pin */
  GPIO_InitStruct.Pin = D13_Pin|D14_Pin|D15_Pin|RS_Pin 
                          |D0_Pin|D1_Pin|D2_Pin|D3_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

}

// Процедура записи адреса регистра
void LCD_WriteIndex(uint16_t index){
HAL_GPIO_WritePin(RS_GPIO_Port, RS_Pin, GPIO_PIN_RESET);//  LCD_RS = 0; // Тип данных - команда (в данном случае адрес)
HAL_GPIO_WritePin(RD_GPIO_Port, RD_Pin, GPIO_PIN_SET);//LCD_RD = 1; // При записи RD должен быть стопудово равен 1, а то не запишет
  
if((index & 0x0001) == 0x0001){
HAL_GPIO_WritePin(D0_GPIO_Port, D0_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D0_GPIO_Port, D0_Pin, GPIO_PIN_RESET);}
if((index & 0x0002) == 0x0002){
HAL_GPIO_WritePin(D1_GPIO_Port, D1_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D1_GPIO_Port, D1_Pin, GPIO_PIN_RESET);}
if((index & 0x0004) == 0x0004){
HAL_GPIO_WritePin(D2_GPIO_Port, D2_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D2_GPIO_Port, D2_Pin, GPIO_PIN_RESET);}
if((index & 0x0008) == 0x0008){
HAL_GPIO_WritePin(D3_GPIO_Port, D3_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D3_GPIO_Port, D3_Pin, GPIO_PIN_RESET);}
if((index & 0x0010) == 0x0010){
HAL_GPIO_WritePin(D4_GPIO_Port, D4_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D4_GPIO_Port, D4_Pin, GPIO_PIN_RESET);}
if((index & 0x0020) == 0x0020){
HAL_GPIO_WritePin(D5_GPIO_Port, D5_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D5_GPIO_Port, D5_Pin, GPIO_PIN_RESET);}
if((index & 0x0040) == 0x0040){
HAL_GPIO_WritePin(D6_GPIO_Port, D6_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D6_GPIO_Port, D6_Pin, GPIO_PIN_RESET);}
if((index & 0x0080) == 0x0080){
HAL_GPIO_WritePin(D7_GPIO_Port, D7_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D7_GPIO_Port, D7_Pin, GPIO_PIN_RESET);}
if((index & 0x0100) == 0x0100){
HAL_GPIO_WritePin(D8_GPIO_Port, D8_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D8_GPIO_Port, D8_Pin, GPIO_PIN_RESET);}
if((index & 0x0200) == 0x0200){
HAL_GPIO_WritePin(D9_GPIO_Port, D9_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D9_GPIO_Port, D9_Pin, GPIO_PIN_RESET);}
if((index & 0x0400) == 0x0400){
HAL_GPIO_WritePin(D10_GPIO_Port, D10_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D10_GPIO_Port, D10_Pin, GPIO_PIN_RESET);}
if((index & 0x0800) == 0x0800){
HAL_GPIO_WritePin(D11_GPIO_Port, D11_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D11_GPIO_Port, D11_Pin, GPIO_PIN_RESET);}
if((index & 0x1000) == 0x1000){
HAL_GPIO_WritePin(D12_GPIO_Port, D12_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D12_GPIO_Port, D12_Pin, GPIO_PIN_RESET);}
if((index & 0x2000) == 0x2000){
HAL_GPIO_WritePin(D13_GPIO_Port, D13_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D13_GPIO_Port, D13_Pin, GPIO_PIN_RESET);}
if((index & 0x4000) == 0x4000){
HAL_GPIO_WritePin(D14_GPIO_Port, D14_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D14_GPIO_Port, D14_Pin, GPIO_PIN_RESET);}
if((index & 0x8000) == 0x8000){
HAL_GPIO_WritePin(D15_GPIO_Port, D15_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D15_GPIO_Port, D15_Pin, GPIO_PIN_RESET);}

HAL_GPIO_WritePin(WR_GPIO_Port, WR_Pin, GPIO_PIN_RESET);//  LCD_WR = 0; // Следующие три строки - строб /WR
HAL_GPIO_WritePin(WR_GPIO_Port, WR_Pin, GPIO_PIN_SET);//LCD_WR = 1;
}

// Процедура записи данных в регистр или ОЗУ
void LCD_WriteData(uint16_t data){
HAL_GPIO_WritePin(RS_GPIO_Port, RS_Pin, GPIO_PIN_SET);//  LCD_RS = 1; // Тип данных - данные
HAL_GPIO_WritePin(RD_GPIO_Port, RD_Pin, GPIO_PIN_SET);//LCD_RD = 1; // При записи RD должен быть стопудово равен 1, а то не запишет
  
if((data & 0x0001) == 0x0001){
HAL_GPIO_WritePin(D0_GPIO_Port, D0_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D0_GPIO_Port, D0_Pin, GPIO_PIN_RESET);}
if((data & 0x0002) == 0x0002){
HAL_GPIO_WritePin(D1_GPIO_Port, D1_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D1_GPIO_Port, D1_Pin, GPIO_PIN_RESET);}
if((data & 0x0004) == 0x0004){
HAL_GPIO_WritePin(D2_GPIO_Port, D2_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D2_GPIO_Port, D2_Pin, GPIO_PIN_RESET);}
if((data & 0x0008) == 0x0008){
HAL_GPIO_WritePin(D3_GPIO_Port, D3_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D3_GPIO_Port, D3_Pin, GPIO_PIN_RESET);}
if((data & 0x0010) == 0x0010){
HAL_GPIO_WritePin(D4_GPIO_Port, D4_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D4_GPIO_Port, D4_Pin, GPIO_PIN_RESET);}
if((data & 0x0020) == 0x0020){
HAL_GPIO_WritePin(D5_GPIO_Port, D5_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D5_GPIO_Port, D5_Pin, GPIO_PIN_RESET);}
if((data & 0x0040) == 0x0040){
HAL_GPIO_WritePin(D6_GPIO_Port, D6_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D6_GPIO_Port, D6_Pin, GPIO_PIN_RESET);}
if((data & 0x0080) == 0x0080){
HAL_GPIO_WritePin(D7_GPIO_Port, D7_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D7_GPIO_Port, D7_Pin, GPIO_PIN_RESET);}
if((data & 0x0100) == 0x0100){
HAL_GPIO_WritePin(D8_GPIO_Port, D8_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D8_GPIO_Port, D8_Pin, GPIO_PIN_RESET);}
if((data & 0x0200) == 0x0200){
HAL_GPIO_WritePin(D9_GPIO_Port, D9_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D9_GPIO_Port, D9_Pin, GPIO_PIN_RESET);}
if((data & 0x0400) == 0x0400){
HAL_GPIO_WritePin(D10_GPIO_Port, D10_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D10_GPIO_Port, D10_Pin, GPIO_PIN_RESET);}
if((data & 0x0800) == 0x0800){
HAL_GPIO_WritePin(D11_GPIO_Port, D11_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D11_GPIO_Port, D11_Pin, GPIO_PIN_RESET);}
if((data & 0x1000) == 0x1000){
HAL_GPIO_WritePin(D12_GPIO_Port, D12_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D12_GPIO_Port, D12_Pin, GPIO_PIN_RESET);}
if((data & 0x2000) == 0x2000){
HAL_GPIO_WritePin(D13_GPIO_Port, D13_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D13_GPIO_Port, D13_Pin, GPIO_PIN_RESET);}
if((data & 0x4000) == 0x4000){
HAL_GPIO_WritePin(D14_GPIO_Port, D14_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D14_GPIO_Port, D14_Pin, GPIO_PIN_RESET);}
if((data & 0x8000) == 0x8000){
HAL_GPIO_WritePin(D15_GPIO_Port, D15_Pin, GPIO_PIN_SET);}
else{HAL_GPIO_WritePin(D15_GPIO_Port, D15_Pin, GPIO_PIN_RESET);}  
  
HAL_GPIO_WritePin(WR_GPIO_Port, WR_Pin, GPIO_PIN_RESET);//  LCD_WR = 0; // Следующие три строки - строб /WR
HAL_GPIO_WritePin(WR_GPIO_Port, WR_Pin, GPIO_PIN_SET);//LCD_WR = 1;
}

void LCD_WriteReg(uint16_t LCD_Reg, uint16_t LCD_RegValue){
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET);//  LCD_CS = 0; // Активируем Chip Select
  LCD_WriteIndex(LCD_Reg);  // Пишем адрес регистра
  LCD_WriteData(LCD_RegValue);  // Пишем в него данные
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);//  LCD_CS = 1; // Деактивируем Chip Select
}

// Процедура чтения из регистра или ОЗУ
uint16_t LCD_ReadReg(uint16_t LCD_Reg){
  uint16_t reg_val; 
  LCD_WriteIndex(LCD_Reg); // Пишем адрес регистра
  
HAL_GPIO_WritePin(WR_GPIO_Port, WR_Pin, GPIO_PIN_SET);//  LCD_WR = 1; // Вывод записи должен быть стопудово в 1   
HAL_GPIO_WritePin(RD_GPIO_Port, RD_Pin, GPIO_PIN_RESET);//  LCD_RD = 0; // Выставляем сигнал чтения  
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET);//LCD_CS = 0; // Активируем Chip Select 
MX_GPIO_Init_input();   
//Delay_mks();  
value[0] = HAL_GPIO_ReadPin(D0_GPIO_Port, D0_Pin);
value[1] = HAL_GPIO_ReadPin(D1_GPIO_Port, D1_Pin);
value[2] = HAL_GPIO_ReadPin(D2_GPIO_Port, D2_Pin);
value[3] = HAL_GPIO_ReadPin(D3_GPIO_Port, D3_Pin);
value[4] = HAL_GPIO_ReadPin(D4_GPIO_Port, D4_Pin);
value[5] = HAL_GPIO_ReadPin(D5_GPIO_Port, D5_Pin);
value[6] = HAL_GPIO_ReadPin(D6_GPIO_Port, D6_Pin);
value[7] = HAL_GPIO_ReadPin(D7_GPIO_Port, D7_Pin);
value[8] = HAL_GPIO_ReadPin(D8_GPIO_Port, D8_Pin);
value[9] = HAL_GPIO_ReadPin(D9_GPIO_Port, D9_Pin);
value[10] = HAL_GPIO_ReadPin(D10_GPIO_Port, D10_Pin);
value[11] = HAL_GPIO_ReadPin(D11_GPIO_Port, D11_Pin);
value[12] = HAL_GPIO_ReadPin(D12_GPIO_Port, D12_Pin);
value[13] = HAL_GPIO_ReadPin(D13_GPIO_Port, D13_Pin);  
value[14] = HAL_GPIO_ReadPin(D14_GPIO_Port, D14_Pin);  
value[15] = HAL_GPIO_ReadPin(D15_GPIO_Port, D15_Pin);  
read_data = 0;
read_data = (value[0]) || read_data;
read_data = (value[1] << 1) | read_data;
read_data = (value[2] << 2) | read_data;
read_data = (value[3] << 3) | read_data;
read_data = (value[4] << 4) | read_data;
read_data = (value[5] << 5) | read_data;
read_data = (value[6] << 6) | read_data;
read_data = (value[7] << 7) | read_data;
read_data = (value[8] << 8) | read_data;
read_data = (value[9] << 9) | read_data;
read_data = (value[10] << 10) | read_data;
read_data = (value[11] << 11) | read_data;
read_data = (value[12] << 12) | read_data;
read_data = (value[13] << 13) | read_data;
read_data = (value[14] << 14) | read_data;
read_data = (value[15] << 15) | read_data;

HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);//  LCD_CS = 1; // Деактивируем Chip Select           
MX_GPIO_Init_out();
HAL_GPIO_WritePin(RD_GPIO_Port, RD_Pin, GPIO_PIN_SET);// LCD_RD = 1;   // Сбрасываем линию RD
//return read_data;  
reg_val = read_data;  

  return reg_val;
}

////////////////////////////////////////////////
void LCD_Initializtion(void){
  HAL_Delay(100);  // Выжидаем некоторое время (может потребоваться на больших частотах)
//  LCD_RES = 1;    // Деактивируем аппаратный сброс, который был активирован при настройке портов МК
  // Теперь записываем данные для настройки контроллера дисплея
  // Эти параметры я брал в интернете. Сначала происходит настрока внутреннего преобразователя
  // для питания стекляшки. Эти параметры я менять не советую...
  LCD_WriteReg(0x0028,0x0006);  // VCOM OTP
  LCD_WriteReg(0x0000,0x0001);  // Oscillation start
  LCD_WriteReg(0x0003,0xaea4);  // power control 1---line frequency and VHG,VGL voltage
  LCD_WriteReg(0x000c,0x0004);  // power control 2---VCIX2 output voltage
  LCD_WriteReg(0x000d,0x000c);  // power control 3---Vlcd63 voltage
  LCD_WriteReg(0x000e,0x2800);  // power control 4---VCOMA voltage VCOML=VCOMH*0.9475-VCOMA
  LCD_WriteReg(0x001e,0x00b5);  // POWER CONTROL 5---VCOMH voltage
  // Следующие параметры описаны в ДШ на стр. 30-31. Они определяют порядок сканирования строк,
  // порядок вывода цветов и др.
  LCD_WriteReg(0x0001,0x3B3F);  // Driver Output Control
  // Следующую строку также менять не советую
  LCD_WriteReg(0x0002,0x0600);  // LCD Drive AC Control
  // Регистр управления режимом Sleep. Может понадобиться для устройств с батарейным питанием
  // Для справки: Дисплей потребляет от 2,5 до 8 мА в активном режиме
  // и от 70 до 300 мкА в спящем (стр. 63 ДШ)
  LCD_WriteReg(0x0010,0x0000);  // Sleep Mode
  // Режим позиционирования и направления сканирования дисплея.
  // Для данных значений при расположении дисплея в Landscape контроллер справа
  // нижний левый угол будет иметь координаты 0,0
  // Я такие значения применил для вывода изображений из BMP файлов

  // Для Portrait положения дисплея строка будет иметь вид LCD_WriteReg(0x0011,0x6830);
  // Более подробно по данной установке можно прочитать на стр. 43-46 ДШ
  LCD_WriteReg(0x0011,0x6838);  // Entry Mode
  // Не нашел этих параметров в ДШ, но переписывать не стал...
  LCD_WriteReg(0x0005,0x0000);  // ???
  LCD_WriteReg(0x0006,0x0000);  // ???
  LCD_WriteReg(0x0016,0xef1c);  // ???
  // Следующие настройки можно посмотреть на стр. 39 ДШ
  LCD_WriteReg(0x0007,0x0033);  // Display control 1
    /* when GON=1 and DTE=0,all gate outputs become VGL */
    /* when GON=1 and DTE=0,all gate outputs become VGH */
    /* non-selected gate wires become VGL */
  // Далее расположены настройки размера видимой области дисплея. Их можно менять
  // по ходу работы при необходимости вывода в определенную область экрана
  LCD_WriteReg(0x000b,0x0000);  // Frame Cycle Control
  LCD_WriteReg(0x000f,0x0000);  // Gate Scan Start Position
  LCD_WriteReg(0x0041,0x0000);  // Vertical Scroll Control 1
  LCD_WriteReg(0x0042,0x0000);  // Vertical Scroll Control 2
  LCD_WriteReg(0x0048,0x0000);  // First Window Start
  LCD_WriteReg(0x0049,0x013f);  // First Window End
  LCD_WriteReg(0x004a,0x0000);  // Second Window Start
  LCD_WriteReg(0x004b,0x0000);  // Second Window End
  LCD_WriteReg(0x0044,0xef00);  // Horizontal RAM start and end address
  LCD_WriteReg(0x0045,0x0000);  // Vertical RAM start address
  LCD_WriteReg(0x0046,0x013f);  // Vertical RAM end address
  // Счетчики строк и столбцов. Я их меняю функцией LCD_SetCursor
  LCD_WriteReg(0x004e,0x0000);  // Set GDDRAM X address counter
  LCD_WriteReg(0x004f,0x0000);  // Set GDDRAM Y address counter
  // Управление гаммой цветов. Для предотвращения искажения не рекомендую менять их
  LCD_WriteReg(0x0030,0x0707);
  LCD_WriteReg(0x0031,0x0202);
  LCD_WriteReg(0x0032,0x0204);
  LCD_WriteReg(0x0033,0x0502);
  LCD_WriteReg(0x0034,0x0507);
  LCD_WriteReg(0x0035,0x0204);
  LCD_WriteReg(0x0036,0x0204);
  LCD_WriteReg(0x0037,0x0502);
  LCD_WriteReg(0x003a,0x0302);
  LCD_WriteReg(0x003b,0x0302);
  LCD_WriteReg(0x0023,0x0000);
  LCD_WriteReg(0x0024,0x0000);
  LCD_WriteReg(0x0025,0x8000);
  LCD_WriteReg(0x0026,0x7000);
  LCD_WriteReg(0x0020,0xb0eb);
  LCD_WriteReg(0x0027,0x007c);
  // После выполнения этой процедуры дисплей должен включиться и на экране появится
  // мусор в виде случайным образом засвеченных точек
}

// Процедура установки адресных регистров контроллера дисплея
void LCD_SetCursor(unsigned int Xpos, unsigned int Ypos ){

  X = Xpos; // Обновляем их новыми значениями
  Y = Ypos;
  LCD_WriteReg(0x004e, Ypos );  // Записываем новые значения в счетчики строк
  LCD_WriteReg(0x004f, Xpos );  // и столбцов
}

// Функция очистки дисплея заливает весь экран цветом, указанным в аргументе Color
void LCD_Clear(uint16_t Color)
{
  unsigned long index=0;
  LCD_SetCursor(0,0); // Устанавливаем курсор в начало
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET);//  LCD_CS = 0; // Здесь запись организована "атомарно" для ускорения процедуры
  LCD_WriteIndex(0x0022); // Запись этого адреса в регистр индекса означает, что
                          // сейчас будут выводиться данные в экранное ОЗУ
                          // Как себя будут вести счетчики строк и столбцов определяется
                          // регистром с адресом 0x0011
  for(index=0;index < 0x12C00;index++)
{ // цикл с количеством итераций 320*240
    LCD_WriteData(Color); // ставим точки заданного цвета
  }
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);//  LCD_CS = 1;         // Отцепляемся от дисплея
}

// Одна из сложнейших функций - вывод буквы в текущую позицию дисплея
void LCD_Putchar(uint16_t chr){  // Аргумент - код буквы 
  uint8_t i, a, tmp;
  uint16_t addr;
  switch(chr){  // Так я организовал переход на новую строку 
    case 10:
      Y -= 9;
    break;
    case 13:    // И "возврат каретки"
      X = 3;
    break;
    default:
      addr = chr << 3;
      tmp = Y;  // сохраняем позицию для возврата при отображении новой строки точек
      for(i=0;i<8;i++){     //Счетчик строки знакоместа
        LCD_WriteReg(0x004e,Y); // Установка координаты Y
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET);//        LCD_CS = 0;         // Выводим строку точек
        LCD_WriteIndex(0x0022);
        for(a=0;a<8;a++){   //Счетчик столбцов знакоместа
          if(NewFont8x8[addr+a]&(0x80>>i)){ // Если в знакоместе точка = 1
            LCD_WriteData(ink);     // Выводим цвет ink
          }else{
            LCD_WriteData(paper);   // Иначе цвет фона
          }
        }
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);//        LCD_CS = 1;
        Y++;  // Переходим на новую строку знакоместа
      }
      Y = tmp;  // Восстанавливаем значение буквы по вертикали
      // Ниже расположено вычисление ширины буквы для более плотного расположения текста на экране
      i = 3;    
      for(a=7;a!=0;a--){
        if(NewFont8x8[addr+a] != 0x00){
          i = a + 2;
          break;
        }
      }
      // Переходим на новую строку если достигли правого края экрана
      X += i;
      if(X > 310){
        Y -= 9;
        X = 3;
      }
    break;
  }
  LCD_SetCursor(X, Y); // Координаты следует сохранить для вывода последующего символа
}

// Вывод строки на экран. В качестве аргумента - указатель на строку
void LCD_PutString(uint8_t* str){//
  uint16_t i=0;
  while(str[i]){  // Пока не встретим терминатора...
    LCD_Putchar(str[i]);
    i++;
  }
}

// Это я написал ввиду наличия строковых констант
void putString(const char* str){//
  uint16_t i=0;
  while(str[i]){
    LCD_Putchar(str[i]);
    i++;
  }
}

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

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

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

  /* USER CODE BEGIN 2 */
//while(1){  
//HAL_GPIO_WritePin(RESET_GPIO_Port, RESET_Pin, GPIO_PIN_SET);
//HAL_GPIO_WritePin(RESET_GPIO_Port, RESET_Pin, GPIO_PIN_RESET);  
//}
  
HAL_Delay(100);  
HAL_GPIO_WritePin(RESET_GPIO_Port, RESET_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(EN_LED_GPIO_Port, EN_LED_Pin, GPIO_PIN_RESET);  

HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(WR_GPIO_Port, WR_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(RD_GPIO_Port, RD_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(RS_GPIO_Port, RS_Pin, GPIO_PIN_SET);
  
HAL_Delay(500);
HAL_GPIO_WritePin(EN_LED_GPIO_Port, EN_LED_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(RESET_GPIO_Port, RESET_Pin, GPIO_PIN_SET);  
HAL_GPIO_WritePin(EN_LED_GPIO_Port, EN_LED_Pin, GPIO_PIN_SET);  

LCD_Initializtion();
LCD_Clear(0xffff);
HAL_Delay(100);
LCD_Clear(0);
HAL_Delay(100);
Display_ID = LCD_ReadReg(0);

  for(uint8_t iii=0;iii<=0xfe;iii++){  
  LCD_Putchar(0x20);}
    for(uint8_t iii=0;iii<=0xfe;iii++){  
  LCD_Putchar(0x20);}
      for(uint8_t iii=0;iii<=0xfe;iii++){  
  LCD_Putchar(iii);}
        for(uint8_t iii=0;iii<=0xfe;iii++){  
  LCD_Putchar(iii);}
          for(uint8_t iii=0;iii<=0xfe;iii++){  
  LCD_Putchar(iii);}

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)  {    
//for(uint16_t qqq=0; qqq <= 0xfffe; qqq++){
//paper=4*qqq;
//ink=0xFFFF-4*qqq;  
//  for(uint8_t iii=0;iii<=0xfe;iii++){  
//  LCD_Putchar(iii);}
//}

//HAL_Delay(10);       
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

/** System Clock Configuration
*/

Комментариев нет:

Отправить комментарий