TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: cvargcal en 21 de Octubre de 2017, 21:00:42

Título: Display TM1637
Publicado por: cvargcal 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 (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?
Título: Re:Display TM1637
Publicado por: cvargcal 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. :-/ :-/
Título: Re:Display TM1637
Publicado por: arielmdq 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!!!
Título: Re:Display TM1637
Publicado por: KILLERJC 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
Título: Re:Display TM1637
Publicado por: AleSergi 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...
Título: Re:Display TM1637
Publicado por: arielmdq 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
 
Título: Re:Display TM1637
Publicado por: KILLERJC 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.
Título: Re:Display TM1637
Publicado por: arielmdq en 16 de Febrero de 2018, 11:28:53
OK muchas gracias!!! voy a hacer las pruebas y después te cuento. Saludos!!!
Título: Re:Display TM1637
Publicado por: AleSergi 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
Título: Re:Display TM1637
Publicado por: arielmdq 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!!!
Título: Re:Display TM1637
Publicado por: arielmdq 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!!!
Título: Re:Display TM1637
Publicado por: KILLERJC 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));
Título: Re:Display TM1637
Publicado por: arielmdq 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 !!!!
Título: Re:Display TM1637
Publicado por: marmoleta 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?

Título: Re:Display TM1637
Publicado por: soymoe en 10 de Junio de 2018, 14:31:14
Hola a Todos, mi pregunta es como se enciende los dos puntos del dispay?
Título: Re:Display TM1637
Publicado por: locodelafonola en 01 de Noviembre de 2018, 14:33:30
Hola ., yo baje y probe la libreria que compartio el compañero AleSergi
Si bien funciono no la pude aplicar ., lo que nesescitaba para remplazar esto  - Tienes que ingresar para ver archivos adjuntos -  pero no pude por no encontrar y adaptar la librera adecuada
Hoy viendo un tutorial de imprecion 3D ., encontre este video
Si bien segui los link que publica en el video ., no encontre la libreria adecuada., donde estan los LED extras y los botones(TM16XX)
En el video se nota claramente que es el TM1637., en el ccomiemzo de este hilo se muestra la funcion de botones ., pero de manera exterior y no dentro del I2C
agradeceria cualquier sugerencia o indicacion del caso
Título: Re:Display TM1637
Publicado por: alvaro.fredy en 24 de Diciembre de 2018, 20:50:46
Hola, he estado investigando sobre el asunto de este modulo TM1637 y he logrado hacer que funcione con un pic 16f628a....yo dejé CLK = RB0 y DIO = RB1, pero es posible personalizar y dejarlo en cualquier pin modificando "tm.h" en esta parte.....

    #BIT clk = 0x06.0                       // Pin mapped to PORTB.0
    #BIT dio = 0x06.1                       // Pin mapped to PORTB.1


les dejo el código y una simulación en proteus :D
Título: Re:Display TM1637
Publicado por: alvaro.fredy en 25 de Diciembre de 2018, 13:14:40
hola hola, alguien sabe como visualizar letras? en esta parte  de "tm.h" se especifican los números, pero no está en ASCII

                                          /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/ /*8*/ /*9*/
    unsigned char digits[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};

...No entiendo como agregar un 0x?? para visualizar algunas letras D:
Título: Re:Display TM1637
Publicado por: Eduardo2 en 25 de Diciembre de 2018, 18:18:39
hola hola, alguien sabe como visualizar letras? en esta parte  de "tm.h" se especifican los números, pero no está en ASCII

                                          /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/ /*8*/ /*9*/
    unsigned char digits[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};

Es un display de 7 segmentos, algunas letras se pueden visualizar, pero de bonitas nada.

Fijate que en    unsigned char digits[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};   los bits activos son los segmentos que encienden.    Una A mayúscula sería 0x7D  por ejemplo.

Citar
...No entiendo como agregar un 0x?? para visualizar algunas letras D:

No te entiendo, agregar donde?
Título: Re:Display TM1637
Publicado por: alvaro.fredy en 25 de Diciembre de 2018, 18:43:37
Citar
...No entiendo como agregar un 0x?? para visualizar algunas letras D:

No te entiendo, agregar donde?

me refería a  que solo se ingresará "a" por ejemplo, en vez de escribir 0x7D.....pero ya entiendo como poder hacerlo, gracias por la respuesta
Título: Re:Display TM1637
Publicado por: KILLERJC en 25 de Diciembre de 2018, 20:40:09
lo que pasa que una 'a' es equivalente al hexadecimal 0x61 y si lo representas en binario, no hay ninguna relacion con los digitos a encender. Por eso es que se pone el numero o en binario o en hexadecimal como te lo mostraron.

el 0x es para decir que es un numero hexadecimal, si no lo tuviera seria un decimal...

Decimal : 17
Hexadecimal: 0x11
Binario: b00010001
Octal: 021
Título: Re:Display TM1637
Publicado por: Eduardo2 en 26 de Diciembre de 2018, 13:34:50
...
me refería a  que solo se ingresará "a" por ejemplo, en vez de escribir 0x7D.....pero ya entiendo como poder hacerlo, gracias por la respuesta

Una forma puede ser mediante un macro.  La única ventaja es la legibilidad del programa porque en cuanto a caracteres tipeados  es mas o menos la misma.

Ejemplo: Salida hexadecimal (0...F)

Defino el array correspondientes a los segmentos:
Código: [Seleccionar]
const int8 digits[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67,0x77,0x7C,0x39,0x5E,0x79,0x71 };

Defino el macro:   
Código: [Seleccionar]
#define xpr(x)  output_b(digits[x>'9' ? (x-'A'+10)&0xF : x&0xF ])Ojo, se supone que se escriben caracteres válidos.   Si no, remember: Garbage_in ==> Garbage_out

Después se escribe en el programa el carácter en ascii, aunque los números del 0 al 9 no lo necesitan.
Código: [Seleccionar]
        xpr('0') ;
        xpr('1') ;
        xpr('2') ;
        xpr( 1 ) ;
        xpr( 2 ) ;
        xpr('A') ;
        xpr('b') ;
        xpr('c') ;
        xpr('f') ;

Mientras se ingresen constantes el compilador genera directamente lo mismo que haciendo output_b(0xHH)

Cuando se trata de una variable ya no tiene sentido el macro porque se chequea el rango inútilmente.

Título: Re:Display TM1637
Publicado por: KILLERJC en 26 de Diciembre de 2018, 13:52:19
Eso es lo que se suele hacer, obviamente vas a necesitar de una tabla para todos las letras del abecedario. Si es lo que planeta la persona esta. Siendo que hay muchos que no pueden ser representados en un display de 7 segmentos de todas formas vas a tener que ocupar los 27 caracteres del mismo.
Y si... luego la funcion determinara que si son mayuscul, los pasa a minusculas antes de enviarlo, etc. Y poder hacer un :

printf(my_func,"12b");

Título: Re:Display TM1637
Publicado por: javiscrip en 11 de Enero de 2020, 21:02:06
t=23s
Título: Re:Display TM1637
Publicado por: Rafaa en 14 de Febrero de 2023, 00:08:14
Linda información, gracias.