stm8驱动TM1629点亮数码管

2019-07-14 20:46发布

本人刚学stm8想用来驱动TM1629芯片点亮数码管,TM1629的程序是从51单片机上复制过来的,不知为什么不成功,个位数总是闪的很快,延时后个位数就不变了,十位百位数一直是零,是不是stlink下载的时候还要配置呢,希望高手不吝赐教。tica">

#include"stm8s005k6.h"
#define uchar unsigned char
#define uint  unsigned int


_Bool dio @PD_ODR:5;
_Bool clk @PD_ODR:6;
_Bool stb @PD_ODR:7;
uchar qian,bai,shi,ge,k,date;
void GPIO_Int(void)
{
  PD_CR1|=0xE0;
        PD_CR2=0x00;//端口输入输出方式控制,cr=1,cr2=0推挽式输出
        PD_DDR|=0xE0;//输入输出设置,1设置为输出
//        PD_ODR|=0x70;//端口数据寄存器


}
uchar SG8_NUM[]=                 //八段共阴数码管的0—F段码表
{
        0Xbf,0X86,0Xdb,0Xcf,
        0Xe6,0Xed,0Xfd,0X87,
        0Xff,0Xef,0x00
};
void delay(uchar x)
   { uchar a,b;
      for(a=0;a<x;a++)
                    for(b=0;b<50;b++);
                  
    }
void ad(void)                          //取个,十,百,千 位
{       
        qian=date/1000;
        bai=date%1000/100;
        shi=date%100/10;
        ge=date%10;        
}
void indate(uint s)                           //tm1629
{          
        uint i;
        stb=0;
        for(i=0;i<8;i++)
          {         
                clk=0;
       
                if(s&0x01!=0)
                {
                        dio=1;
               
                }
                else
                {
                        dio=0;


                }         
                   clk=1;
                       
                   s=s>>1;
               
           }
       
}
void show_dat (void)                //数码管显示
{                 
        stb=1;


        indate(0x40);  //数据命令设置
        stb=1;


        indate(0xc0); //地址命令设置
       
        indate(SG8_NUM[8]);//1


        indate(SG8_NUM[8]);
       
        indate(SG8_NUM[ge]);//2


        indate(SG8_NUM[ge]);


        indate(SG8_NUM[shi]);//3


        indate(SG8_NUM[shi]);


        indate(SG8_NUM[bai]);//4
       
        indate(SG8_NUM[bai]);
  
        indate(SG8_NUM[qian]);//5 v


        indate(SG8_NUM[qian]);
       
        indate(SG8_NUM[bai]);//6 v


        indate(SG8_NUM[bai]);


        indate(SG8_NUM[8]);//7


        indate(SG8_NUM[shi]);


        indate(SG8_NUM[8]);//8
       
        indate(SG8_NUM[ge]);


        stb=1;
       
        indate(0x8a);//显示控制
}
main()
{


        GPIO_Int();
        clk=1;delay(1);
        dio=1;delay(1);
        stb=0;delay(1);
       
        while(1)
        {  
           for(k=0;k<255;k++)
                 {
   
                        date=k;
                        ad();
                        delay(1);
                        show_dat();
                        delay(1);
                 }
                //        while(1);
  }                       
       
}

0条回答

一周热门 更多>