stm8驱动TM1629点亮数码管
时间:10-02
整理:3721RD
点击:
本人刚学stm8想用来驱动TM1629芯片点亮数码管,TM1629的程序是从51单片机上复制过来的,不知为什么不成功,个位数总是闪的很快,延时后个位数就不变了,十位百位数一直是零,是不是stlink下载的时候还要配置呢,希望高手不吝赐教。
#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);
}
}
#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);
}
}
已退回2积分