Red de conocimiento informático - Aprendizaje de programación - Programación Ldcr

Programación Ldcr

¿Está utilizando la placa de desarrollo STM8S en el "Kit de experiencia tres en uno del microcontrolador ST"?

Si es así, puede consultar la siguiente rutina: Es un programa de muestra en el CD oficial de la suite adquirido por Wei Xue Electronics. ¡No sé si puedo ayudarte! Si tienes puntos, úsalos, ¡jeje!

/*========================================== === ===================================*/

/*Proyecto : a través del zumbador del controlador del sistema de demostración STM8 Timer 2 PWM*/

/*Módulo: main.c */

/*Compilador: compilador STM8 Universe C*/

/*Fecha: Febrero de 2009*/

/* - */

/*Descripción: Demostración de firmware para STM8 Mini Kit*/

/* Reproduce una canción a través del timbre. */

/*======================================== === ======================================*/

/ *** ************************************************* **** *************************

*

*Este firmware es para referencia únicamente y está destinado a que los Clientes proporcionen

*información codificada sobre sus productos para que puedan ahorrar

* tiempo. En consecuencia, STMicroelectronics no será responsable de ningún

* daño directo, indirecto o consecuente en relación con cualquier reclamo

* el contenido de dicho firmware y/o la responsabilidad del Cliente ante

*Aquí se encuentra la información de codificación relacionada con sus productos.

*

*Copyright 2008 STMicroelectronics

************************ ************************************************** * *******

*/

/*Incluye - */

#Incluye "STM8S105C_S.h" /*Registro y mapa de memoria archivos. */

/****************************************** ************************************/

/*Definición de macro

/***************************************** ** ********************************/

/*Descripción musical y codificación de notas. */

#define _END_ 0xFF /*La música termina. */

#define _PAUSE_ 0xFE /*Pausa entre diferentes melodías.

*/

/*Definición de tono de nota...*/

#define _FA0 0x00 /* FA- */

#define _SOL0 0x01 /* SOL - */

#define _LA0 0x02 /* LA- */

#define _SI0 0x03 /* SI- */

#define _DO 0x04 /* DO */

#define _RE 0x05 /* RE */

#define _MI 0x06 /* MI */

#define _FA 0x07 / *FA* /

#define _SOL 0x08 /* SOL */

#define _LA 0x09 /* LA */

#define _SI 0x0A /*SI */

#define _DO2 0x0B /* DO+ */

#define _M 0x0C /*Mute*/

#define _RE2 0x0D /* RE+ */

#define _SOL2 0x0E /* SOL+ */

#define _FAd 0x0F /* FA# */

/*Definición de longitud de nota.... .*/

#Definición sq 0x10 /*Media corchea. */

#Definición q 0x20 /*Corchea nota. */

#Definición qp 0x30 /* 1,5 corchea. */

#Definición c 0x40 /* Nota extraña. */

#Definición cn 0x60 /* 1.5 nota. */

#Definición m 0x80 /*Nota mínima. */

/*Aquí una nota se define por la combinación de dos partes, tono y duración.

Fácil de recuperar usando el operador binario AND: nota = tono + duración,

suma de tono y duración del amplificador=0*/

/****************************** ** ************************************************* /

/* Variables del segmento RAM*/

/*************************** ********* ******************************************* ********/

/*Variable global utilizada para almacenar resultados de ADC. */

Entero sin signo AD _ Valor

/*Variable global utilizada para almacenar la tecla presionada al cambiar de octava. */

Carácter sin signo Flag _ Octave _ Chg

/* Variable global utilizada como índice en la matriz de notas: posición en la melodía. */

unsigned int current _ note = 0;

/*Variable global utilizada como índice en la matriz de notas.

*/

Carácter sin firmar c1, c 1_buf;

/*Codificación de notas musicales~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ */

/* FA0 SOL0 LA0 SI0 DO RE MI FA SOLLAS DO2 MUTE RE2 SOL2 FA# */

/* TIM2 CCR1 byte alto. */

const unsigned char Low _ Note _ h[]/*low octave*/

={0x2C, 0x27, 0x23, 0x1F, 0x1D, 0x1A, 0x17, 0x16, 0x13, 0x11, 0x0F, 0x0E, 0x00, 0x0D, 0x09, 0x 15};

const unsigned char Hi_Note_h[] /*octava alta*/

={0x16, 0x13, 0x11, 0x0F, 0x0E, 0x0D, 0x0B, 0x0B, 0x09, 0x08, 0x07, 0x07, 0x00, 0x06, 0x04, 0x0A};

/* TIM2 CCR1 byte bajo. */

const unsigned char Low _ Note _ l[]/*low octave*/

