Дисплей 16х1 от ККМ "Элвес Микро"

svm
Offline
Зарегистрирован: 06.11.2016

vladimir_62 пишет:

Добрый день.

Еще один дисплей от Меттлер Толедо нужен в копилку ? Протокол i2c.

Выкладывайте, может кому и пригодится.

vladimir_62
Offline
Зарегистрирован: 18.01.2019

#include <LPC214x.h>
#include "rtc.h"
#include "stdutils.h"   
#include "systemInit.h" 
#include "uart.h"
#include "type.h"
#include "stdio.h"
#define led  0x00100000

void out_time1(uint8_t *p);
void out_time(uint8_t *p);
void DELAY_us(unsigned int count);
void DELAY_ms(unsigned int count);
void I2C_START(void);
void I2C_STOP( void );
void I2C_WRITE( char data );
void I2C_INIT(void);
void data1(uint8_t *ptr,uint8_t n);

void i2c_clr();
void i2c_clr1();
unsigned char hex2bcd (unsigned char x);
int from_hex(uint16_t h);
int get_line (char* buff,	int len	);
char *ptr2,bb;
uint8_t b1;	
long p1, p2, p3;
uint8_t *ptr;
uint8_t k;
uint16_t res,b,i;
uint16_t s1, s2, cnt;
char Line[127];

BYTE buf[0x40];

__irq void clk (void);
__irq void uart0_ISR(void);
char q;
	long int V;
	char ch;
uint8_t tik;
	rtc_t rtc;

