]<span class="texto_mini">Codigo:</span>[hr /
]<span class="texto_mini">Codigo:</span>[hr /
]<span class="texto_mini">Codigo:</span>[hr /

Codigo:
int y=128; // Variable entera a convertir
char sy[4]; // String de destino de la conversión (tres dígitos + de fin de string)
sprintf(sy,"%u",y); // sx vale ahora "128 "
Codigo:
int x=128; // Variable entera a convertir
char sx[4]; // String de destino de la conversión (tres dígitos + de fin
int c,d,u; // Variables intermedias para centenas, decenas y unidades
c = (int) x / 100; // Calculamos cuantas centenas tiene nuestro número ...
x = x - (c * 100); // y se lo restamos
d = (int) x / 10; // Calculamos cuantas decenas tiene nuestro número ...
x = x - (d * 10); // y se lo restamos
u = (int) x / 1; // Y por último calculamos cuantas unidades tiene nuestro número.
// De esta forma nuestro string se compone de ...
sx[0]="0"+c; // La Centena que será el ASCII del "0" mas nuestras centenas
sx[1]="0"+d; // La Decena que será el ASCII del "0" mas nuestras decenas y
sx[2]="0"+u; // La Unidad que será el ASCII del "0" mas nuestras unidades
sx[3]=" "; // Y finalizamos el string con su correspondiente caracter
// sx vale ahora "128 "





... manolo, me llamas Toro, y yo tan ancho y tan pancho ... jua, jua, jua 

... 




Codigo:
////////// FUNCION QUE CONVIERTE A 5 DIGITOS DE BINARIO long int A BCD //
void bin16_bcd5(long int n)// el numero a convertir es un entero largo
{
int i; // indice del arreglo unidades=bcd_dato
- ,d=[1],...m=[5]
for(i=0;i<5;i++)// llena el arreglo con los valores uni,dec,cen,mil,diezm
{ // (cambio i dependiendo que tantos digitos sea el # a convertir)
bcd_dato[ i ]=n%10;// mediante la operacion modulo se obtiene el, i digito decimal
n=n/10; // n dividido 10 para cada i y tomamos su valor entero:
} // por ejemplo para i=0, 4358 mod 10 =8, luego 4358/10 =435
} // para i=2, 435 mod 10=5, 435/10=43 luego 43 mod 10=3
LUEGO:
bcd_dato[0]=8
bcd_dato[1]=5
bcd_dato[2]=3
bcd_dato[3]=4
. .
. .
. .
Codigo:
STANDARD STRING FUNCTIONS
STRCAT()
STRCHR()
STRRCHR()
STRCMP()
STRNCMP()
STRSPN()
STRICMP()
STRNCPY()
STRCSPN()
STRLEN()
STRLWR()
STRPBRK()
STRSTR()
Syntax: ptr=strcat (s1, s2) Concatenate s2 onto s1
ptr=strchr (s1, c) Find c in s1 and return &s1[ i ]
ptr=strrchr (s1, c) Same but search in reverse
cresult=strcmp (s1, s2) Compare s1 to s2
iresult=strncmp (s1, s2, n) Compare s1 to s2 (n bytes)
iresult=stricmp (s1, s2) Compare and ignore case
ptr=strncpy (s1, s2, n) Copy up to n characters s2->s1
iresult=strcspn (s1, s2) Count of initial chars in s1 not in s2
iresult=strspn (s1, s2) Count of initial chars in s1 also in s2
iresult=strlen (s1) Number of characters in s1
ptr=strlwr (s1) Convert string to lower case
ptr=strpbrk (s1, s2) Search s1 for first char also in s2
ptr=strstr (s1, s2) Search for s2 in s1
Parameters: s1 and s2 are pointers to an array of characters (or the name of an array).
Note that s1 and s2 MAY NOT BE A CONSTANT (like "hi" ).
n is a count of the maximum number of character to operate on.
c is a 8 bit character
Returns: ptr is a copy of the s1 pointer
iresult is an 8 bit int
result is -1 (less than), 0 (equal) or 1 (greater than)
Function: Functions are identified above.
Availability: All devices
Requires: #include <string.h>

]<span class="texto_mini">Codigo:</span>[hr /












Codigo:
// Definiciones y Funciones de Date Time ////////////////////////////////////////////////
// Números ISO de los dias de la semana
#define LUNES 1
#define MARTES 2
#define MIERCOLES 3
#define JUEVES 4
#define VIERNES 5
#define SABADO 6
#define DOMINGO 7
const int Dias_de_cada_Mes[2][13] = { {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} };
const int Orden_Dias_Semana[7] = {6, 7, 1, 2, 3, 4, 5};
#define SEGUNDOS_EN_UN_DIA 86400
#define SEGUNDOS_EN_UNA_HORA 3600
#define SEGUNDOS_EN_UN_MINUTO 60
#define MINUTOS_EN_UN_DIA 1440
#define MINUTOS_EN_UNA_HORA 60
#define HORAS_EN_UN_DIA 24
// Algunas funciones que seran usadas mas adelante
#inline
short esAgnoBisiesto(int y) {
return (y % 4 == 0);
}
#separate
int32 diasDesdeAgno1(int y, int m, int d) {
int32 dias = 0;
int i;
short es_bisiesto;
es_bisiesto = esAgnoBisiesto(y);
for (i=1; i<y; i++) {
if (esAgnoBisiesto(i))
dias += 366;
else
dias += 365;
}
for (i=1; i<m; i++)
dias += Dias_de_cada_Mes[es_bisiesto][ i ];
dias += d;
return dias;
}
#separate
int32 segundosDesdeHora0(int h, int m, int s) {
int32 segundos;
segundos = (int32)h * SEGUNDOS_EN_UNA_HORA;
segundos += (int32)m * SEGUNDOS_EN_UN_MINUTO;
segundos += s;
return segundos;
}
#separate
int32 segundosDesdeAgno1(int yr, mo, dy, hr, mi, se) {
int32 segundos;
segundos = diasDesdeAgno1(yr, mo, dy) * SEGUNDOS_EN_UN_DIA;
segundos += segundosDesdeHora0(hr, mi, se);
return segundos;
}
// Calcula el numero de segundos entre dos fechas y horas
// Adaptado para años entre 2001 y 2135 (limitado por el tamaño de los int32)
#separate
int32 segundosEntre(int yr1, mo1, dy1, hr1, mi1, se1, yr2, mo2, dy2, hr2, mi2, se2) {
int32 inicio;
int32 final;
inicio = segundosDesdeAgno1(yr1, mo1, dy1, hr1, mi1, se1);
final = segundosDesdeAgno1(yr2, mo2, dy2, hr2, mi2, se2);
if (inicio > final)
return inicio-final;
else
return final-inicio;
}
// Calculo del dia de la semana. Adaptado SOLO para años del 2000 al 2099
#separate
int ISODiaDeLaSemana(int YY, int MM, int DD) {
signed long diaDeLaSemana;
int cent = 20; // YYYY / 100
// Algoritmo de congruencia de Zeller
if (MM < 3) {
MM = MM + 12;
if (YY > 0)
YY--;
else {
YY = 99;
cent--;
}
}
diaDeLaSemana = DD;
diaDeLaSemana += (((signed long)MM + 1) * 26) / 10;
diaDeLaSemana += YY;
diaDeLaSemana += YY / 4;
diaDeLaSemana += cent / 4;
diaDeLaSemana -= cent * 2;
while (diaDeLaSemana < 0)
diaDeLaSemana += 7;
diaDeLaSemana %= 7;
return Orden_Dias_Semana[(int)diaDeLaSemana]; // Ahora tenemos el número ISO del dia de la semana
}
// Calculo de número ISO de la semana. Adaptado SOLO para años del 2001 al 2098
#separate
void ISONumeroDeLaSemana(int YY, int MM, int DD, int& weekOfYear, int& actualYear)
{
signed long diaDelAgno;
int DiaDeLaSemanaInicial;
int DiaDeLaSemanaFinal;
short bisiesto;
signed int i;
do {
bisiesto = esAgnoBisiesto(YY);
diaDelAgno = 0;
for (i=1; i<=MM; i++) {
if (i < MM)
diaDelAgno += Dias_de_cada_Mes[bisiesto][ i ];
else
diaDelAgno += DD;
}
actualYear = YY;
DiaDeLaSemanaInicial = ISODiaDeLaSemana(actualYear, 1, 1);
if (DiaDeLaSemanaInicial > JUEVES)
diaDelAgno -= 8 - DiaDeLaSemanaInicial;
else
diaDelAgno += DiaDeLaSemanaInicial - 1;
if (diaDelAgno <= 0)
weekOfYear = 0xFF;
else {
weekOfYear = diaDelAgno / 7;
if (diaDelAgno % 7 != 0)
weekOfYear++;
if (weekOfYear > 52) {
DiaDeLaSemanaFinal = DiaDeLaSemanaInicial;
if (bisiesto) {
if (DiaDeLaSemanaFinal == DOMINGO)
DiaDeLaSemanaFinal = LUNES;
else
DiaDeLaSemanaFinal++;
}
if (DiaDeLaSemanaFinal < JUEVES) {
actualYear++;
weekOfYear = 1;
}
}
}
if (weekOfYear == 0xFF) {
if ((--DD)==0) {
if ((--MM)==0) {
YY--;
MM = 12;
}
DD = Dias_de_cada_Mes[esAgnoBisiesto(YY)][MM];
}
}
} while (weekOfYear == 0xFF);
}
...
#inline
short esAgnoBisiesto(int y)
{
return (y % 4 == 0);
}
...
#define TRUE 1
#define FALSE 0
int GLeapYearQ(int y)
{
if( (y % 4) != 0 ) return FALSE;
if( ( y % 100 ) != 0 ) return TRUE;
if( ( y % 400) != 0 ) return FALSE;
return TRUE;
}
Si pero la función sigue estando mal.
Yo pondria esta versión:
#define TRUE 1
#define FALSE 0
int GLeapYearQ(int y)
{
if ( (y % 4) = 0 ) & // Sea Divisible por 4 "Y"
((y % 100) != 0) | // ( No divisible por 100 "O"
(y % 400) = 0))) // Divisible por 400 )
return TRUE;
else
return FALSE;
}
Bueno, ya esta funcionando.Bueno, por lo que veo utilizas displays de 7 segmentos, cosa que no habias aclarado.
De esta forma fue en la que trabajo.
lectura_ADC=read_adc();
lectura_ADC=lectura_ADC*5;
lectura_ADC=lectura_ADC/1023;
sprintf(temperatura_BCD,"%2.2f",lectura_ADC);
umil=ascci_dec(temperatura_BCD[0]);
centena=ascci_dec(temperatura_BCD[1]);
decena=ascci_dec(temperatura_BCD[3]);
unidad=ascci_dec(temperatura_BCD[4]);
Bueno laconclucion es que en la variable temperatura_BCD quedan guardados los BCD pero en ascii.
Lo que tengo ahora es el siguiente problema. Uso el PIC18F452. Tiene un cristal de32768hz. Por hacer los procedimientos anteriores, el display Parapadea demasiado, tanto que se dificulta leerlo. ¿Hay alguna forma de elevar la velocidad de trabajo sin cambiar el cristal?
lectura_ADC=read_adc();
lectura_ADC=lectura_ADC*5;
lectura_ADC=lectura_ADC/1023;float const resoluc=5.0/1023.0;
i=read_adc();
lectura_ADC=i*resoluc;void long_to_strBIN(long value){
int i;
for(i=0;i<16;i++){ // limpia el array
cadena[i]='0';
}
for(i=0;i<16;i++){
if(bit_test(value,i)){ // prueba cada bit del long
cadena[15-i]='1'; // asigna el caracter "1" al array si el bit es uno
}
else{
cadena[15-i]='0'; // asigna el caracter "0" al array si el bit es cero
}
}
}
#include <16f877.h> //archivo de cabecera
#fuses XT,NOWDT,NOPROTECT // el fuse que configuramos anteriormente (CORREGIDO)
#use delay(clock=4000000) // el clock que tendremos a la entrada del CPU
#define use_portb_lcd TRUE
#include <LCD.c>
char cadena[16]; // usada dentro de long_a_binario.c
#include <long_a_binario.c>
void main(){
long value;
set_tris_c(0x1); //RC0<- entrada
lcd_init(); // inicia la LCD
value = 0xffff; // carga value con un long de 65535
while(1){ //bucle eterno
while(!input(PIN_C0)){ // pregunta por RC0
long_to_strBIN(value); //convierte un LONG en un arrays de 16 caracteres
delay_ms(10);
printf(lcd_putc,"\f%s\n",cadena); //muestra en binario
printf(lcd_putc,"%lu",value); // muestra en decimal
value--; //decrementa el long
delay_ms(100); //retardo
}
}
}
Unirme a mis compañeros en las felicitaciones!y para mi vuesamerced RedPic, amigo, forero y maestro solo me queda decir que el titulo de ingeniero se te queda pequeño!!!
Cada dia me gusta mas este foro!tanto por la informacion que contiene como la gente que lo habita!
Suerte!!!<img src="http://pics.miarroba.com/caretos/wink.gif" alt="Giño" title="Giño" />
Unirme a mis compañeros en las felicitaciones!y para mi vuesamerced RedPic, amigo, forero y maestro solo me queda decir que el titulo de ingeniero se te queda pequeño!!!
Cada dia me gusta mas este foro!tanto por la informacion que contiene como la gente que lo habita!
Suerte!!!<img src="http://pics.miarroba.com/caretos/wink.gif" alt="Giño" title="Giño" />
hola estimado mi nombre Juan Carlos, en mis estudios debo ahcer un programa con pic c compiler, tiene los siguientes condiciones
1.- Debe trabajar con un dato decimal y otro entero
2.- se deben ver en un lcd
3.- Via un pulsador se debe aumentar o disminuir el decimal en fraccion de uno y en entero en 1 y verse en el lcd
4.- Se debe guardar en memoria ( el entero en entero y float en float)
5.- al reiniciar el pic los valores guardados en memoria se deben leer y ver en la lcd
6,. y asi sucesivamente
Espero me pueda ayudar
Juka