6 Digit 7 Segment 2.4 Inch HT1621 LCD Display Module

buongiorno

sto cercando di utilizzare questo display con questo codice

#define CS	 13  //Pin 13 as chip selection output
#define WR	 12  //Pin 12 as read clock	output
#define DATA 7	//Pin 7 as Serial data output

#define CS1    digitalWrite(CS, HIGH) 
#define CS0    digitalWrite(CS, LOW)
#define WR1    digitalWrite(WR, HIGH) 
#define WR0    digitalWrite(WR, LOW)
#define DATA1  digitalWrite(DATA, HIGH) 
#define DATA0  digitalWrite(DATA, LOW)


#define sbi(x, y)  (x |= (1 << y))   
#define cbi(x, y)  (x &= ~(1 <<y ))  
#define uchar   unsigned char 
#define uint   unsigned int 

//定义HT1621的命令 
#define  ComMode    0x52  //4COM,1/3bias  1000    010 1001  0  
#define  RCosc      0x30  //1000 0011 0000 
#define  LCD_on     0x06  /1000     0000 0 11 0 
#define  LCD_off    0x04  
#define  Sys_en     0x02  //1000   0000 0010 
#define  CTRl_cmd   0x80  
#define  Data_cmd   0xa0  


/*0,1,2,3,4,5,6,7,8,9,A,b,C,c,d,E,F,H,h,L,n,N,o,P,r,t,U,-, ,*/

const char num[]={0x7D,0x60,0x3E,0x7A,0x63,0x5B,0x5F,0x70,0x7F,0x7B,0x77,0x4F,0x1D,0x0E,0x6E,0x1F,0x17,0x67,0x47,0x0D,0x46,0x75,0x37,0x06,0x0F,0x6D,0x02,0x00,};
                 //0      1      2      3        4      5      6       7       8       9
char dispnum[6]={0x00,0x00,0x00,0x00,0x00,0x00};



void SendBit_1621(uchar sdata,uchar cnt)
{ 
	//data cnt HT1621
	uchar i; 
	for(i=0;i<cnt;i++) 
	{ 
		WR0;
		if(sdata&0x80) DATA1; 
		else DATA0;
		WR1;
		sdata<<=1; 
	} 
}

void SendCmd_1621(uchar command) 
{ 
	CS0; 
	SendBit_1621(0x80,4);  
	SendBit_1621(command,8); 
	CS1;                     
}

void Write_1621(uchar addr,uchar sdata)
{ 
	addr<<=2; 
	CS0; 
	SendBit_1621(0xa0,3);     
	SendBit_1621(addr,6);     
	SendBit_1621(sdata,8);   
	CS1; 
} 

void HT1621_all_off(uchar num) 
{
	uchar i; 
	uchar addr=0; 
	for(i=0;i<num;i++) 
	{ 
		Write_1621(addr,0x00); 
		addr+=2; 
	} 
}

void HT1621_all_on(uchar num)
{
	uchar i; 
	uchar addr=0; 
	for(i=0;i<num;i++) 
	{
		Write_1621(addr,0xff); 
		addr+=2; 
	} 
}

void Init_1621(void)
{
	SendCmd_1621(Sys_en);
	SendCmd_1621(RCosc);    
	SendCmd_1621(ComMode);  
	SendCmd_1621(LCD_on);
}    

void displaydata(int p)
{
	uchar i=0;
	switch(p)
	{
		case 1:
		sbi(dispnum[0],7);
		break;
		case 2:
		sbi(dispnum[1],7);
		break;
		case 3:
		sbi(dispnum[2],7);
		break;
		default:break;
	}
	for(i=0;i<=5;i++) 
	{
		Write_1621(i*2,dispnum[i]);
	}
}



