Перейти к содержанию

Микроконтроллер управляет дисплеем от телефона


Рекомендуемые сообщения

А почему тема Радио-ДУ встала? Давайте поднимать актуальный проект! :smile:

 

Можно добавлять в копилку Датагора инициализацию на CVAVR ещё одной разновидности дисплея от Siemens S65 - L2F50126 на одноимённом контроллере производства EPSON.

 

Ну вот я его и одолел. Вчера была абракадабра видимо из-за усталости. Вредно в 2 часа ночи инициализировать дисплеи ))) . Сначала собрал разработку немца для этого дисплея в системе WinAVR. Запустилось с полпинка. Целый день пришлось потратить, чтобы портировать программу на CodeVisionAVR. То что определено в стандартных h-файлах WinAVR'a - не определено в аналогичных CodeVisionAVR, а многих в CodeVisionAVR и вовсе нет, и наоборот. Ну а основная масса исправлений легла на замену "непонятных" для CodeVisionAVR операций _BV(x) и ~_BV(x), эквивалентных 1<<x и ~(1<<x) соответственно (хотя лично для меня приятней и привычней более наглядная форма - [имя_регистра].[x] = 0 и [имя_регистра].[x] = 1).

 

Вычищать мусор, который наверняка есть в коде, я не стал. Для этого нужно время, ибо эксперименты - заработает/не заработает. Я не стал включать абсолютно все "инклуды" в главный текст. Перенёс только нужное. Использован микроконтроллер ATMega8-16PU (8K ПЗУ, 512 ОЗУ, 1K EEPROM). Код в конце этого поста.

 

Питание:

Всё питание взято от ИБП работающего компьютера.

Микроконтроллер - +5В (взято от PS/2-порта мыши)

Дисплей:

1.8 и 2.9 Вольт соединены вместе и запитаны от +3.3В (взято от ATX-разъёма)

10.4 Вольт для подсветки LCD запитано через резистор 330 Ом на +12В (взято от ATX-разъёма)

 

Инициализация занимает очень короткое время - думаю менее 0,3 секунды. Измерить точнее не представляется возможным, но "на глаз" время между подачей питания и выводом собственно графики на стекло не воспринимается.

 

главный файл 1.c

/*****************************************************
Project : Digital 5.1 Amplifier for 5.25" Dock of PC
Date    : 23.05.2009
Author  : BACEK mailto:bacek88@mail.ru
Comments: Siemens S65 Display Control for L2F50 Display with Epson Controller

Chip type           : ATmega8
Clock frequency     : 8,000000 MHz
*****************************************************/

#include "lib/inttypes.h" 
#include "mega8.h"
#include "lib/delay.h"
#include "lib/disp.h"
#include "lib/io.h"

//****************************************************  

const   uint16_t pot10[4] ={10,100,1000,10000}; 
       uint16_t textcolor;
       uint16_t backcolor;
              
flash char ascii_tab[96][14]={ // characters massive
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // space (32)
{ 0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00}, //!
{ 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, //"
{ 0x00, 0x00, 0x00, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00}, //#
{ 0x00, 0x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06, 0x86, 0xc6, 0x7c, 0x18, 0x18}, //$
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18, 0x30, 0x66, 0xc6, 0x00, 0x00}, // %
{ 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x76, 0xdc, 0xcc, 0xcc, 0x76, 0x00, 0x00}, // &
{ 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // '
{ 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0c, 0x00, 0x00}, // (
{ 0x00, 0x00, 0x00, 0x30, 0x18, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00}, // )
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00, 0x00, 0x00}, // *
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00}, // +
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00}, // ´
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // -
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00}, // .
{ 0x00, 0x00, 0x00, 0x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00}, // /
{ 0x00, 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xd6, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00}, // 0 (48-32)
{ 0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe, 0x0c, 0x0c, 0x1e, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xfc, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x06, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x0c, 0x78, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xde, 0xde, 0xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, 0x66, 0x66, 0xfc, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0xf8, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x62, 0x66, 0xfe, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x60, 0xf0, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xde, 0xc6, 0x66, 0x3a, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x1e, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0x78, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0xe6, 0x66, 0x6c, 0x6c, 0x78, 0x6c, 0x6c, 0x66, 0xe6, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0xc6, 0xee, 0xfe, 0xd6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xde, 0x7c, 0x0e, 0x00},
{ 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c, 0x66, 0x66, 0xe6, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x60, 0x38, 0x0c, 0xc6, 0xc6, 0x7c, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x5a, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x10, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xd6, 0xfe, 0x6c, 0x6c, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0x7c, 0x38, 0x7c, 0xc6, 0xc6, 0xc6, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x8c, 0x18, 0x30, 0x60, 0xc2, 0xc6, 0xfe, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3c, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c, 0x00, 0x00},
{ 0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff},
{ 0x00, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0x76, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0xe0, 0x60, 0x60, 0x78, 0x6c, 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc6, 0x7c, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x1c, 0x36, 0x32, 0x30, 0x7c, 0x30, 0x30, 0x30, 0x78, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78},
{ 0x00, 0x00, 0x00, 0xe0, 0x60, 0x60, 0x6c, 0x76, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c},
{ 0x00, 0x00, 0x00, 0xe0, 0x60, 0x60, 0x66, 0x6c, 0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0xfe, 0xd6, 0xd6, 0xd6, 0xd6, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0},
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e},
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0x60, 0xf0, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x70, 0x1c, 0xc6, 0x7c, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x10, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x10, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xd6, 0xd6, 0xfe, 0x6c, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x6c, 0x38, 0x38, 0x6c, 0xc6, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78},
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xcc, 0x18, 0x30, 0x66, 0xfe, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x0e, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00},
{ 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00}
};