={0xA4, 0xDC, 0x82, 0xA1, 0xEE, 0xA9, 0xAC, 0x62, 0xEE, 0xC1, 0xD0, 0xF0, 0x00, 0x4F, 0xF7, 0x2C};

const unsigned char Hi_Note_l[] /*octava alta*/

={0x52, 0xEE, 0xC1 , 0xD0, 0xF7, 0x54, 0xD6, 0x31, 0xF7, 0xE0, 0xE8, 0x78, 0x00, 0xA7, 0xFB, 0x96};

/* Secuencia de melodía real: un conjunto de notas. */

const unsigned char tune[] =

{

_M+sq, _M+sq, /*Se requieren dos "búferes" para una gestión fluida " Silenciar*/

/*Comentario actual/Comparación de inicialización del comentario actual. */

/* - DO2 SI LA SOL FA MI RE DO - */

/* - DO2 SI LA SOL FA MI RE DO - */

_DO+c, _RE+c, _MI+c, _FA+c, _SOL+c, _LA+c, _SI+c, _DO2+c, _M+m, _PAUSA_,

_DO2+c , _SI+c,_LA+c,_SOL+c,_FA+c,_MI+c,_RE+c,_DO+c,_M+m,_PAUSE_,

/* -Feliz año nuevo.

_DO+c, _DO+c, _DO+c, _M+sq, _DO+m, _SOLm, _MI+c, _M+sq, _MI+m, _DO+m, _DO+c ,

_MI+c, _M+sq, _SOL+m, _SOL+m, _FA+c, _MI+c, _M+sq, _RE+m, _M+sq, _RE+c, _MI+ c ,

_FA+m, _M+sq, _FA+m, _MI+c, _RE+c, _MI+m, _DO+m, _M+sq, _DO+c, _MI+c, _RE + m, _SOLm,

_SIc, _RE+c, _DO+m, _DO+m, _PAUSE_,

/* -Dos tigres.

_DO+c, _RE+c, _MI+c, _DO+c, _DO+c, _RE+c, _MI+c, _DO+c, _MI+c, _FA+c, _SOL+m ,_MI+c,

_FA+c,_SOL+m,_SOL+qp,_LA+sq,_SOL+qp,_FA+sq,_MI+c,_DO+c,_SOL+qp,_LA+ cuadrados ,

_SOL+qp, _FA+sq, _MI+c, _DO+c, _M+sq, _DO+c, _SOLc, _DO+m, _M+sq, _DO+c, _SOL0 + c,

_DO+m, _M+sq, _PAUSE_,

/* - Miel dulce.

_MI+m, _SOL+c, _LA+c, _MI+m, _MI+c, _DO+c, _RE+cn, _DO+q, _RE+c, _MI+q, _SOL+q , _MI+m,

_MI+m, _RE+c, _RE+c, _RE+c, _RE+q, _MI+q, _RE+q, _DO+cn, _LAq, _SOL cn , _DO+m,

_DO+c, _RE+c, _MI+cn, _RE+q, _MI+q, _RE+q, _SOL+q, _RE+m, _RE+m, _RE + m, _RE+m,

_MI+m, _SOL+c, _LA+c, _MI+m, _MI+c, _DO+c, _RE+cn, _DO+q, _RE+c, _MI +q, _SOL+q, _MI+m,

_MI+m, _RE+c, _RE+c, _RE+c, _RE+q, _MI+q, _RE+q, _DO+cn , _LAq,_SOLcn,_DO+m,

_DO+c,_MI+c,_RE+q,_DO+q,_DO+c,_LAq,_SOLcn,_DO+ m, _DO+m, _DO+m, _DO+m, _MI+m,

_MI+m, _SOLm, _LAq, _DO+q, _SOLq, _DO+m, _DO +m , _DO+m, _DO+m, _LAc,

_SIc, _LAc, _SIc, _LAc, _LAq, _DO+q, _SOLq, _SOL c, _MI+m, _MI+m,

_MI+m, _MI+m, _LAc, _SIc, _SIc, _LAc, _LAq, _DO+q, _LA0 +q, _SOLq,

_SOLc, _MI+m, _MI+m, _MI+m, _M+c, _SOL+q, _SOL+m, _M+c, _SOL+ q, _LA +q, _SOL+m,

_M+c, _SOL+q, _SOL+q, _SOL+c, _SOL+q, _SOL+c, _SOL+q, _LA+q, _SOL+m, _SOL+m,

_MI+m, _SOL+c, _LA+c, _MI+m, _MI+c, _DO+c, _RE+cn, _DO+q, _RE+c, _RE+q , _SOL+q, _MI+m,

_MI+m, _RE+c, _RE+c, _RE+c, _RE+q, _MI+q, _RE+q, _DO+ cn, _LAq ,

_SOLcn, _DO+m, _DO+c, _MI+c, _RE+q, _DO+q, _DO+c, _LAq, _SOLcn, _DO +m, _DO+ m,

_DO+m, _DO+m, _MI+m, _MI+m, _SOLm, _LAq, _SOLq, _LAq, _DO+m, _DO+m,

_DO+m, _DO+m, _PAUSE_,

/* - _END_ marca el final de la música - */

_END_

};