void setup() {
  pinMode(CS, OUTPUT); // 
  pinMode(WR, OUTPUT); // 
  pinMode(DATA, OUTPUT); //
  CS1;
  DATA1;
  WR1;
  delay(50);
  Init_1621();
  HT1621_all_on(16); //1621
  delay(1000);
  HT1621_all_off(16); //1621  
  delay(1000);

  displaydata(1);//light on the first decimal point starting from the right side
  dispnum[5]=num[5];
  dispnum[4]=num[4];
  dispnum[3]=num[3];
  dispnum[2]=num[2];
  dispnum[1]=num[1];
  dispnum[0]=num[0];
  
  sbi(dispnum[5],7);   
  //cbi(dispnum[5],7); 
  sbi(dispnum[4],7);  
  //cbi(dispnum[4],7); 
  sbi(dispnum[3],7);   
  //cbi(dispnum[3],7); 
  
  
  
  //Write_1621(0,num[0]); 
  //Write_1621(2,num[28]);
  //Write_1621(4,num[2]); 
  //Write_1621(6,num[28]);	
  //Write_1621(8,num[4]);  
  //Write_1621(10,num[5]);

}

void loop() {

 // you can place your main code here to run repeatedly
 
}

con la funzione Write_1621(,num[]) riesco a visualizzare una cifra in una determinata posizione

vorrei visualizzare una variabile long e credo che la funzione da utilizzare sia displaydata(1); ma non capisco dove passare come argomento la mia variabile..

idee?

grazie

penso che vada spostata in software....

miky_police:
penso che vada spostata in software....

Si ... spostato :slight_smile:

Guglielmo

ah, non mi ritrovavo piu . :slight_smile: :slight_smile: :slight_smile:

riesco a visualizzare le distanze in cm (a due e tre cifre) con queste funzioni:

void displaydatatop(long int t,int p,char s1,char s2)
{
  uchar i;
  dispnum[4]=num[t/10000];
  dispnum[3]=num[(t/1000)%10];
  dispnum[2]=num[(t/100)%10];
  dispnum[1]=num[(t/10)%10];
  dispnum[0]=num[t%10];
  switch(p)
  {
  case 1:
    sbi(dispnum[0], 7);
    break;
  case 2:
    sbi(dispnum[1], 7);
    break;
  case 3:
    sbi(dispnum[2], 7);
    break;
  default:
    break;
  }

  if(s1==1)  sbi(dispnum[3], 7);
  if(s2==1)  sbi(dispnum[4], 7);

  //for(i=0;i<5;i++)
  for(i=0;i<3;i++) 
  {
    Write_1621(i*2,dispnum[i]);
  }
} 

   void displaydatatop100(long int t,int p,char s1,char s2)
{
  uchar i;
  dispnum[4]=num[t/10000];
  dispnum[3]=num[(t/1000)%10];
  dispnum[2]=num[(t/100)%10];
  dispnum[1]=num[(t/10)%10];
  dispnum[0]=num[t%10];
  switch(p)
  {
  case 1:
    sbi(dispnum[0], 7);
    break;
  case 2:
    sbi(dispnum[1], 7);
    break;
  case 3:
    sbi(dispnum[2], 7);
    break;
  default:
    break;
  }

  if(s1==1)  sbi(dispnum[3], 7);
  if(s2==1)  sbi(dispnum[4], 7);

  //for(i=0;i<5;i++)
  for(i=0;i<2;i++) 
  {
    Write_1621(i*2,dispnum[i]);
  }
}

ma non so come fare per visualizzare le distanze in piedi,poliici.......

idee??

Devi scriverti delle piccole funzioncine di conversione ricordando semplicemente che:

a) 1 pollice corrisponde a 2.54 cm ed 1 cm corrisponde a 0,393701 pollici.

b) 1 piede corrisponde a 30.48 cm ed 1 cm corrisponde a 0,0328084 piedi.

Con un po' di divisioni o moltiplicazioni hai risolto.

Guglielmo

grazie Guglielmo ma come al solito credo di essermi mal espresso :slight_smile:

ho gia le variabili "feet", "inches" e "cm"

con displaydatatop e displaydatatop100 riesco a visualizzare le tre cifre massime della misura in cm tutto a destra del display

ma quando provo a visualizzare la misura in imperiale, con displaydatabottom(feet,0,0,0) e displaydatatop100(inches,2,0,1), mi esce fuori una cosa del genere "9 .11". non riesco a spostare la cifra dei feet un po verso il punto e le cifre dei pollici (o il contrario)

graziee