//****************************************************

void port_init(void) //port initialization
{
 uint8_t tmp;
 
 PORTB &= ~(1<<6);
 DDRB |= (1<<6);

 PORTB |= (1<<3);
 DDRB |= (1<<3);
 
 PORTB &= ~(1<<2);
 DDRB |= (1<<2);
 
 PORTB &= ~(1<<5);
 DDRB |= (1<<5);
 
 PORTB |= (1<<1);

 PORTB |= (1<<7);  // not used from LPH display
 DDRB |= (1<<7);
 
 // setup SPI Interface
 SPCR = (1<<4) | (1<<6) | (1<<0);
 SPSR = 1;  // double speed bit

 tmp=SPSR;
}

//****************************************************

void put_char(uint8_t x, uint8_t y, char c, uint8_t rot) //character situating function
{
 uint8_t h,ch,p,mask,he;

 PORTB &= ~(1<<2);  // select display
 
 lcd_cmd(SD_CSET);
 lcd_dat0(0x08+x);  // start is 8, not 0
 lcd_dat0(0x01);
 lcd_dat0(0x08+x+CHAR_W-1);  // end is 00x8B = 0x83+8
 lcd_dat0(0x01);
 
 lcd_cmd(SD_PSET);
 lcd_dat0(y);
 if (y < DISP_H-CHAR_H)
 {
   he=CHAR_H;
   lcd_dat0(y+CHAR_H-1);
 }
 else
 {
   he=DISP_H-y;
   lcd_dat0(DISP_H-1);
 }

 lcd_cmd(RAMWR);
 
 for (h=0; h<he; h++) // every column of the character
 {        
       ch=ascii_tab[ c-32 ][h];

       mask=0x80;
       for (p=0; p<CHAR_W; p++)  // write the pixels
       {
         if (ch&mask)
         {
           lcd_dat16(textcolor);                
         }
         else
         {
           lcd_dat16(backcolor);
         }
         mask=mask/2;
       }  // for p
 }
 PORTB |= 1<<2;  // deselect display    

}

//****************************************************

void lcd_write(uint8_t dat) //writing to display via SPI interface
{
 SPDR= dat;
 while (!(SPSR & (1<<7)));
}

//****************************************************

void lcd_cmd(uint8_t dat) //sending command to display
{
 PORTB &= ~(1<<7);

 lcd_write(dat);
 lcd_write(0x00);

 PORTB |= 1<<7;
}

//****************************************************

void lcd_dat0(uint8_t dat) //sending 8-bit variable to display
{
 lcd_write(dat);
 lcd_write(0x00);  
}

//****************************************************

void lcd_dat16(uint16_t dat) //sending 16-bit variable to display
{
 lcd_write(dat>>8);
 lcd_write(dat);
}

//****************************************************

void lcd_cspulse(void) //1-clock pulse on CS line of display
{
 PORTB |= (1<<2);
 #asm("nop")
 PORTB &= ~(1<<2);
}

//****************************************************