/*************************************** ** *******************************************/

/*Definición de función*/

/********************************* ********* ******************************************* **/

/* - */

/*Nombre de la rutina: Buzz_Init */

/*Entrada/salida: Ninguna.

*/

/*Descripción: Inicializa TIM2 al modo PWM para control del zumbador. */

/* - */

void Buzz_Init (void)

{

PD_DDR = 0x 10;/ *Configurar PD4 como salida (para PWM). */

PD _ Cr 1 | = 0x 10; /* Salida PD4 push-pull. */

Tim 2 _ ccmr 1 | = 0x 70 /*Modo de salida PWM2. */

Tim 2 _ ccer 1 | = 0x 03; /* La polaridad CC es baja, habilita la salida PWM */

Tim 2 _ ARR = 0 /* Registro de control de frecuencia : ARR */

Tim 2 _ CCR 1 = 0; /*Registro de control del ciclo de trabajo: CCR */

Tim 2 _ PSCR = 0x 00; fCK_PSC. */

Tim 2 _ Cr 1 | = 0x 01 /* Habilitar TIM2. */

actual _ nota = 1;

}

/* - */

/*Nombre de la rutina: Buzz_Wait * /

/*Entrada/Salida: Duración de la nota (información MSB de 4 bits)/Ninguna. */

/*Descripción: 1) Pruebe el voltaje AIN y guárdelo en AD_Value. */

/* 2) Encuesta al camarero sobre la duración del ticket (basado en un retraso de 4 ms). */

/*Duración: Selección de corchea (2), negra (4) o blanca (8). */

/* - */

void Buzz_Wait(duración del carácter sin firmar)

{

int I = 0

Carácter sin signo UC = 0;

Entero largo sin signo

/* Voltaje AIN muestreado en modo único ADC. */

ADC _ Cr 1 | = 0x 01; /* Primero configure ADON para encender el módulo ADC. */

I = 6; /*Espere & gt7us para asegurarse de que se complete el encendido del ADC. */

while(I-);

ADC _ Cr 1 | = 0x 01; /* Configure ADON nuevamente para iniciar la conversión de AD. */

Y (! (ADC _ CSR & amp0x 80)); /* Espere a que se complete la conversión de AD (EOP=1).

*/

/*Almacenar el valor de ADC en AD_Value */

AD _ Value =((((unsigned int)ADC _ DRH)<<2)+ADC_ DRL)> >2;

if(AD_Value <0x01)

{ AD_Value = 0x 01;}

if( AD_Value >0xC0)

{ AD_Value = 0xC0}

if (Flag_Octave_Chg==1)

{

temp =((((unsigned int)Bajo _ Nota _ h[ c 1 _ buf])& lt;& lt8)+Bajo _ Nota _ l[c 1 _ buf]);

}

Otro

{

temp =((((unsigned int)Hola _ Nota _ h[c 1 _ buf])& lt;& lt8) +Hola _ Nota _ l[c 1 _ buf]); p>

}

Temp =(Temp * AD _ Value)>& gt9;

/*Escribe el nuevo valor del ciclo de trabajo en CCR */

TIM2_CCR1H=(carácter sin signo)(((entero sin signo)Temp & amp0xff00)>& gt8);

Tim 2 _ CCR 1L =(carácter sin signo)((int sin signo)Temp & 0x 00 y siguientes);

/*Tiempo de retraso = Duración* Y */

while (UC <duración)/*El siguiente bucle se ejecuta durante tiempos de "duración". */

{

while(i<1200) /*Este bucle "Y" espera unos 4,3 milisegundos, */

{

i++;

}

I = 0;

uc++;

}

}

/* - */

/*Nombre de la rutina: Buzz_PlayTune */

/*Entrada/salida: Ninguna. */

/*Descripción: Reproducir partitura musical (una canción a la vez). */

/* - */

void Buzz_PlayTune (void)

