Вс ноя 23, 2014 18:47:46
Пн ноя 24, 2014 07:12:35
Пн ноя 24, 2014 18:49:37
Чт апр 23, 2015 08:43:25
Вс ноя 22, 2015 08:15:22
/*
DISPLAY_st7920.cpp
Библиотека для работы с дисплеями построенными на базе чипа ST7920
проддерживает :
8 бит паралельный интерфейс
Протестированно с дисплеями:
12864B v2.0
Изменения:
*/
//Настройки библиотеки
#define DISP_st7920_ControlPort PORTA //Порт в котором находятся сигналы управления RST,RS,RW,E
#define DISP_st7920_ControlPortDirect DDRA //ССылка на порт управления контрольным портом
#define DISP_st7920_PinRST 4 //ПИН в контрольном порте отвечающий за RST
#define DISP_st7920_PinRS 5 //ПИН в контрольном порте отвечающий за RS
#define DISP_st7920_PinRW 6 //ПИН в контрольном порте отвечающий за RW
#define DISP_st7920_PinE 7 //ПИН в контрольном порте отвечающий за E
#define DISP_st7920_DataPort PORTD //Порт с данными
#define DISP_st7920_DataPortDirect DDRD //Порт на управление портом данных
//Настройки работы
#define DISP_st7920_DelayAccess 34 //Задержка работы чипа дисплея указывается в НС (для некоторх дисплеев надо менять иначе лезут артефакты)
#define DISP_st7920_ParalelModeBits 1 //Количество битов при работе с паралельным интерфейсом 0=4/1=8
//НАстройки для графических библиотке
#define GraphicDisplayHeight 64 //Высота дисплея
#define GraphicDisplayWidth 128 //Ширина дисплея
#define GraphicDisplayByteOrientation 0 //Горизонтальная ориентация байтов
#define GraphicDisplayPixelFunction //Функция вывода пикселя на экран обязательный формат : function(x,y,mode) mode=0 удалить пиксель/1=установить пиксель/2- изменить на другой
//Промежуточные макросы
#define DISP_st7920_RS_H DISP_st7920_ControlPort |= 1<<DISP_st7920_PinRS;
#define DISP_st7920_RS_L DISP_st7920_ControlPort &= ~(1<<DISP_st7920_PinRS);
#define DISP_st7920_RW_H DISP_st7920_ControlPort |= 1<<DISP_st7920_PinRW;
#define DISP_st7920_RW_L DISP_st7920_ControlPort &= ~(1<<DISP_st7920_PinRW);
#define DISP_st7920_E_H DISP_st7920_ControlPort |= 1<<DISP_st7920_PinE;
#define DISP_st7920_E_L DISP_st7920_ControlPort &= ~(1<<DISP_st7920_PinE);
#define DISP_st7920_PM_W DISP_st7920_DataPortDirect =255;//TODO реализовать 4 бита
#define DISP_st7920_PM_R DISP_st7920_DataPortDirect =0;
char InstructionSet=0;
//Команды Set1
#define CODE_Clear 0b00000001
#define CODDISP_st7920_E_Home 0b00000010
#define CODE_EntryMode 0b00000100
#define CODE_Display 0b00001000
#define CODE_CursorDisplayControl 0b00010000
#define CODE_FunctionSet 0b00100000
#define CODE_SetCGRAM_Addr 0b01000000
#define CODE_SetDDRAM_Addr 0b10000000
//Команды Set2
#define CODE_SetGraphicRam_Addr 0b10000000
void DISP_st7920_WriteCMD(char CMD)
{
DISP_st7920_PM_W //Порт в запись
DISP_st7920_E_L //E=0
DISP_st7920_RS_L //RS=0
DISP_st7920_RW_L //RW=0
PORTD=CMD;
DISP_st7920_E_H //E=1
DISP_st7920_E_L //E=0
_delay_us(DISP_st7920_DelayAccess);
}
void DISP_st7920_WriteData(char Data)
{
DISP_st7920_PM_W //Порт в запись
DISP_st7920_E_L //E=0
DISP_st7920_RS_H //RS=1
DISP_st7920_RW_L //RW=0
PORTD=Data;
DISP_st7920_E_H //E=1
DISP_st7920_E_L //E=0
_delay_us(DISP_st7920_DelayAccess);
}
char DISP_st7920_ReadData()
{
DISP_st7920_PM_R //Порт в чтение
DISP_st7920_E_L //E=0
DISP_st7920_RS_H //RS=1
DISP_st7920_RW_H //RW=1
DISP_st7920_E_H //E=1
DISP_st7920_E_L //E=0
_delay_us(DISP_st7920_DelayAccess);
return PIND;
}
char DISP_st7920_ReadBusyFlag()
{
DISP_st7920_RS_L
DISP_st7920_RW_H
DISP_st7920_PM_R
DISP_st7920_E_H
DISP_st7920_E_L
_delay_us(DISP_st7920_DelayAccess);
return PIND7==1;
}
void DISP_st7920_WaitBusy()
{
while(DISP_st7920_ReadBusyFlag());
}
void DISP_st7920_CMD_FunctionSet(char Extend)
{
InstructionSet=(Extend&1);
DISP_st7920_WriteCMD(CODE_FunctionSet | (DISP_st7920_ParalelModeBits<<4) | (InstructionSet<<2));//Инициализируем интерфейс TODO не предусмотрен SPI Режим только паралельный
_delay_us(80);
DISP_st7920_WaitBusy();
}
void DISP_st7920_CMD_Clear()
{
if(InstructionSet)DISP_st7920_CMD_FunctionSet(0);
DISP_st7920_WriteCMD(CODE_Clear);
_delay_us(1600);
DISP_st7920_WaitBusy();
}
/*
Options:
D0-Display Shift
если =1 то бит I/D управляет всем экраном
если =0 то бит I/D управляет ккурсором
D1-I/Daddress counter(AC)
если =1 то курсор двигается в право AC +1
если =1 то курсор двигается в лево AC-1
*/
void DISP_st7920_CMD_EntryMode(char Options)
{
if(InstructionSet)DISP_st7920_CMD_FunctionSet(0);
DISP_st7920_WriteCMD(CODE_EntryMode| (Options&3));
_delay_us(80);
DISP_st7920_WaitBusy();
}
/*
Options:
D0-Cursor Blinking (0=Off/1=On)
D1-Display Cursor (0=Off/1=On)
D2-Display (0=Off/1=On)
D3-D7-NU
*/
void DISP_st7920_CMD_Display(char Options)
{
if(InstructionSet)DISP_st7920_CMD_FunctionSet(0);
DISP_st7920_WriteCMD(CODE_Display | (Options&7));
_delay_us(80);
DISP_st7920_WaitBusy();
}
void DISP_st7920_CMD_SetCGRAM(char Addr)
{
if(InstructionSet)DISP_st7920_CMD_FunctionSet(0);
DISP_st7920_WriteCMD(CODE_SetCGRAM_Addr | (Addr & 63));
_delay_us(80);
DISP_st7920_WaitBusy();
}
void DISP_st7920_CMD_SetDDRAM(char Addr)
{
if(InstructionSet)DISP_st7920_CMD_FunctionSet(0);
DISP_st7920_WriteCMD(CODE_SetDDRAM_Addr | (Addr & 127));
_delay_us(80);
DISP_st7920_WaitBusy();
}
void DISP_st7920_CMD_GraphicRam_Addr(char Vertical,char Horizontal)
{
if(!InstructionSet)DISP_st7920_CMD_FunctionSet(1);
DISP_st7920_WriteCMD(CODE_SetGraphicRam_Addr | (Vertical & 127));
_delay_us(80);
DISP_st7920_WaitBusy();
DISP_st7920_WriteCMD(CODE_SetGraphicRam_Addr | (Horizontal & 15));
_delay_us(80);
DISP_st7920_WaitBusy();
}
void DISP_st7920_CMD_GraphicMode(char Mode)
{
if(!InstructionSet)DISP_st7920_CMD_FunctionSet(1);
DISP_st7920_WriteCMD(CODE_FunctionSet | (DISP_st7920_ParalelModeBits<<4) | (1<<2) | ((Mode & 1)<<1));
_delay_us(80);
DISP_st7920_WaitBusy();
}
void DISP_st7920_CMD_GraphicCLS()
{
for (char r=0;r<32;r++)
{
DISP_st7920_CMD_GraphicRam_Addr(r,0);//Выставляем линию
for(char c=0;c<16;c++)
{
DISP_st7920_WriteData(0);
DISP_st7920_WriteData(0);
}
}
}
void DISP_st7920_Pixel(char X,char Y, char Mode)
{
char HA= X / 16;//Высчитываем горизонтальный адресс
char P= X % 16;//Смещение в битах
DISP_st7920_CMD_GraphicRam_Addr(Y,HA);
char H,L,DH,DL;
if(P>7) H=128>>(P-8);//Расчитываем нашу точку
else L=128>>P;
DL=DISP_st7920_ReadData();//Вычитываем уже то что там было
DH=DISP_st7920_ReadData();
switch(Mode)
{
case 0://Reset pixel
{
L=DL & (~L);
H=DL & (~H);
break;
}
case 1://Set pixel
{
L=DL | L;
H=DL | H;
break;
}
case 2://Set pixel
default:
{
L=DL ^ L;
H=DL ^ H;
break;
}
}
DISP_st7920_CMD_GraphicRam_Addr(Y,HA);//Опять ставим адресс
DISP_st7920_WriteData(DL);//Пишем что получилось
DISP_st7920_WriteData(DH);
}
void DISP_st7920_Init()
{
DISP_st7920_E_L //E=0
DISP_st7920_PM_W //Port to Write
DISP_st7920_RS_L
DISP_st7920_RW_L
DISP_st7920_CMD_FunctionSet(0);
_delay_us(150);
DISP_st7920_CMD_FunctionSet(0);
}
Вс ноя 22, 2015 09:01:52
Вс ноя 22, 2015 10:25:39
Вс ноя 22, 2015 13:57:36
Вс ноя 22, 2015 14:18:48
Вс ноя 22, 2015 14:20:09
Вс ноя 22, 2015 14:26:38
Пн ноя 23, 2015 01:32:16
rastamanoff писал(а):Насчет Proteusa.
Скоее всего я не правильно выразился.Дело в том ,что плагина для st7920 под Proteus ,я в сети не нашел.Зато есть ks0108,правда только 8-bit.Библиотека u8glib поддерживает оба дисплея.Инициализация LCD это одна строка в коде.Я писал две,допустим инициализация для SPI(st7920) и 8-bit(ks0108),одна из которых закоментирована в зависимости от того симулирую я в Proteuse или заливаю прошивку в реальный контролер.В симуляторе отладил всю графику,даром не гоняя МК прошивкой.Недостатком было +10 пинов для ks0108.
И вот еще "наковырял" в сети пример адаптации STM32F101CBT6 под эту библиотеку ,только под другой дисплей http://blog.bastelhalde.de/?p=759#comment-1567.Хочу еще попробовать портировать под F4 и st7920 .Библиотека действительно неплохая,одних названий функций целая страница,всякие там прямоугольники с закругленными углами,пару десятков шрифтов,картинки в формате xbm.
Пн ноя 23, 2015 15:43:36
Read data from internal RAM and alter the (AC) by 1
After address set to read (CGRAM,DDRAM,IRAM…..)a DUMMY READ is required.
There is no need to DUMMY READ for the following bytes unless a new address set instruction is issued.
Пн ноя 23, 2015 15:53:19
Пн ноя 23, 2015 17:24:19
Пн ноя 23, 2015 17:42:06
Пн ноя 23, 2015 18:46:06
Вт ноя 24, 2015 08:17:00
Ср ноя 25, 2015 15:27:01
Ср ноя 25, 2015 15:34:04