void lcd_init_c(void) //display initialization
/*
 Init the Siemens S65 Display with EPSON controller L2F50126
 © BACEK, 05/2009
 Based on Christian Kranz Research, 10/2005
*/
{
 uint8_t i;
 static char disctl[9] = {0x4C, 0x01, 0x53, 0x00, 0x02, 0xB4, 0xB0, 0x02, 0x00};
 static char gcp64_0[29] =
                     {0x11,0x27,0x3C,0x4C,0x5D,0x6C,0x78,0x84,0x90,0x99,0xA2,0xAA,0xB2,0xBA,
                      0xC0,0xC7,0xCC,0xD2,0xD7,0xDC,0xE0,0xE4,0xE8,0xED,0xF0,0xF4,0xF7,0xFB,
                      0xFE};
 static char gcp64_1[34] =
                    {0x01,0x03,0x06,0x09,0x0B,0x0E,0x10,0x13,0x15,0x17,0x19,0x1C,0x1E,0x20,
                     0x22,0x24,0x26,0x28,0x2A,0x2C,0x2D,0x2F,0x31,0x33,0x35,0x37,0x39,0x3B,
                     0x3D,0x3F,0x42,0x44,0x47,0x5E};
 static char gcp16[15] =
                     {0x13,0x23,0x2D,0x33,0x38,0x3C,0x40,0x43,0x46,0x48,0x4A,0x4C,0x4E,0x50,0x64};

 // generate clean display reset
 PORTB &= ~(1<<6); // reset display
 PORTB |= (1<<2);  // CS is high during reset release
 PORTB |= (1<<7);  // RS is set to high
 delay_ms(10);
 PORTB |= (1<<6);  // release reset
 delay_ms(35);

 PORTB &= ~(1<<2);  // select display

 lcd_cmd(DATCTL);
 lcd_dat0(0x2A);  // 0x2A=565 mode, 0x0A=666mode, 0x3A=444mode

 lcd_cspulse();
 
 lcd_cmd(DISCTL);
 for (i=0; i<9; i++)
 {
   lcd_dat0(disctl[i]);
 }
 
 lcd_cmd(GCP64);
 for (i=0; i<29; i++)
 {
   lcd_dat0(gcp64_0[i]);
   lcd_dat0(0x00);
 }
 for (i=0; i<34; i++)
 {
   lcd_dat0(gcp64_1[i]);
   lcd_dat0(0x01);
 }

 lcd_cmd(GCP16);
 for (i=0; i<15; i++)
 {
   lcd_dat0(gcp16[i]);
 }

 lcd_cmd(GSSET);
 lcd_dat0(0x00);

 lcd_cmd(OSSEL);
 lcd_dat0(0x00);

 lcd_cmd(SLPOUT);
 
//  _delay_ms(7);

 lcd_cmd(SD_CSET);
 lcd_dat0(0x08);
 lcd_dat0(0x01);
 lcd_dat0(0x8B);
 lcd_dat0(0x01);

 lcd_cmd(SD_PSET);
 lcd_dat0(0x00);
 lcd_dat0(0x8F);


 lcd_cmd(ASCSET);
 lcd_dat0(0x00);
 lcd_dat0(0xAF);
 lcd_dat0(0xAF);
 lcd_dat0(0x03);
 
 lcd_cmd(SCSTART);
 lcd_dat0(0x00);

 PORTB &= ~(1<<7);
 lcd_dat0(DISON);
 

 PORTB |= (1<<2);  // deselect display 
}  

//****************************************************

void fill_screen(uint16_t color) //function for filling a display with some color
{
 uint16_t i;

 PORTB &= ~(1<<2);  // select display
 
 lcd_cmd(SD_CSET);
 lcd_dat0(0x08);  // start is 8, not 0
 lcd_dat0(0x01);
 lcd_dat0(0x8B);  // is 00x8B = 0x83+8
 lcd_dat0(0x01);

 lcd_cmd(SD_PSET);
 lcd_dat0(0x00);
 lcd_dat0(0xAF);
 
 lcd_cmd(RAMWR);

 // start data transmission  
 for (i=0; i<DISP_W*DISP_H; i++)
   lcd_dat16(color);
   
 PORTB |= (1<<2);  // deselect display    
}

//****************************************************
void ubi2dec( uint16_t val,  char *strg, uint8_t nzero);
void ubi2dec( uint16_t val,  char *strg, uint8_t nzero)
/*
 convert unsigned int16 value to a character string
 stringlength has to be 6 character 65536 + the final 0
 
 if nzero==0, no leading zeros
 if nzero==1, with leading zeros  
*/
{
 uint8_t dec,idx=4,odx=0;
 do
 {
   idx--;
   for (dec=0; val>=pot10[idx]; val-=pot10[idx])
   {
     dec++;
   }
   nzero+=dec;
   if (nzero) strg[odx++]='0'+dec;
 } while(idx);
 strg[odx++]='0'+val;
 strg[odx]=0;
}

