Спойлер
Код: Выделить всё
// Посылка данных дисплею (16 бит режим)
void send_data(unsigned long int dat)
{
CS = 0;
RS = 0;
spi((dat >> 8));
spi(dat);
RS = 1;
delay_ms(1);
CS = 1;
}
// Посылка данных дисплею (8 бит режим)
void send_data8(int dat)
{
CS = 0;
RS = 0;
spi(dat);
RS = 1;
delay_ms(1);
CS = 1;
}
// Посылка комманды дисплею
void send_cmd(unsigned long int cmd)
{
CS = 0;
RS = 1;
spi((cmd >> 8));
spi(cmd);
RS = 0;
delay_ms(1);
CS = 1;
}Спойлер
Код: Выделить всё
// Посылка данных дисплею (16 бит режим)
void send_data(unsigned long int dat)
{
CS = 0;
RS = 0;
spi((dat >> 8));
spi(dat);
RS = 1;
delay_us(1);
CS = 1;
}Весь код кроме константы шрифта
Спойлер
Код: Выделить всё
#include<stm32f10x_rcc.h>
#include<stm32f10x_gpio.h>
#include "stm32f10x.h"
#include "stm32f10x_conf.h"
#include <stm32f10x_spi.h>
#include <q.c>
#define HSE_VALUE ((uint32_t)8000000)
//#define _8_BIT_COLOR //Если закомментировано - 16-ти битный цвет
#define _GEOMETRICAL //Использование функций вывода геометрических фигур
#define LCD_CS0 GPIOB->BRR = 1<<0;
#define LCD_RESET0 GPIOB->BRR = 1<<1;
#define LCD_RS0 GPIOB->BRR = 1<<12;
#define LCD_CS1 GPIOB->BSRR = 1<<0;
#define LCD_RESET1 GPIOB->BSRR = 1<<1;
#define LCD_RS1 GPIOB->BSRR = 1<<12;
char RS_old;
//=========
// Определение цветов
//=========
#ifdef _8_BIT_COLOR
//8-ми битовая цветовая палитра (256 цветов)
#define GREEN 0x1C
#define DARK_GREEN 0x15
#define RED 0xE0
#define BLUE 0x1F
#define DARK_BLUE 0x03
#define YELLOW 0xFC
#define ORANGE 0xEC
#define VIOLET 0xE3
#define WHITE 0xFF
#define BLAGK 0x00
#define GREY 0x6D
#else
//16-ти битовая цветовая палитра (65536 цветов)
#define BLACK 0x0000
#define WHITE 0xFFFF
#define GRAY 0xE79C
#define GREEN 0x07E0
#define BLUE 0x001F
#define RED 0xF800
#define SKY 0x5d1c
#define YELLOW 0xffe0
#define MAGENTA 0xf81f
#define CYAN 0x07ff
#define ORANGE 0xfca0
#define PINK 0xF97F
#define BROWN 0x8200
#define VIOLET 0x9199
#define SILVER 0xa510
#define GOLD 0xa508
#define BEGH 0xf77b
#define NAVY 0x000F
#define DARK_GREEN 0x03E0
#define DARK_CYAN 0x03EF
#define MAROON 0x7800
#define PURPLE 0x780F
#define OLIVE 0x7BE0
#define LIGHT_GREY 0xC618
#define DARK_GREY 0x7BEF
#endif
void delay_ms(uint16_t value)
{
TIM2->ARR = value; //загрузить значение задержки
TIM2->CNT = 0;
TIM2->CR1 = TIM_CR1_CEN; //запустить таймер
while((TIM2->SR & TIM_SR_UIF)==0){} //дождаться конца задержки
TIM2->SR &= ~TIM_SR_UIF; //сбросить флаг
}
int random ( long int x){return rand() %x;}
int randomv ( long int v){return rand() %v;}
int main(void)
{
RCC->CFGR |= RCC_CFGR_PLLSRC; //Источником сигнала для PLL выбран HSE
RCC->CR &= ~RCC_CR_PLLON; //Отключить генератор PLL
RCC->CFGR &= ~RCC_CFGR_PLLMULL; //Очистить PLLMULL
RCC->CFGR |= RCC_CFGR_PLLMULL9; //Коефициент умножения = 9
RCC->CR |= RCC_CR_PLLON; //Включить генератор PLL
while((RCC->CR & RCC_CR_PLLRDY)==0) {} //Ожидание готовности PLL
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; //включить тактирование альтернативных функций /
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; //включить тактирование порта А
RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1, ENABLE);
//вывод управления SS: выход двухтактный, общего назначения,50MHz /
GPIOA->CRL |= GPIO_CRL_MODE4; //
GPIOA->CRL &= ~GPIO_CRL_CNF4; //
GPIOA->BSRR = GPIO_BSRR_BS4; //
//вывод SCK: выход двухтактный, альтернативная функция, 50MHz
GPIOA->CRL |= GPIO_CRL_MODE5; //
GPIOA->CRL &= ~GPIO_CRL_CNF5; //
GPIOA->CRL |= GPIO_CRL_CNF5_1; //
//вывод MISO: вход цифровой с подтягивающим резистором, подтяжка к плюсу
GPIOA->CRL &= ~GPIO_CRL_MODE6; //
GPIOA->CRL &= ~GPIO_CRL_CNF6; //
GPIOA->CRL |= GPIO_CRL_CNF6_1; //
GPIOA->BSRR = GPIO_BSRR_BS6; //
//вывод MOSI: выход двухтактный, альтернативная функция, 50MHz
GPIOA->CRL |= GPIO_CRL_MODE7; //
GPIOA->CRL &= ~GPIO_CRL_CNF7; //
GPIOA->CRL |= GPIO_CRL_CNF7_1; //
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; //
SPI1->CR1 = 0x0000; //
SPI1->CR2 = 0x0000; //
//SPI1->CR1 |= SPI_CR1_MSTR| SPI_CR1_BR_0|SPI_CR1_SSI | SPI_CR1_SSM| SPI_CR1_SPE;
SPI1->CR1 |= SPI_CR1_MSTR| SPI_CR1_SSI | SPI_CR1_SSM| SPI_CR1_SPE;
//timer
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
TIM2->PSC = 8000-1;
TIM2->CR1 = TIM_CR1_OPM;
int x=0,v ;
unsigned char buf[10];
GPIOC->BSRR = 1<<14; // proverka
LCD_init();
LCD_FillScreen (GREEN);
while(1)
{
x= x+1;
v= random(65000);
itoa(x,buf);
LCD_Puts(buf, 0, 10, v, WHITE,5, 5,0);
LCD_Puts(buf, 0, 50, v, RED,5, 5,0);
LCD_Puts(buf, 0, 90, v, BLUE,5, 5,0);
LCD_Puts(buf, 0, 130, v, YELLOW,5, 5,0);
Delay(1000000);
// LCD_FillScreen (RED);
// Delay(10000000);
//LCD_FillScreen (BLUE);
//Delay(10000000);
//LCD_FillScreen (YELLOW);
//Delay(10000000);
}
}
void Delay(uint32_t a)
{
uint32_t i;
for (i=0; i<a; i++) {};
}
uint8_t Send_to_lcd (uint8_t data)
{
SPI1->DR = data;
while (!(SPI1->SR & SPI_SR_RXNE));
return (SPI1->DR);
}
//=========
//Функция записи команды/данных в LCD (RS==0 - команда, RS==1 - данные)
//=========
// Посылка данных дисплею (16 бит режим)
void send_data(unsigned long int data)
{
LCD_CS0;
LCD_RS1;
Send_to_lcd((data >> 8));
Send_to_lcd(data);
LCD_RS0;
LCD_CS1;
}
// Посылка данных дисплею (8 бит режим)
void send_data8(int data)
{
LCD_CS0;
LCD_RS1;
Send_to_lcd(data);
LCD_RS0;
LCD_CS1;
}
// Посылка комманды дисплею
void send_cmd(unsigned long int cmd)
{
LCD_CS0;
LCD_RS0;
Send_to_lcd((cmd >> 8));
Send_to_lcd(cmd);
LCD_RS1;
LCD_CS1;
}
void LCD_init(void)
{
LCD_RESET0;
delay_ms(100);
LCD_RESET1;
delay_ms(100);
send_cmd(0x01);
send_cmd(0x36);
send_data8(0x00);
send_cmd(0x11);
delay_ms(10);
send_cmd(0x3a);
#ifdef _8_BIT_COLOR
send_data8(0x02);
#else
send_data8(0x05);
#endif
delay_ms(10);
send_cmd(0x29);
}
void SetArea(char x1, char x2, char y1, char y2)
{
//задаем область по X
send_cmd(0x2A);
//начальная
send_data8(x1);
//конечная
send_data8(x2);
//задаем область по Y
send_cmd(0x2B);
//начальная
send_data8(y1);
//конечная
send_data8(y2);
//отправляем команду на начало записи в память и начинаем посылать данные
send_cmd(0x2C);
}
//=========
// Рисуем точку
//=========
void Put_Pixel (char x, char y, unsigned int color)
{
signed char i;
SetArea( x, x, y, y );
LCD_RS1;
#ifdef _8_BIT_COLOR //(8-ми битовая цветовая палитра (256 цветов))
send_data8(color);
#else //(16-ти битовая цветовая палитра (65536 цветов))
send_data(color);
#endif
}
void Send_Symbol (unsigned char symbol, char x, char y, int t_color, int b_color, char zoom_width, char zoom_height, int rot)
{
unsigned char temp_symbol, a, b, zw, zh, mask;
if (symbol>127) symbol-=64; //Убираем отсутствующую часть таблицы ASCII
for ( a = 0; a < 5; a++) //Перебираю 5 байт, составляющих символ
{
temp_symbol = font_5x8[symbol-32][a];
zw = 0;
while(zw != zoom_width) //Вывод байта выполняется zw раз
{
mask=0x01;
switch(rot)
{
case 0: case 180: SetArea( x+zw, x+zw, y, y+(zoom_height*8)-1 ); break;
case 90: case 270: SetArea( x, x+(zoom_height*8)-1, y+zw, y+zw ); break;
}
LCD_RS1; //Передаются данные
for ( b = 0; b < 8; b++ ) //Цикл перебирания 8 бит байта
{
zh = zoom_height; //в zoom_height раз увеличится высота символа
while(zh != 0) //Вывод пикселя выполняется z раз
{
if (temp_symbol&mask)
{
#ifdef _8_BIT_COLOR //(8-ми битовая цветовая палитра (256 цветов))
send_data8(t_color );
#else //(16-ти битовая цветовая палитра (65536 цветов))
send_data(t_color);
#endif
}
else
{
#ifdef _8_BIT_COLOR //(8-ми битовая цветовая палитра (256 цветов))
send_data8(b_color );
#else //(16-ти битовая цветовая палитра (65536 цветов))
send_data(b_color );
#endif
}
zh--;
}
mask<<=1; //Смещаю содержимое mask на 1 бит влево;
}
zw++;
}
switch(rot)
{
case 0: case 180: x=x+zoom_width; break; //Получить адрес начального пикселя по оси x для вывода очередного байта
case 90: case 270: y=y+zoom_width; break; //Получить адрес начального пикселя по оси y для вывода очередного байта
}
}
}
//=========
// Функция вывода одного символа ASCII-кода (из файла Symbols.h)
//=========
void LCD_Putchar(char symbol, char x, char y, int t_color, int b_color, char zoom_width, char zoom_height, int rot)
{
unsigned char m;
if(zoom_width == 0) zoom_width = 1;
if(zoom_height == 0) zoom_height = 1;
switch (rot)
{
case 0: //Начальный адрес осей Х и У - левый верхний угол дисплея
Send_Symbol( symbol, x, y, t_color, b_color, zoom_width, zoom_height, rot);
break;
//==============
case 90:
m=y; y=x; x=m;
send_cmd(0x36);
//Начальный адрес осей Х и У - правый верхний угол дисплея
send_data8( 0x40);
Send_Symbol( symbol, x, y, t_color, b_color, zoom_width, zoom_height, rot);
send_cmd(0x36);
send_data8( 0x00);
break;
//==============
case 180:
send_cmd(0x36);
//Начальный адрес осей Х и У - правый нижний угол дисплея
send_data8( 0xC0);
Send_Symbol( symbol, x, y, t_color, b_color, zoom_width, zoom_height, rot);
send_cmd(0x36);
send_data8( 0x00);
break;
//==============
case 270:
m=y; y=x; x=m;
send_cmd(0x36);
//Начальный адрес осей Х и У - левый нижний угол дисплея
send_data8( 0x80);
Send_Symbol( symbol, x, y, t_color, b_color, zoom_width, zoom_height, rot);
send_cmd(0x36);
send_data8( 0x00);
break;
//==============
default:
send_cmd(0x36);
//Начальный адрес осей Х и У - левый верхний угол дисплея
send_data8( 0x00);
Send_Symbol( symbol, x, y, t_color, b_color, zoom_width, zoom_height, rot);
send_cmd(0x36);
send_data8( 0x00);
//===============
};
}
void LCD_FillScreen (unsigned int color)
{
unsigned int x;
signed char i;
SetArea( 0, 131, 0, 175 ); //Область всего экрана
LCD_RS1;
//Данные - задаём цвет пикселя
for (x = 0; x < 23232; x++) // 23232 - это 132 * 176
{
#ifdef _8_BIT_COLOR //(8-ми битовая цветовая палитра (256 цветов))
send_data8( color);
#else //(16-ти битовая цветовая палитра (65536 цветов))
send_data( color);
#endif
}
}
void LCD_Puts(char *str, int x, int y, int t_color, int b_color, char zoom_width, char zoom_height, int rot)
{
unsigned char i=0;
if(zoom_width == 0) zoom_width = 1;
if(zoom_height == 0) zoom_height = 1;
while (str[i]) //x и y - адрес пикселя начальной позиции; с увеличением переменной i адрес вывода очередного символа смещается на i*6 (чем организуются столбцы дисплея)
{
LCD_Putchar(str[i], x+(i*6*zoom_width), y, t_color, b_color, zoom_width, zoom_height, rot);
i++;
}
}
void reverse(char s[])
{
int i, j;
char c;
for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
void itoa(int n, char s[])
{
int i, sign;
if ((sign = n) < 0) /* записываем знак */
n = -n; /* делаем n положительным числом */
i = 0;
do { /* генерируем цифры в обратном порядке */
s[i++] = n % 10 + '0'; /* берем следующую цифру */
} while ((n /= 10) > 0); /* удаляем */
if (sign < 0)
s[i++] = '-';
s[i] = '\0';
reverse(s);
}

