*硬件平台:STM8S005K6T6 REX-C900温控
*功能说明:本例程,利用定时_TIM3中断定时。
代码如下:
#include<iostm8s005k6.h>
#include<stdbool.h>
unsigned char BCD_led[9]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00}; //显示缓存区。8_数码段。+1_LED状态输出指示段。
unsigned char lab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90}; //0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
unsigned char *p=BCD_led,smm=0,s1=0;
bool lii=0;
void TIM3_Config(void)
{
CLK_PCKENR1 |= 0x40; //打开外设时钟源TIM2.
asm("rim");
while(!(CLK_PCKENR1 & 0x01)); //这些具体数据,一定要看数据手册!
TIM3_CR1 = 0x00;
TIM3_PSCR = 0x08; //16/2^4
TIM3_ARRH = 0x00;
TIM3_ARRL = 0x08; //重装值
TIM3_CNTRH = 0x00;
TIM3_CNTRL = 0x00; //计数器
TIM3_IER = 0x01; //开更新中断
TIM3_CR1 = 0x01; //定时器使能
}
void adc_int() //初始化A/D模块
{
ADC_CR2 = 0x00; // A/D结果数据左对齐
ADC_CR1 = 0x00; // ADC时钟=主时钟/2=1MHZ,ADC转换模式=单次,禁止ADC转换
ADC_CSR = 0x0c; // 选择通道12
ADC_TDRL = 0x20;
}
void adc_data()
{
unsigned int a;
ADC_CR1 = 0x01; // CR1寄存器的最低位置1,使能ADC转换
for(a=0;a<200;a++); // 延时一段时间,至少7uS,保证ADC模块的上电完成
ADC_CR1 = ADC_CR1 | 0x01; // 再次将CR1寄存器的最低位置1,使能ADC转换
while((ADC_CSR & 0x80) == 0); // 等待ADC结束
a= ADC_DRH*4; // 读出ADC结果的高8位
a = (a + (ADC_DRL&0x03))*5;
BCD_led[3]=lab[a/1000];
BCD_led[2]=lab[a%1000/100];
BCD_led[1]=lab[a%1000%100/10];
BCD_led[0]=lab[a%1000%100%10];
BCD_led[7]=BCD_led[3];
BCD_led[6]=BCD_led[2];
BCD_led[5]=BCD_led[1];
BCD_led[4]=BCD_led[0];
}
void ioint(void)
{
PB_DDR|=0x07;
PB_CR1|=0x07;
PC_DDR|=0xfc;
PC_CR1|=0xfc;
PD_DDR|=0x9e;
PD_CR1|=0x9e;
PA_DDR|=0x06;
PA_CR1|=0x06;
}
void led_dsp(unsigned char sm)
{
PC_ODR_ODR3=sm&0x01; //BCD段码:a 0;DOWN
PC_ODR_ODR4=(sm>>1)&0x01; //BCD段码:b 1;
PD_ODR_ODR4=(sm>>2)&0x01; //BCD段码:c 2;
PC_ODR_ODR7=(sm>>3)&0x01; //BCD段码:d 3;
PC_ODR_ODR2=(sm>>4)&0x01; //BCD段码:e 4;
PD_ODR_ODR2=(sm>>5)&0x01; //BCD段码:f 5;
PD_ODR_ODR3=(sm>>6)&0x01; //BCD段码:G 6;
PC_ODR_ODR5=(sm>>7)&0x01; //BCD段码:P 7;HIGH小数点。
}
void led_dsp2(unsigned char sm)
{
PA_ODR_ODR1=sm&0x01;
PB_ODR_ODR2=(sm>>1)&0x01;
PD_ODR_ODR1=(sm>>2)&0x01;
PB_ODR_ODR1=(sm>>3)&0x01;
}
void led(unsigned char ase)
{
switch(ase)
{
case 1:
PB_ODR_ODR2=1;
led_dsp(*p); //0;
break;
case 2:
PB_ODR_ODR2=0;
led_dsp(*(p+1)); //1;
PB_ODR_ODR0=1;
break;
case 3:
PB_ODR_ODR0=0;
led_dsp(*(p+2)); //2;
PC_ODR_ODR6=1;
break;
case 4:
PC_ODR_ODR6=0;
led_dsp(*(p+3)); //3;
PD_ODR_ODR1=1;
break;
case 5:
PD_ODR_ODR1=0;
led_dsp(*(p+4)); //4;
PB_ODR_ODR1=1;
break;
case 6:
PB_ODR_ODR1=0;
led_dsp(*(p+5)); //5;
PA_ODR_ODR2=1;
break;
case 7:
PA_ODR_ODR2=0;
led_dsp(*(p+6)); //6;
PD_ODR_ODR7=1;
break;
case 8:
PD_ODR_ODR7=0;
led_dsp(*(p+7)); //7;
PA_ODR_ODR1=1;
break;
case 9:
PA_ODR_ODR1=0; //8;OUT_AT_ALM1_ALM2
led_dsp(0xff);
PC_ODR_ODR5=0;
led_dsp2(*(p+8));
break;
default:
PC_ODR_ODR5=1;
led_dsp2(0x00);
smm=0;
s1++;
if(s1==100)
{
lii^=1;
if(lii==1)
BCD_led[8]=0x00;
else
BCD_led[8]=0x0f;
s1=0;
adc_data();
}
break;
}
}
void main(void)
{
ioint();
adc_int();
TIM3_Config();
while(1);
}
#pragma vector = TIM3_OVR_UIF_vector//中断服务函数,此地址在头文件里可以找到
__interrupt void TIM3_Int(void)
{
smm++;
led(smm);
TIM2_SR1 = 0x00;//清除标志位,如果是没有TIM2_SR2的,直接是TIM2_SR = 0x00
}
以上在硬件上已经跑过,完全正常。
更多的关于本硬件的其它原码已压缩打包请点:http://download.csdn.net/download/hlala/10257147