Autor Tema: Display TM1637  (Leído 13875 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado cvargcal

  • PIC16
  • ***
  • Mensajes: 166
Display TM1637
« en: 21 de Octubre de 2017, 21:00:42 »
Saludos, alguien tiene una libreria para este display?
la hay en arduino, pero no logro convertirla a ccs

Encontre este ejemplo http://puntoflotante.net/TM1637-RELOJ-DE-TIEMPO-REAL-TEMPORIZADOR.htm
 la hacen funcionar en un pic:
Código: C
  1. ///////////////////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. //   Archivo que contiene las funciones requeridas para el manejo del display TM1637 en el sistema
  4. //   BOLT-PIC18F2550
  5. //
  6. //      www.puntoflotante.net
  7. //
  8. //   Funciones disponibles:
  9. //
  10. //      void InitTM1637(unsigned char BRIGHT);
  11. //      void writeByte(unsigned char oneByte);
  12. //      void writeRawDigit(unsigned char segment, unsigned char nDigit);
  13. //      void displayValues(unsigned char segment0, unsigned char segment1,
  14. //                     unsigned char segment2, unsigned char segment3);
  15. //
  16. //      
  17. //      Programador: Moises Melendez, sesowm@hotmail.com
  18. //
  19. //
  20. //      void InitTM1637(unsigned char BRIGHT);
  21. //      
  22. //         Inicializa y ajusta el brillo del display TM1637 desde un mínimo a un máximo (0-7)
  23. //         Esta función debe llamarse antes que las siguientes, generalmente como parte de la
  24. //         configuración inical.      
  25. //
  26. //      void writeByte(unsigned char oneByte);
  27. //
  28. //         Envía al display TM1637 un byte que puede ser un comando o un dato
  29. //
  30. //      void writeRawDigit(unsigned char segment, unsigned char nDigit);
  31. //
  32. //         Escribe el dato "segment" en 7 segmentos de acuerdo al siguiente orden:
  33. //
  34. //                _a_
  35. //               |   |          MSB      LSB
  36. //                  f|_g_|b            pgfedcba
  37. //               |   |
  38. //                 e|   |c
  39. //                 -d-   p
  40. //
  41. //      El dato es escrito en la posicion nDigit que corresponde al número de segmento
  42. //      en el display TM1637, solo para el dígito 1 existe la opción de encender el segmento p:
  43. //
  44. //          ______________________                    
  45. //           |  _    _     _    _   |                  
  46. //         | | |  | | º | |  | |  |- CLK
  47. //        |  -    -     -    -   |- DIO
  48. //         | |_|  |_| º |_|  |_|  |- VCC
  49. //         |----------------------|- GND
  50. //         |______________________|                            
  51. //                                                  
  52. //               0    1     2    3    <-- segmentos
  53. //
  54. //      El símbolo " : " entre los segmentos 1 y 2 corresponde al bit p del segmento 1
  55. //
  56. //        
  57. //      void displayValues(unsigned char segment0, unsigned char segment1,
  58. //                     unsigned char segment2, unsigned char segment3);
  59. //        
  60. //         Esta función escribe todos los segmentos en el orden en que se indican en los argumentos
  61. //         de la función, corresponden a datos en 7 segmentos.
  62. //
  63. //
  64. //      NOTA IMPORTANTE LOS SWITCHES SW3 Y SW4 DEBEN ESTAR EN LA POSICÓN OFF
  65. //
  66. ///////////////////////////////////////////////////////////////////////////////////////////////////
  67.  
  68. #define CLK_LOW TRISCbits.TRISC0 = 0; PORTCbits.RC0=0
  69. #define DIO_LOW TRISCbits.TRISC1 = 0; PORTCbits.RC1=0
  70. #define CLK_HIGH TRISCbits.TRISC0 = 1
  71. #define DIO_HIGH TRISCbits.TRISC1 = 1
  72.  
  73. #define LOW_BRIGHT 0X00
  74. #define MID_BRIGHT 0X02
  75. #define MAX_BRIGHT 0X07
  76.  
  77. void InitTM1637(unsigned char BRIGHT);
  78. void Delay_us(unsigned int useconds);
  79. void start(void);
  80. void ask(void);
  81. void stop(void);
  82. void writeByte(unsigned char oneByte);
  83. void writeRawDigit(unsigned char segment, unsigned char nDigit);
  84. void displayValues(unsigned char segment0, unsigned char segment1, unsigned char segment2, unsigned char segment3);
  85.  
  86. //
  87. //   Inicializa y ajusta el brillo del display TM1637
  88. void InitTM1637(unsigned char BRIGHT)
  89. {
  90.    start();
  91.    writeByte(0x88 | BRIGHT);
  92.    ask();
  93.    stop();
  94. }
  95.  
  96. //
  97. //   Función de retardos ajustada a los requerimientos de la comunicación con el display TM1637
  98. void Delay_us(unsigned int useconds)
  99. {
  100.    unsigned int i;
  101.    for(i=0; i < useconds; i++)
  102.       //Delay10TCYx(2);
  103.       Delay_us(2);
  104. }
  105.  
  106. //
  107. //   Función que inicia la comunicación en el display TM1637
  108. //
  109. void start(void)
  110. {
  111.    CLK_HIGH;
  112.    DIO_HIGH;
  113.    Delay_us(2);
  114.    DIO_LOW;
  115. }
  116.  
  117. //
  118. //   Función que permite saber si el dato o comando enviado al display TM1637 ha sido recibido y
  119. //   procesado correctamente
  120. //
  121. void ask(void)
  122. {
  123.    TRISCbits.TRISC1 = 1;
  124.    CLK_LOW;
  125.    Delay_us(5);
  126.    while(PORTCbits.RC1);
  127.    CLK_HIGH;
  128.    Delay_us(2);
  129.    TRISCbits.TRISC1 = 0;
  130.    CLK_LOW;
  131. }
  132.  
  133. //
  134. //   Secuencia de paro, necesaria para el correcto funcionamiento del protocolo de comunicación
  135. //   con el display TM1637
  136. //
  137. void stop(void)
  138. {
  139.    CLK_LOW;
  140.    Delay_us(2);
  141.    DIO_LOW;
  142.    Delay_us(2);
  143.    CLK_HIGH;
  144.    Delay_us(2);
  145.    DIO_HIGH;
  146. }
  147.  
  148. //
  149. //   Envia por el pin DIO los bits de un byte, envia serialmente los datos
  150. //
  151. void writeByte(unsigned char oneByte)
  152. {
  153.    unsigned char i;
  154.    for(i=0; i<8; i++)
  155.    {
  156.       CLK_LOW;
  157.       if(oneByte & 0x01)
  158.          DIO_HIGH;
  159.       else
  160.          DIO_LOW;
  161.       Delay_us(3);
  162.       oneByte = oneByte >> 1;
  163.       CLK_HIGH;
  164.       Delay_us(3);
  165.    }
  166. }
  167.  
  168. //
  169. //   Esta función envía al módulo TM1637 un byte con la representación en 7 segmentos en la
  170. //   posción nDigit
  171. //
  172. void writeRawDigit(unsigned char segment, unsigned char nDigit)
  173. {
  174.    start();
  175.    writeByte(0x44);
  176.    ask();
  177.    stop();
  178.    start();
  179.    writeByte(0xC0 | (nDigit & 0x07));
  180.    ask();
  181.    writeByte(segment);
  182.    ask();
  183.    stop();
  184. }
  185.  
  186. //
  187. //   Envía 4 caracteres al módulo TM1637 desde la posición 0 hasta la 4 de los segmentos
  188. //
  189. void displayValues(unsigned char segment0, unsigned char segment1, unsigned char segment2, unsigned char segment3)
  190. {
  191.    start();
  192.    writeByte(0x40);
  193.    ask();
  194.    stop();
  195.    start();
  196.    writeByte(0xC0);
  197.    ask();
  198.    writeByte(segment0);
  199.    ask();
  200.    writeByte(segment1);
  201.    ask();
  202.    writeByte(segment2);
  203.    ask();
  204.    writeByte(segment3);
  205.    ask();
  206.    stop();
  207. }

El codigo esta entendible, pero no logro adecuar esto
Código: C
  1. #define CLK_LOW TRISCbits.TRISC0 = 0; PORTCbits.RC0=0
  2. #define DIO_LOW TRISCbits.TRISC1 = 0; PORTCbits.RC1=0
  3. #define CLK_HIGH TRISCbits.TRISC0 = 1
  4. #define DIO_HIGH TRISCbits.TRISC1 = 1
creo que van cambiando el tris, porque ese pin varia de entrada a salida?

Desconectado cvargcal

  • PIC16
  • ***
  • Mensajes: 166
Re:Display TM1637
« Respuesta #1 en: 22 de Octubre de 2017, 15:11:40 »
.....

Ya lo logre, les comparto las librerías que encontré y adapte al ccs y le agregue otras funciones de otras librerías, al final quedo perfecto y funciona genial.  :) :)