{

UI sin firmar;

Temp_DCR largo sin firmar;

Temperatura de carácter sin firmar;

while(1)

{

if(tune[current_note] == _END_)

{

/*La música termina y vuelve al principio. 1 no dice nada en */

/* el comienzo de la matriz de notas; */

nota_actual = 1;

Pausa;

}

else if(melodía[nota_actual]= = _ PAUSA _)

{

/*La canción termina, guarda la posición en la canción y deja de reproducir. */

actual _ note++;

Pausa;

}

Otro

{

c 1 = tune[current_notes];

/*Carga las notas (o silencio) en el registro correspondiente*/

/*La información de la nota solo se compone de 4 acarreo de bits más bajo.

*/

c 1 _ buf = c 1 & 0x0f

if (Flag_Octave_Chg==1)

{

temp_DCR =((((unsigned int)Bajo _ Nota _ h[c 1 _ buf])& lt; & lt8)+Bajo _ Nota _ l[c 1 _ buf]);

Tim 2_ARRH = Low_Note_h[c 1_buf];

Tim 2_ARRL = Low_Note_l[c 1_buf];

}

p>

Otro

{

temp _ DCR =((((unsigned int)Hola _ Nota _ h[c 1 _ buf])<<8) +Hola _ Nota _ l[c 1 _ buf]);

Tim 2 _ ARRH = Hola _ Nota _ h[c 1 _ buf];

Tim 2 _ ARRL = Hola _ Nota _ l[c 1 _ buf];

}

DCR temporal = (DCR temporal * valor publicitario)>& gt9;

/* El nuevo valor del ciclo de trabajo se escribe en DCR0. */

temp=((entero sin signo)temp _ DCR & 0xff00)>& gt8;

TIM2_CCR1H=(carácter sin signo)temp

temp=( (entero sin signo)temp _ DCR & 0x 00 ff);

TIM2_CCR1L=(carácter sin signo)temp

/*La duración de espera de la nota. */

/*La información de duración la transportan los 4 bits más altos. */

wait (c 1 & 0xf 0);

/* Avanzar por la matriz de notas: tune. */

actual _ nota++;

}

}

}

/* - */

/*Nombre de la rutina: GPIO_Init */

/*Entrada/salida: Ninguna. */

/*Descripción: Inicializa el GPIO del LED TLI. */

/* - */

void GPIO_Init(void)

{

/* Configuración LED IO*/

/* LD3: PD3 */

/* LD2: PD1 */

/* LD1: PD0 */

PD _ DDR | = 0x0D/*salida. */

PD _ Cr 1 | = 0x0D; /*Empujar y tirar. */

PD_CR2 = 0x00/*Velocidad de salida hasta 2MHz. */

/* Interrupción externa PD7 */

EXTI _ Cr 1 = 0x 00 /*Sensibilidad de interrupción externa (TLI). */

EXTI_CR2=0x00

PD_DDR&=~0x80/*PD7: Entrada*/

PD_CR2=0x80/ * Habilitar interrupciones TLI. */

}

/* - */

/*Nombre de la rutina: CLK_Initialization*/

/*Entrada/salida: ninguno.

*/

/*Descripción: Fuente del reloj de inicialización*/

/* - */

void CLK_Init(void)

{

/*Configurar preescalador HSI*/

CLK_CKDIVR &= ~ 0x 10;/* 01: fHSI= salida fHSI RC/2. */

/*Configurar el preescalador del reloj de la CPU*/

CLK _ CKDIVR = 0x 01;* 001: fCPU=fMASTER/2. */

}

/* - */

/*Nombre de rutina: ADC_Init */

/*Entrada/salida: ninguno. */

/*Descripción: Inicializa el convertidor AD. */

/* - */

void ADC_Init(void)

{

ADC _ CR2 = 0x00

ADC_Cr 1 = 0x 00;

ADC_CSR = 0x03

ADC_TDRL = 0x 20

}

/* - */

/*Nombre de rutina: TIM_Init */

/*Entrada/salida: Ninguna. */

/*Descripción: Inicializa TIM4 como base de tiempo del LED. */

/* - */

tiempo de anulación _ Init(void)

{

/* Configuración del periférico TIM4* /

/*Configuración de la base de tiempos*/

Tim 4 _ PSCR = 0x 04 /*Configurar el preescalador de TIM4. */

TIM4 _ ARR = 0xFF/*Configurar ciclo TIM4. */

/*Contador TIM4 habilitado*/

Tim 4 _ Cr 1 | = 0x 01; */

Tim 4 _ IER | = 0x 01; /* Habilitar interrupción OVR de TIM4. */

}

/* - */

/*Rutina:principal */

/*Entrada principal*/

/* - */

Administrador no válido (no válido)

{

Unsigned int j;

_ASM ("sim");/*Deshabilitar interrupciones. */

flag _ Octave _ Chg = 0;

CLK _Initialization();

GPIO _ Init(); ();

ADC_Init();

_ASM("rim"); /* Habilitar interrupciones. */

Buzz_Init(). /*Inicializa el temporizador periférico. */

mientras ( 1)

{

/*Reproduce la partitura actual. */

buzz _ play tune();

buzz _ Wait(0x 80); /*Espera aproximadamente un segundo. */

}

}

/* -Fin del archivo- */