//****************************************************
void print_str(uint8_t x, uint8_t y, char *txt); //placing a string on a display
void print_str(uint8_t x, uint8_t y, char *txt)
{
 uint8_t i=0;
 while (txt[i]!=0)
 {
   put_char(x+i*CHAR_W,y,txt[i],1);
   i++;
 }
}
//****************************************************
void main(void){
//****************************************************
 uint8_t       i;
 uint16_t      cnt;
 char          nr[7];
//**************************************************** 
 char txt[] = " raJIaKTuKa\0";
 port_init();
 //-------------------------------
 lcd_init_c();
 backcolor = 0xFFFF;
 textcolor = 0x0000;
 fill_screen(0x0780);
 //-------------------------------
 cnt=0;
 while (1)   
 {
   ubi2dec(cnt,nr,1);
   print_str(0       ,(cnt*CHAR_H) % (12*14),nr);
   print_str(5*CHAR_W,(cnt*CHAR_H) % (12*14),txt);
 //-------------------------------
   textcolor=cnt;
 //-------------------------------
   cnt++;
  delay_ms(100);
 }	  
}

 

"инклуд" disp.h

/* ***********************************************************************
**
**  Copyright © 2005  Christian Kranz
**
**  Siemens S65 Display Control
**  Edited by BACEK, 05/2009
*********************************************************************** */
// disp.h
#ifndef _DISP_H
#define _DISP_H

#define F_CPU 16000000

#include "io.h"
#include "delay.h"
#include "inttypes.h"

#define DISP_W 132
#define DISP_H 176
#define CHAR_H 14
#define CHAR_W 8
#define TEXT_COL 16
#define TEXT_ROW 12

#define LCD_CS	   PB2 //edited for own case!
#define LCD_RESET  PB6
#define LCD_RS	   PB7
#define LCD_MOSI   PB3
#define LCD_MISO   PB1
#define LCD_SCK    PB5 

#define DATCTL 0xBC         // Data Control (data handling in RAM)
#define DISCTL 0xCA         // Display Control
#define GCP64 0xCB          // pulse set for 64 gray scale
#define GCP16 0xCC          // pulse set for 16 gray scale
#define OSSEL 0xD0          // Oscillator select
#define GSSET 0xCD          // set for gray scales
#define ASCSET 0xAA         // aerea scroll setting
#define SCSTART 0xAB        // scroll start setting
#define DISON 0xAF          // Display ON (no parameter)
#define DISOFF 0xAE         // Display OFF (no parameter)
#define DISINV 0xA7         // Display Invert (no parameter)
#define DISNOR 0xA6         // Display Normal (no parameter)
#define SLPIN  0x95         // Display Sleep (no parameter)
#define SLPOUT 0x94         // Display out of sleep (no parameter)
#define RAMWR 0x5C          // Display Memory write
#define PTLIN 0xA8          // partial screen write

#define SD_CSET 0x15        // column address setting
#define SD_PSET 0x75        // page address setting





extern uint16_t textcolor;    // color of text
extern uint16_t backcolor;    // color of background



/////////////////////////////// function prototypes ////////////////////////

void port_init(void);

void lcd_write(uint8_t);
void lcd_cmd(uint8_t dat);
void lcd_dat0(uint8_t dat);
void lcd_dat16(uint16_t dat);

void lcd_cspulse(void);

void lcd_init_c(void);
void fill_screen(uint16_t color);
void put_char(uint8_t x, uint8_t y, char c, uint8_t rot);

#endif
// end of file disp.h

 

вот такого файлика ещё нет в CVAVR: inttypes.h. с ним можно записывать разновидности переменных типа int в видах типа uint16_t (unsigned int 16 bit и t ещё что-то........ =) ). от него можно отказаться, заменив все вхождения таких сокращений на общепринятые

/*
  Copyright © 1999 Marek Michalkiewicz <marekm@linux.org.pl>

  Permission to use, copy, modify, and distribute this software and
  its documentation for any purpose and without fee is hereby granted,
  without any conditions or restrictions.  This software is provided
  "as is" without express or implied warranty.
*/

#ifndef _INTTYPES_H_
#define _INTTYPES_H_

/* Use [u]intN_t if you need exactly N bits.
  XXX - doesn't handle the -mint8 option.  */

typedef signed char int8_t;
typedef unsigned char uint8_t;

typedef int int16_t;
typedef unsigned int uint16_t;

typedef long int32_t;
typedef unsigned long uint32_t;  

typedef unsigned long int int64_t;
typedef unsigned long int uint64_t;

//typedef long long int64_t;
//typedef unsigned long long uint64_t;

typedef int16_t intptr_t;
typedef uint16_t uintptr_t;

#endif

 

ну вот собсно и всё. вот ссылка на видео и фотка: _https://www.rapidshare.ru/1049747

 