tm.h
Código: C
  1. //!Reference Program
  2. //!/ *
  3. //!* Copyright: Shenzhen Tian Microelectronics
  4. //!* File name: TM1637
  5. //!* Current Version: 1.0
  6. //!* SCM Model: AT89S52
  7. //!* Development Environment: Keil uVision3
  8. //!* Crystal earthquake frequency: 11.0592M
  9. //!* Program features: the TM1637 all filled with all the display data register
  10. //!   address 0xff, and open the display, and then read the key value.
  11. //!* /
  12. //!* Cambio: Carlos Andrés Vargas C. - carlos_vargas_c@outlook.com
  13. //!*         - Adaptacion a CCS
  14. //!*         - writeRawDigit(); displayValues();
  15.  
  16. //!# include <reg52.h>
  17. //!# include <intrins.h>
  18. //!sbit clk = P1 ^ 2;
  19. //!sbit dio = P1 ^ 1;
  20.  
  21. // CCS
  22. #BIT clk = 0xF81.0                       // Pin mapped to PORTB.0
  23. #BIT dio = 0xF81.1                       // Pin mapped to PORTB.1        
  24.  
  25.                         /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/ /*8*/ /*9*/
  26. unsigned char digits[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
  27. #define bright MAX_BRIGHT      //
  28. #define LOW_BRIGHT 0X00
  29. #define MID_BRIGHT 0X02
  30. #define MAX_BRIGHT 0X07
  31.  
  32. /// ================================================
  33. //!void Delay_us (unsigned int i) // n us delay
  34. //!{
  35. //!for (; i> 0; i--)
  36. //!_nop_ ();
  37. //!}
  38. ///  ====== START ========================================
  39. void I2CStart (void)
  40. {
  41. clk = 1;
  42. dio = 1;
  43. Delay_us (2);
  44. dio = 0;
  45. }
  46. ///  ====== ASK ==========================================
  47. void I2Cask (void)
  48. {
  49. clk = 0; Delay_us (5); // After the falling edge of the eighth clock delay 5us,ACK signals the beginning of judgment
  50. while (dio);
  51. clk = 1; Delay_us (2);
  52. clk = 0;
  53. }
  54. ///  ====== STOP =========================================
  55. void I2CStop (void)
  56. {
  57. clk = 0; Delay_us (2);
  58. dio = 0; Delay_us (2);
  59. clk = 1; Delay_us (2);
  60. dio = 1;
  61. }
  62. ///  ====== WRITE A BYTE =================================
  63. void I2CWrByte (unsigned char oneByte)
  64. {
  65. unsigned char i;
  66. for (i=0;i<8;i++){
  67. Clk = 0;
  68. if (oneByte & 0x01) // low front
  69. {dio = 1;}
  70. else {dio = 0;}
  71.  Delay_us (3);
  72.  oneByte = oneByte >> 1;
  73.  clk = 1;  Delay_us (3);
  74. }
  75. }
  76. ///  ====== SCAN KEY (OPTIONAL KEYBOARD) =================
  77. unsigned char ScanKey (void) // read buttons
  78. {
  79. unsigned char rekey, rkey, i;
  80. I2CStart ();
  81. I2CWrByte (0x42); // read command buttons
  82. I2Cask ();
  83. dio = 1;          // read keys before data lines pulled
  84. for (i=0;i<8;i++)  // start reading from the low
  85. {
  86. Clk = 0;
  87. rekey = rekey >> 1;
  88. Delay_us(30);
  89. clk=1;
  90. if(dio){
  91. rekey=rekey|0x80;
  92. }
  93. else {
  94. rekey=rekey|0x00;
  95. }
  96. Delay_us(30);
  97. }
  98. I2Cask();
  99. I2CStop();
  100. return (rekey);
  101. }
  102. void SmgDisplay(void)        // Write display register
  103. {
  104. unsigned char i;
  105. I2CStart();
  106. I2CWrByte(0x40); //40H address is automatically incremented by 1 mode,44H fixed address mode
  107. I2Cask();
  108. I2CStop();
  109. I2CStart();
  110. I2CWrByte(0xc0); // Set the first address
  111. I2Cask();
  112. for(i=0;i<6;i++){ // Addresses from Canada, do not always write address
  113.    I2CWrByte(0xff); // Send data
  114.    I2Cask();
  115.  }
  116. I2CStop();
  117. I2CStart();
  118. I2CWrByte(0x8f);  // Open display, maximum brightness
  119. I2Cask();
  120. I2CStop();
  121. }
  122. ///  ==============================================
  123. void init_TM1637() // Initialization routine
  124. {
  125.  // Initialization slightly
  126. //!   I2CStart();
  127. //!   I2CWrByte(0x88 | BRIGHT);
  128. //!   I2Cask();
  129. //!   I2CStop();
  130. }
  131. /// ================================================
  132. ///  Esta función envía al módulo TM1637 un byte con la representación en 7 segmentos en la  posción nDigit
  133. void writeRawDigit(unsigned char segment, unsigned char nDigit)
  134. {
  135.    I2CStart();
  136.    I2CWrByte(0x44);
  137.    I2Cask();
  138.    I2CStop();
  139.    I2CStart();
  140.    I2CWrByte(0xC0 | (nDigit & 0x07));
  141.    I2Cask();
  142.    I2CWrByte(segment);
  143.    I2Cask();
  144.    I2CStop();
  145. }
  146. /// ================================================
  147. //  Esta función envía 4 caracteres al módulo TM1637 desde la posición 0 hasta la 4 de los segmentos
  148. void displayValues(unsigned char segment0, unsigned char segment1, unsigned char segment2,unsigned char segment3)
  149. {
  150.    I2CStart();
  151.    I2CWrByte(0x40);
  152.    I2Cask();
  153.    I2CStop();
  154.    I2CStart();
  155.    I2CWrByte(0xC0);
  156.    I2Cask();
  157.    I2CWrByte(segment0);   I2Cask();
  158.    I2CWrByte(segment1);   I2Cask();
  159.    I2CWrByte(segment2);   I2Cask();
  160.    I2CWrByte(segment3);   I2Cask();
  161.    I2CStop();
  162. }

main.c
Ejemplo, contador 0 a 9999
Código: C
  1. #include <18F252.h>
  2. #fuses HS,NOWDT,NOPROTECT,NOLVP
  3. #use delay(clock=10000000)
  4. #include <string.h>                                                                    // Librerias para manejo de strings
  5. #include <stdlib.h>
  6. #include <tm.h>
  7. #use fast_io(B)
  8.  
  9.  
  10. void main(void){
  11.   set_tris_b(0b00000000);  
  12.   enable_interrupts(GLOBAL);
  13.  
  14.  
  15.  SmgDisplay();                        // Write register and open display
  16.  
  17.  int i;
  18.  static unsigned long int counter=0;
  19.  delay_ms(100);
  20.  
  21. // Imprime el numero  |1|2|3|4|, hace uso de la función por writeRawDigit, digito en cada segmento
  22.  
  23.  writeRawDigit(digits[1],0);
  24.  writeRawDigit(digits[2],1);
  25.  writeRawDigit(digits[3],2);
  26.  writeRawDigit(digits[4],3);
  27.  
  28.   delay_ms(1000);
  29. // Imprime el numero  |2|4|5|6|, hace uso de la función por  displayValues, en los 4 segmentos
  30.  displayValues(digits[2], digits[4] | 0x80, digits[5], digits[6]);
  31.  delay_ms(1000);
  32.  displayValues(digits[0], digits[0] | 0x80, digits[0], digits[0]);
  33.  
  34.   while(true){
  35. // Contador de 0 a 9999.
  36.  
  37.    output_toggle(PIN_B7); delay_ms(30);
  38.    counter++;
  39.    if(counter>9999) counter=0;
  40.    displayValues(digits[(counter/1000)%10], digits[(counter/100)%10], digits[(counter/10)%10], digits[counter%10]);
  41.  
  42. }
  43. }

Doy gracias a los que crearon y publicaron las librerías iniciales! 
si alguien tiene algún cambio, compartalo porfavor. :-/ :-/
« Última modificación: 22 de Octubre de 2017, 15:17:35 por cvargcal »

Desconectado arielmdq

  • PIC16
  • ***
  • Mensajes: 166
Re:Display TM1637
« Respuesta #2 en: 15 de Febrero de 2018, 17:22:30 »
Hola que tal, antes que nada quería agradecerte por compartir esta información y comentarte que estoy intentando hacer un instrumento de temperatura con un DS18B20 un display TM1637 y un pic 16f684 por que es el que tengo en este momento.
Pero para empezar estoy usando este ejemplo de contador que pusiste para ver que compile (que si lo hace) y hacer funcionar solo el display, todavía no arme el hardware  para hacer las pruebas, por que tengo una duda y es la conexión de los pines "ckl" y "dio", en tu librería dice que se conectan al los pines 0 y 1 del puerto B, pero en mi caso no tengo puerto B, así que quería saber si se pueden definir estos pines en el main.c,  o si hay que modificar la librería. Desde ya muchas gracias por cualquier ayudita
                                                                                   Saludos!!!
El tiempo es una ilusión ,solo existe el presente................

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Display TM1637
« Respuesta #3 en: 15 de Febrero de 2018, 19:21:58 »
No se que compilador usas, pero si usas  CCS deberias cambiar estas lineas:

Código: C
  1. // CCS
  2. #BIT clk = 0xF81.0                       // Pin mapped to PORTB.0
  3. #BIT dio = 0xF81.1                       // Pin mapped to PORTB.1

El codigo es para un PIC18 parece por la direccion de memoria usada. Para el PORTA del PIC16F84A la direccion es 0x05 y luego elegis el bit, ejemplo para RA0 es 0x05.0
Solo decir que este codigo NO me parece confiable, ya que la idea detras del codigo es que la salida del PIC se comporte como un "open Colector", es decir JAMAS pondria el pin 5V, los 5V se obtienen mediante la resistencia de pull-up.

cvargal usa FAST_IO y deberia estar modificando los TRIS tambien.

Por eso en XC8 al momento de ponerlo en "alto" en realidad lo que hace es pasarlo como entrada:

Código: C
  1. #define CLK_LOW TRISCbits.TRISC0 = 0; PORTCbits.RC0=0
  2. #define DIO_LOW TRISCbits.TRISC1 = 0; PORTCbits.RC1=0
  3. #define CLK_HIGH TRISCbits.TRISC0 = 1
  4. #define DIO_HIGH TRISCbits.TRISC1 = 1

Asi que si queres usar el codigo correctamente deberias modificar el codigo para que cuando quiera poner CLK o DIO en 1, modifique los TRIS y no solo el PORT.
Sino corres el riesgo de corotcircuitar los 5V con 0V mediante los pines del PIC y del DS18B20

Desconectado AleSergi

  • PIC16
  • ***
  • Mensajes: 214
Re:Display TM1637
« Respuesta #4 en: 15 de Febrero de 2018, 20:58:42 »
el TM1637, tiene modelo para simular en el Proteus 8.0,? en el mio no existe...

Desconectado arielmdq

  • PIC16
  • ***
  • Mensajes: 166
Re:Display TM1637
« Respuesta #5 en: 16 de Febrero de 2018, 08:37:09 »
Gracias por tu respuesta KILLERJC disculpa que no pude contestar ayer.
Sí estoy usando CCS. Entiendo lo que me decis con respecto a como funcionan las salida de los puertos, ahora entonces tendría que modificar la librería  en la dirección de los puertos
Código: C
  1. #BIT clk = 0xF81.0                       // Pin mapped to PORTB.0
  2. #BIT dio = 0xF81.1
agregarle los #define a la libreria
Código: C
  1. #define CLK_LOW TRISCbits.TRISC0 = 0; PORTCbits.RC0=0
  2. #define DIO_LOW TRISCbits.TRISC1 = 0; PORTCbits.RC1=0
  3. #define CLK_HIGH TRISCbits.TRISC0 = 1
  4. #define DIO_HIGH TRISCbits.TRISC1 = 1
ver si me los toma el CCS escritos de esa manera . Luego cambiar en toda la libreria los CLK  y los DIO  por ejemplo donde dice  CLK = 0  por  CLK_LOW 
 Es asi ?
Ale Sergi: yo tengo proteus 8.4 y figura el TM1637 pero no me funciona me sale un error con respecto e los archivos .DLL
 
El tiempo es una ilusión ,solo existe el presente................

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Display TM1637
« Respuesta #6 en: 16 de Febrero de 2018, 10:02:55 »
Deberias definir un par de cosas.

Usando el FAST_IO(A)

1- Setear el FAST_IO(A)
2- Setear los tris del porta A.
3- Definir nuevos #BIT

Código: C
  1. #BIT  tclk = 0x15.0    // Voy a suponer que 0x15 es la direccion del TRISA
  2.  #BIT tdio = 0x15.1
  3.  
  4. #DEFINE   CLK_HIGH ( tclk = 1 )
  5. #DEFINE   CLK_LOW ( clk = 0; tclk = 0 )
  6. #DEFINE   DIO_HIGH ( tdio = 1 )
  7. #DEFINE   DIO_LOW ( dio = 0; tdio = 0 )

4- Cambiar el codigo par que corresponda.. Ejemplo:

Codigo original:

Citar
clk = 1;
dio = 1;

Reemplazo:

Citar
CLK_HIGH;
DIO_HIGH;


Sin usar el FAST_IO(A)


1- Definir los pines:

Código: C
  1. #DEFINE PIN_CLK  PIN_A0
  2. #DEFINE PIN_DIO  PIN_A1
  3.  
  4. #DEFINE   CLK_HIGH ( output_float(PIN_CLK) )
  5. #DEFINE   CLK_LOW ( output_low(PIN_CLK) )
  6. #DEFINE   DIO_HIGH ( output_float(PIN_DIO) )
  7. #DEFINE   DIO_LOW ( output_low(PIN_DIO) )

2- Cambiarlo en el codigo

EDIT: Cambio de input() a output_float(), siempre me olvido de esa funcion.
« Última modificación: 19 de Febrero de 2018, 19:41:45 por KILLERJC »

Desconectado arielmdq

  • PIC16
  • ***
  • Mensajes: 166
Re:Display TM1637
« Respuesta #7 en: 16 de Febrero de 2018, 11:28:53 »
OK muchas gracias!!! voy a hacer las pruebas y después te cuento. Saludos!!!
El tiempo es una ilusión ,solo existe el presente................

Desconectado AleSergi

  • PIC16
  • ***
  • Mensajes: 214
Re:Display TM1637
« Respuesta #8 en: 18 de Febrero de 2018, 01:01:56 »
buehh...  a la final instalé un Proteus más nuevo,  ahora con la versión 8.6 está el modelo del chip TM1637.
Les dejo una librería que hice funcionar en el simulador y con una placa Arduino,  programandola en C,  con el Winavr,  aprovechando la fiebre arduinera y la disponibilidad de sus placas y módulos como el que nos ocupa a precios muy accesibles.

También la mísma librería la hice funcionar con el PIC CCS compiler,  a fuerza de #define,  sin retocar mucho el código. Más datos en el archivo "leeme.txt" del  .zip

Desconectado arielmdq

  • PIC16
  • ***
  • Mensajes: 166
Re:Display TM1637
« Respuesta #9 en: 19 de Febrero de 2018, 19:32:35 »
Gracias por el aporte AleSergi quise adaptar tu libreria para un pic 16f684 ya que un 876 es demasiado para lo que lo voy a usar,  pero me genera errores, de todos modos no tuve mucho tiempo de hacer pruebas.
 Tambien probe con las correcciones que me dijo killerjc y pude transmitir datos al display, quise mostrar unos números para ver que funcione, pero se encienden segmentos equivocados asi que les agradezco por la ayuda, voy a seguir intentando en cuanto tenga algo claro les cuento, muchas gracias por su tiempo.
                                                                                                  Saludos!!!
El tiempo es una ilusión ,solo existe el presente................

Desconectado arielmdq

  • PIC16
  • ***
  • Mensajes: 166
Re:Display TM1637
« Respuesta #10 en: 01 de Marzo de 2018, 16:07:22 »
Buenas!!! después de haber hecho miles de pruebas me confirmo a mi mismo que soy incapaz de modificar una librería. Solo conseguí que el display encienda y luego que marque algunos segmentos pero no los que yo le indico, este es el programa con el que estoy haciendo las pruebas.
Código: C
  1. #include <16F684.h>
  2. #device adc=10
  3. #include <string.h>                                                                    
  4. #include <stdlib.h>
  5.  
  6. #FUSES NOWDT                    
  7. #FUSES INTRC_IO                    
  8. #FUSES NOPROTECT                
  9. #FUSES NOBROWNOUT              
  10. #FUSES MCLR
  11.  
  12. #use delay(internal=4M)
  13.  
  14. #include <miTM.h>
  15.  
  16. void main()
  17. {
  18.   set_tris_c(0b00000000);
  19.   set_tris_a(0b00000000);
  20.       setup_adc_ports(sAN0|sAN1|sAN2|sAN4|VSS_VDD);
  21.       setup_adc(ADC_CLOCK_DIV_2);
  22.       setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  23.       setup_timer_1(T1_DISABLED);
  24.       setup_timer_2(T2_DISABLED,0,1);
  25.       setup_comparator(NC_NC_NC_NC);
  26.       setup_vref(FALSE);
  27.       setup_oscillator(OSC_4MHZ);
  28.    
  29.       SmgDisplay();
  30.            
  31. while(1)
  32.     {      
  33.        output_high(pin_c2);
  34.        delay_ms(500);  
  35.        output_low(pin_c2);
  36.        delay_ms(500);          
  37.  
  38. // Imprime el numero  |1|2|3|4|, hace uso de la función por writeRawDigit, digito en cada segmento
  39.        writeRawDigit(1,0);
  40.        writeRawDigit(2,1);
  41.        writeRawDigit(3,2);
  42.        writeRawDigit(4,3);
  43.        delay_ms(2000);
  44.    
  45.        output_high(pin_c3); //
  46.        delay_ms(500);  
  47.        output_low(pin_c3);
  48.        delay_ms(500);  
  49.  
  50. // Imprime el numero  |2|4|5|6|, hace uso de la función por  displayValues, en los 4 segmentos
  51.  
  52.       // displayValues(digits[0], digits[0] | 0x80, digits[0], digits[0]);
  53.       displayValues(digits[0], digits[1] , digits[2], digits[3]);
  54.        delay_ms(2000);    
  55.            
  56.     }
  57. }
Puse unos led para saber que el programa corre. Probé con los 3 modos: fast , standard y fixed. Tambien seteando los ( tris )
La librería que modifique con la ayuda de KILLERJC es la que posteo cvarcal mas arriba
Código: C
  1. #DEFINE PIN_CLK  PIN_A1
  2. #DEFINE PIN_DIO  PIN_A0
  3.  
  4. #DEFINE   CLK_HIGH ( output_float(PIN_CLK) )
  5. #DEFINE   CLK_LOW ( output_low(PIN_CLK) )
  6. #DEFINE   DIO_HIGH ( output_float(PIN_DIO) )
  7. #DEFINE   DIO_LOW ( output_low(PIN_DIO) )    
  8.  
  9.                         /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/ /*8*/ /*9*/
  10. //unsigned char digits[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
  11. unsigned char digits[]={0,1,2,3,4,5,6,7,8,9};
  12. #define bright MAX_BRIGHT      //
  13. #define LOW_BRIGHT 0X00
  14. #define MID_BRIGHT 0X02
  15. #define MAX_BRIGHT 0X07
  16.  
  17. /// ================================================
  18. //!void Delay_us (unsigned int i) // n us delay
  19. //!{
  20. //!for (; i> 0; i--)
  21. //!_nop_ ();
  22. //!}
  23. ///  ====== START ========================================
  24. void I2CStart (void)
  25. {
  26. CLK_HIGH;
  27. DIO_HIGH ;
  28. Delay_us (2);
  29. DIO_LOW;
  30. }
  31. ///  ====== ASK ==========================================
  32. void I2Cask (void)
  33. {
  34. CLK_LOW; Delay_us (5);
  35. while (PIN_DIO == DIO_HIGH ); // EN ESTA LINEA TENGO DUDAS
  36. CLK_HIGH; Delay_us (2);
  37. CLK_LOW;
  38. }
  39. ///  ====== STOP =========================================
  40. void I2CStop (void)
  41. {
  42. CLK_LOW; Delay_us (2);
  43. DIO_LOW; Delay_us (2);
  44. CLK_HIGH; Delay_us (2);
  45. DIO_HIGH ;
  46. }
  47. ///  ====== WRITE A BYTE =================================
  48. void I2CWrByte (unsigned char oneByte)
  49. {
  50. unsigned char i;
  51. for (i=0;i<8;i++){
  52. CLK_LOW;
  53. if (oneByte & 0x01) // low front
  54. {DIO_HIGH ;}
  55. else {DIO_LOW;}
  56.  Delay_us (3);
  57.  oneByte = oneByte >> 1;
  58.  CLK_HIGH;  Delay_us (3);
  59. }
  60. }
  61. ///  ====== SCAN KEY (OPTIONAL KEYBOARD) =================
  62. unsigned char ScanKey (void)
  63. {
  64. unsigned char rekey, i;
  65. I2CStart ();
  66. I2CWrByte (0x42);
  67. I2Cask ();
  68. DIO_HIGH ;          
  69. for (i=0;i<8;i++)  
  70. {
  71. CLK_LOW;
  72. rekey = rekey >> 1;
  73. Delay_us(30);
  74. CLK_HIGH;
  75. if(PIN_DIO == DIO_HIGH ){    // EN ESTA LINEA TENGO DUDAS
  76. rekey=rekey|0x80;
  77. }
  78. else {
  79. rekey=rekey|0x00;
  80. }
  81. Delay_us(30);
  82. }
  83. I2Cask();
  84. I2CStop();
  85. return (rekey);
  86. }
  87. void SmgDisplay(void)        
  88. {
  89. unsigned char i;
  90. I2CStart();
  91. I2CWrByte(0x40);
  92. I2Cask();
  93. I2CStop();
  94. I2CStart();
  95. I2CWrByte(0xc0);
  96. I2Cask();
  97. for(i=0;i<6;i++){
  98.    I2CWrByte(0xff); // Send data
  99.    I2Cask();
  100.  }
  101. I2CStop();
  102. I2CStart();
  103. I2CWrByte(0x8f);  // Open display, maximum brightness
  104. I2Cask();
  105. I2CStop();
  106. }
  107. ///  ==============================================
  108. void init_TM1637() // Initialization routine
  109. {
  110.  // Initialization slightly
  111. //!   I2CStart();
  112. //!   I2CWrByte(0x88 | BRIGHT);
  113. //!   I2Cask();
  114. //!   I2CStop();
  115. }
  116. /// ================================================
  117. ///  Esta función envía al módulo TM1637 un byte con la representación en 7 segmentos en la  posción nDigit
  118. void writeRawDigit(unsigned char segment, unsigned char nDigit)
  119. {
  120.    I2CStart();
  121.    I2CWrByte(0x44);
  122.    I2Cask();
  123.    I2CStop();
  124.    I2CStart();
  125.    I2CWrByte(0xC0 | (nDigit & 0x07));
  126.    I2Cask();
  127.    I2CWrByte(segment);
  128.    I2Cask();
  129.    I2CStop();
  130. }
  131. /// ================================================
  132. //  Esta función envía 4 caracteres al módulo TM1637 desde la posición 0 hasta la 4 de los segmentos
  133. void displayValues(unsigned char segment0, unsigned char segment1, unsigned char segment2,unsigned char segment3)
  134. {
  135.    I2CStart();
  136.    I2CWrByte(0x40);
  137.    I2Cask();
  138.    I2CStop();
  139.    I2CStart();
  140.    I2CWrByte(0xC0);
  141.    I2Cask();
  142.    I2CWrByte(segment0);   I2Cask();
  143.    I2CWrByte(segment1);   I2Cask();
  144.    I2CWrByte(segment2);   I2Cask();
  145.    I2CWrByte(segment3);   I2Cask();
  146.    I2CStop();
  147. }
Dentro de la libreria tengo dudas con 2 lineas , una es esta
Código: C
  1. if(PIN_DIO == DIO_HIGH ){
Y otra es esta
Código: C
  1. while (PIN_DIO == DIO_HIGH );
Así esta compilado ahora y de esta manera es como logre que encienda el display.
De igual manera tengo dudas en todas las parte que figuran posiciones de memoria no se si se refiera a posiciones de memoria   del pic o del tm1637, por que si solo se refiere al pic puede que ahi este el problema ya que esta librería se dijo que funciono en un pic 18fxxx y yo estoy usando un 16f684.
También vi por internet que hicieron funcionar este display con un 12f629 que también me serviría pero no dejaron documentación alguna.
Habrá alguna manera de hacer funcionar la libreria del tm1637 que viene para arduino en el ccs ? o es mas dificil que modificar esta ?
Bueno hasta acá es lo que tengo cualquier ayudita se los agradeceré.
                                                                                                  Saludos!!!
El tiempo es una ilusión ,solo existe el presente................

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Display TM1637
« Respuesta #11 en: 01 de Marzo de 2018, 21:23:33 »
Entiendo que muchos hagan sus librerias con software, pero si tuviera que hacer la mia la haria manejando el hardware directamente es decir con un I2C por hardware.

Código: [Seleccionar]
PIN_DIO == DIO_HIGH
No tiene ningun sentido, esto se traduce en:

Código: C
  1. PIN_A0 == output_float(PIN_DIO)

Segun el manual de CCS, output_float es indefinido lo que devuelve, asi que no se puede usar para nada en algo asi

Y luego compararlo con PIN_A0 que es simplemente un entero con un valor 5*8 + 0 = 40
Entonces te das cuenta que esta mal.

-----------------------------------------------

El codigo original es:

Código: C
  1. while (dio);

o traducido y usando las funciones de CCS

Código: C
  1. while (input_state(PIN_A0));

Desconectado arielmdq

  • PIC16
  • ***
  • Mensajes: 166
Re:Display TM1637
« Respuesta #12 en: 02 de Marzo de 2018, 08:32:38 »
Hola KILLERJC gracias por la explicación, suponía que esas dos lineas estaban mal, igualmente las probé de varias maneras pero no me había funcionado, ahora la acabo de probar como me dijiste vos pero sigue haciendo lo mismo. Me voy a poner a leer sobre I2C ya nunca use este protocolo, sobre el chip tm1637 y ver si de alguna manera logro hacer la librería. Desde ya, como siempre  muchas gracias por tu atención. Saludos !!!!
El tiempo es una ilusión ,solo existe el presente................

Desconectado marmoleta

  • PIC10
  • *
  • Mensajes: 20
Re:Display TM1637
« Respuesta #13 en: 22 de Marzo de 2018, 12:21:36 »
Hola compañeros, ante todo agradecer a AleSergi por postiar el codigo (pic16f876).

Pero deseo que mida la temperatura de un lm35 y la muestre en el display.

se puede mostrar en display el resultado de la variable temperatura obtenido del lm35?

« Última modificación: 22 de Marzo de 2018, 12:25:42 por marmoleta »
El universo consta de varios niveles frecuencialesSomos "un gran programa de computadora" Esto es un eterno presente y el tiempo es una ilusion. Solo ante nuestros sentidos percibimos que esto es fisico. Es solo un holograma. Somos personajes "con diferentes niveles de conciencia" y cuanto más bajo sea el nivel de conciencia, más nos maneja el Ego y el Super Ego. Nuestra alma tiene oportunidad, en algunos casos, de elegir el juego y "materializarse mediante un avatar en muchos mundos". Cuando nos aburrimos de "bajar de nivel frecuencial para jugar al juego de los Yos y cuerpos avatares Comenzamos a despertar y debemos limpiar el karma. Cuando Limpiamos el karma y Nos desapegamos de los Yo para "Ser la escencia" Regresamos a la "Fuente" y podemos ser energias guías. Todo queda guardado en los Registros Akashicos by GB

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re:Display TM1637
« Respuesta #14 en: 10 de Junio de 2018, 14:31:14 »
Hola a Todos, mi pregunta es como se enciende los dos puntos del dispay?


 

anything