char buf_clr[127]={0x70,0xC8,0xE0,0x00,0};
char buf_clr1[40]={0x70,0xC8,0xE1,0x0A,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
char buf_txt[40]={0};	
char buf_cmd[]={0x70,0xC8,0xE1,0x0A};																
uint8_t num[12]={0xD7,0x06,0xE3,0xA7,0x36,0xB5,0xF5,0x07,0xF7,0xB7,0x08};//.																	
char buf2[]={0x70,0xC8,0xE1,0x0A,
						0x01,0x00,
						0x02,0x00,
						0x04,0x00,
						0x08,0x00,
						0x10,0x00,
						0x20,0x00,
						0x40,0x00,
						0x80,0x00,
						0x00,0x01,
						0x00,0x02,
						0x00,0x04,
						0x00,0x08,
						0x00,0x10,
						0x00,0x20,
						0x00,0x40,
						0x00,0x80,
						0xFF,0xFF,0,0};	
																
uint16_t buf3[40][2]={
						0xD083,48,//0
						0x0003,49,//1
						0x94A1,50,//2
						0x14A3,51,//3
						0x4423,52,//4	
						0x54A2,53,//5
						0xD4A2,54,//6	
						0x1003,55,//7
						0xD4A3,56,//8
						0x54A3,57,//9	
						0xD080,145,//Ñ
						0xD003,143,//Ï
						0xD421,144,//Ð
						0xD083,142,//Î
						0xD000,131,//Ã
						0x5C23,159,//ß
						0x2814,149,//Õ	
						0x1494,135,//Ç
						0xC08B,150,//Ö
						0xD423,128,//À
						0xD4A0,133,//Å
						0x2A54,134,//Æ
						0xC813,136,//È 
						0xD4A2,129,//Á
						0xC4A2,156,//Ü
						0xD4B2,130,//Â ?
						0xC414,138,//Ê
						0x4423,151,//×,4
						0x1240,147,//Ò
						0xC2C3,152,//Ø
						0xC2CB,153,//Ù
						0xE013,140,//M
						0x0813,139,//Ë
						0xC423,141,//Í
						0x0000,' ',//9						
0,0};	
																

	uint8_t buf5[13][2]=
{
							0xD7,48,//0
							0x06,49,//1
							0xE3,50,//2
							0xA7,51,//3
							0x36,52,//4	
							0xB5,53,//5
							0xF5,54,//6	
							0x07,55,//7
							0xF7,56,//8
							0xB7,57,//9
							0xE4,'.',//9
							0x00,' ',//9
	0,0	
};	
int main() 

{

    SystemInit();
	  RTC_Init();	
		UARTInit(115200);
		I2C_INIT();
		rtc.hour = 2; //  10:40:20 am
    rtc.min =  2;
    rtc.sec =  0;
    rtc.date = 21; //1st Jan 2016
    rtc.month = 1;
    rtc.year = 2021;
    rtc.weekDay = 4; // Friday: 5th day of week considering monday as first day.
	  RTC_SetDateTime(&rtc);  //  10:40:20 am, 1st Jan 2016

		
		U0IER=0x41; //interrapt enable 0x01, recive enble  
		IO0DIR |= (1<<20); // 
		q=1;

VICVectAddr2 = (unsigned) uart0_ISR; 
VICIntEnable  =(1 << 6);
VICVectCntl2 = (1 << 5) | 6;

VICVectAddr3 = (unsigned)clk; //Pointer Interrupt Function (ISR)
VICVectCntl3 = (1<<5) | 13; //(bit 5 = 1)->to enable Vectored IRQ slot 1//bit[4:0]) -> this the source int number 
VICIntEnable = (1<<13); // Enable RTC interrupt


tik=0;
i2c_clr();i2c_clr1();
while(1)
{	
while (tik==0){};
RTC_GetDateTime(&rtc);

sprintf(Line,"%02u ",rtc.hour);				
if (q==0)
{sprintf(Line+2,"%1s",".");}	
else
{sprintf(Line+2,"%1s"," ");}	
sprintf(Line+3,"%02u",rtc.min);
sprintf(Line+5,"%3s"," ");
sprintf(Line+8,"%02u",rtc.sec);
out_time((uint8_t*)Line);

sprintf(Line,"%02u ",rtc.date);
sprintf(Line+3,"%02u ",rtc.month);
sprintf(Line+6,"%04u",rtc.year);
out_time1((uint8_t*)Line);
IO0PIN ^= (1<<20);
tik=0;
}}

__irq void uart0_ISR(void)
{

	unsigned char i;
	uint16_t ii;
	VICIntEnable = (0<<13); CCR=0;
	U0IER =0;
	V = U0IIR; // Read current IR value 
	ch = Getchar();
	RTC_GetDateTime(&rtc); 			
	if (ch=='h')
{

				ch = Getchar();
				i =  ch & 0x0F;
				i=i<<4;	
				ch = Getchar();
				i= i |( ch & 0x0F);
				rtc.hour = from_hex(i);	
				ch = Getchar();
				i =  ch & 0x0F;
				i=i<<4;	
				ch = Getchar();
				i= i |( ch & 0x0F);
				rtc.min = from_hex(i);	
				rtc.sec=0;
				RTC_SetDateTime(&rtc); 
}
			else if (ch=='d')
{
	ch = Getchar();
				i =  ch & 0x0F;
				i=i<<4;	
				ch = Getchar();
				i= i |( ch & 0x0F);
				rtc.date = from_hex(i);		
				ch = Getchar() ;
				i =  ch & 0x0F;
				i=i<<4;	
				ch = Getchar();
				i= i |( ch & 0x0F);
				rtc.month = from_hex(i);		
				ch = Getchar() ;
				i =  ch & 0x0F;
				i=i<<4;	
				ch = Getchar();
				i= i |( ch & 0x0F);
				ii=i<<8;
				ch = Getchar() ;
				i =  ch & 0x0F;
				i=i<<4;	
				ch = Getchar();
				i= i |( ch & 0x0F);
				ii=ii | i;
				rtc.year=  from_hex(ii);
				RTC_SetDateTime(&rtc); 
}

VICIntEnable = (1<<13);CCR=1;
U0IER =0x11;
VICVectAddr = 0x0; // End of interrupt execution

}

__irq void clk(void)
{

long int readVal; 
tik=1;
q^=1;	
	readVal = ILR; // Read current IR value 
	ILR=readVal; // Read current IR value 
	VICVectAddr = 0x0; // End of interrupt execution
}

int from_hex(uint16_t h)
{
    int d = 0;
    int power = 1;
    while (h)
    {
        // assert(h % 16 < 10)
        d += (h & 15) * power;
        h >>= 4;
        power *= 10;
    }
    return d;
}

void i2c_clr()
{
int i;
I2C_START();
for (i=0;i<sizeof(buf_clr);i++)
{I2C_WRITE( buf_clr[i]);}
I2C_STOP();	
}
void i2c_clr1()	
{
int i;
I2C_START();
for (i=0;i<sizeof(buf_clr1);i++)
{I2C_WRITE( buf_clr1[i]);}
I2C_STOP();
}

void I2C_INIT(void)
{
	PINSEL0 = PINSEL0 | 0x00000050; 
	I2C0CONSET = 0x40; 
	I2C0SCLL = 0x64; 
	I2C0SCLH = 0x64; 
}

void I2C_START(void)
{
	I2C0CONSET = 0x20; /* Set Start bit for Start condition */
	while ( (I2C0CONSET & 0x08) == 0 ); /* Wait till SI = 1 */
	I2C0CONCLR = 0x28; /* Clear Start bit and SI bit */
}


void I2C_WRITE( char data )
{
	I2C0DAT = data; /* Load data to be written into the data register */
	I2C0CONSET = 0x40; /* Enable I2C */
	while( (I2C0CONSET & 0x08) == 0 ); /* Wait till SI = 1 */
	I2C0CONCLR = 0x08;  /* Clear SI bit */
}

unsigned char I2C_READ_ACK( void )
{
	I2C0CONSET = 0x44; /* Enable I2C with Acknowledge */
	while( (I2C0CONSET & 0x08) == 0 ); /* Wait till SI = 1 */
	I2C0CONCLR = 0x0C; /* Clear SI and Acknowledge bits */
	return I2C0DAT; /* Return received data */
}
unsigned char I2C_READ_NACK( void )
{
	I2C0CONSET = 0x40; /* Enable I2C without Acknowledge */
	while( (I2C0CONSET & 0x08) == 0 ); /* Wait till SI = 1 */
	I2C0CONCLR = 0x08;   /* Clear SI bit */
	return I2C0DAT; /* Return received data */
}
void I2C_MULTIREAD( char* arr , int bytes ) /* For reading multiple bytes at a time */
{
	BYTE i = 0;
	while( ( bytes - 1 ) != 0 )
	{	
		I2C0CONSET = 0x40; /* Enable I2C with Acknowledge */
		while( (I2C0CONSET & 0x08) == 0 ); /* Wait till SI = 1 */
		I2C0CONCLR = 0x0C;  /* Clear SI and Acknowledge bits */
		*( arr + i ) = I2C0DAT ;
		bytes--;
		i++;
	}
	I2C0CONSET = 0x40; /* Enable I2C without Acknowledge */
	while( (I2C0CONSET & 0x08) == 0 ); /* Wait till SI = 1 */
	I2C0CONCLR = 0x08; /* Clear SI bit */
	*( arr + i ) = I2C0DAT ;
}


void I2C_STOP( void )
{
	I2C0CONSET = 0x50; /* Set Stop bit for Stop condition */
}



int get_line (		/* 0:End of stream, 1:A line arrived */
	char* buff,		/* Pointer to the buffer */
	int len			/* Buffer length */
)
{
	int c, i;

	i = 0;
	for (;;) {
		c = Getchar();				/* Get a char from the incoming stream */

		if (!c) return 0;			/* End of stream? */
		if (c == '\r') break;		/* End of line? */
		if (c == '\b' && i) {		/* Back space? */
			i--;
		}
		if (c >= ' ' && i < len - 1) {	/* Visible chars */
			buff[i++] = c;

		}
	}
	buff[i] = 0;	/* Terminate with zero */

	return 1;
}
void out_time(uint8_t *p)
{
int ii;
k=0;
ptr=p;
for(ii=0;ii<10;ii++)
{	
i=0;
do
{	
if 	(buf5[i][1]==*ptr)
{buf_txt[k++]=(buf5[i][0]);}
i++;
}while (i<sizeof(buf5));
ptr++;
}
buf_cmd[2]=0xE0;
buf_cmd[3]=0x00;

I2C_START();
for (i=0;i<4;i++)
{I2C_WRITE( buf_cmd[i]);}

for (i=0;i<10;i++)
{I2C_WRITE( buf_txt[i]);}
I2C_STOP();
}

void out_time1(uint8_t *p)
{
k=0;
ptr=p;	
while(*ptr)
{	
i=0;
do
{	
if 	(buf3[i][1]==(*ptr&0xFF))
{buf_txt[k]=(buf3[i][0]&0xFF00)>>8;k++;
buf_txt[k]=(buf3[i][0]&0xFF);k++;}

i++;
}while (i<40);
ptr++;
}

buf_cmd[2]=0xE1;
buf_cmd[3]=0x0A;

I2C_START();
for (i=0;i<4;i++)
{I2C_WRITE( buf_cmd[i]);}

for (i=0;i<30;i++)
{I2C_WRITE( buf_txt[i]);}
I2C_STOP();

}

Вот такой чудо дисплей от весов Mettler Toledo, коих много было завезено в Россию и сейчас они дорабатывают свой ресурс. Собрано опять таки на дармовом эклз на LPC2146. В коде тикают часы, ну и вся кодировка по сегментам.  

vladimir_62
Offline
Зарегистрирован: 18.01.2019

Привет всем.

Еще один дисплей подключен - st7735 128x128 pix. Опять таки к ЭКЛЗ на LPC 2364 с использованием штатного USB и flash 25fl256.  На борт девайс может "принять" 32 монохромныx и 127 цветных картинок в формате bmp 24 bit/pix. Выводятся быстро. Качество достойное. Вывод в формате 18 bit.

https://drive.google.com/file/d/1xltWBxGg31IQG2nIZJmTK1lfSS4G3IWi/view?

https://drive.google.com/file/d/1eCmahdevyRD1QHTt-Mlyl2QSUChBUW9Y/view?usp=sharing

Кому интересно - обращайтесь.

  

 

Sana956
Offline
Зарегистрирован: 14.12.2021

Не написал ли кто нибудь библиотеки для дисплея с двумя КР1820ВГ1 ?

svm
Offline
Зарегистрирован: 06.11.2016
Sana956
Offline
Зарегистрирован: 14.12.2021

Да, Ваши варианты работают=