post-1862-1243095388_thumb.jpg

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...
  • Ответов 43
  • Создана
  • Последний ответ

Топ авторов темы

Достался мне тут по наследству убитый Siemens A60. Извлёк я от туда дисплей. На нем написано "LPH8731-3C G4182191С V3". Поиски даташита не дали результата (причем не у меня одного, даташита просто нет). Я тут подумал а что если распиновка совпадает с S65? Контактов на нем тоже 10. А может и инициализация совпадает?

Ссылка на комментарий
Поделиться на другие сайты

Вопрос в том что можно ли всё что там написано применить для дисплея LPH8731-3C? Т.е. и подключение и инициализация?

 

P.S. Может быть разница сводится к тому каким образом задается цвет? (16 бит на пиксел у S65 (2^16=65536), а у А60 12 бит на пиксел (2^12=4096))

 

Фото: _https://www.download.su/photo/fafa8ba42a

Ссылка на комментарий
Поделиться на другие сайты

По поводу автосигнализации есть некоторые мысли,в части электрооборудования автомобилей могу подсказать уровни напряжений,как организовать входы-выходы и т.п. Если сделать разработку и отдать в Китай на изготовление(у нас можно и не пытаться) можно иметь успех,существующие системы на 100% меня не удовлетворяют,хочется чего то продуманного,на данный момент нравится система STARLINE B9 есть еще С9,но она по цене не оправдано дорогая,в общем если тема еще в силе с радостью поделюсь мыслями...

Ссылка на комментарий
Поделиться на другие сайты

ну вот у нас собрался отличный коллектив добровольцев, автоинженер, концептор, программист, схемотехник =) Жалко Спирит редко бывает...

mr_smit на 93% думаю нельзя. ну максимум распиновка может совпасть... ибо даже у диспов сименс эс65 три разные системы команд для трёх разновидностей... но я желаю тебе удачи!.. ;-) попробовать не помешает

совет: найти у телефонных барыг старый симак ... из списка который есть по ссылке из моего предыдущего поста

Ссылка на комментарий
Поделиться на другие сайты

  • 4 недели спустя...
Вот статья: Микроконтроллер управляет дисплеем от телефона

Требуются соратники!!!

 

Сейчас занимаюсь разработкой ДУ усилителем по радиоканалу. На самом усилителе не будет никаких органов управления. Вся информация будет выводится на таком дисплее, встроенном в пульт ДУ.

 

Еще есть задумка сделать сигнализацию с обратной связью и таким же дисплеем. На него будут выводиться всевозможные температуры, напряжение АКБ, запас топлива, состояние дверей и т.п. Управление автозапуском, замками и приборами. Думаю даже интегрировать туда MP3-плеер

 

Единственное, боюсь не осилить это в одиночку...

Поэтому ищу единомышленников. Кто желает поучаствовать в развитии этих проектов - пишите !

 

 

автор: Spirit

 

1230235582_dsc01516.jpg

 

я вот не пойму как контролер связан с дисплеем. команды есть а схемы распайки нет.

Ссылка на комментарий
Поделиться на другие сайты

я конечно прошу прощения, но зачем вам барыги и их старые Сименсы, когда за практически даром свободно покупаются новые дисплеи от этих Сименсов? Нет, я не настаиваю, может чего не знаю...

Ссылка на комментарий
Поделиться на другие сайты

я конечно прошу прощения, но зачем вам барыги и их старые Сименсы, когда за практически даром свободно покупаются новые дисплеи от этих Сименсов? Нет, я не настаиваю, может чего не знаю...

ну это как найдешь бывает такую цену заломят за новый что легче старый купить.

Ссылка на комментарий
Поделиться на другие сайты

Понимаю что зря, но все же, дисплей от 65(70) серии сименс очень не качественный сам по себе, быстро теряет яркость подсветки, плохо ведет себя на солнце :smile: Выбора особого нету... Так что удачи:smile:

P.S. дойдете до MP3 плеера помогу :smile:

Изменено пользователем razoom
Ссылка на комментарий
Поделиться на другие сайты

  • 6 месяцев спустя...

Приветствую всех! я сдесь новичек и очень хочется освоить пики и авэрки. у меня скопилось некоторое количество жк индикаторов 640Х480, 320Х240, и еще интересный экземпляр от епсона-принтера цветной 2,5 дюйма. даташитов на них пока не нашел. могу выложить микрухи на чем они сделаны, в смысле их контроллеры. хочу с ними что-нибудь намутить. хочется собрать осциллограф с жк и хорошими функциями и дискретизацией. бывает нужен по работе! я кондиционерщик и могу помочь по холодильной теме кому надо! :smile:

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...