AVR缺货涨价,有个板子打算转向ST家,有个问题请教大家....
原来单片机用的ATmega48PA,最便宜的那种,现在要4.5元.如果换STM8S103F3P61.75元.
要驱动个2位共阳7段数码管,
48PA引脚加220ohm限流直接驱动,共阳脚直接接IO,长期工作无任何问题,
由于需要在阳光下也要有较好的亮度,故需较大电流驱动LED,这样一来共阳
脚接的IO直接负载8个LED的电流之和就很可观. 但是AVR的工作没问题.
现在问题是:
STM8S103F3P6能胜任吗? 最小改动方案怎么样才合理?
硬件不用动,软件改下扫描方式就可以了。原来按位扫描,改成按段扫描。这样可以保证同时最多只有2段LED点亮。电流肯定没问题了。 不是有LGT么?8F88貌似直代吧 (5-2)/220也不过十来毫安…… wajlh 发表于 2013-12-14 23:14
硬件不用动,软件改下扫描方式就可以了。原来按位扫描,改成按段扫描。这样可以保证同时最多只有2段LED点亮 ...
谢谢, 值得一试.......... delazio 发表于 2013-12-14 23:27
(5-2)/220也不过十来毫安……
关键是假如显示88, CA1 CA2的电流, 按照2楼的试一试. rebar 发表于 2013-12-14 23:30
关键是假如显示88, CA1 CA2的电流, 按照2楼的试一试.
刚才倒是没看那两脚
不过如果换主控加两个三极管也不会影响bom成本吧 delazio 发表于 2013-12-14 23:37
刚才倒是没看那两脚
不过如果换主控加两个三极管也不会影响bom成本吧
俩电阻俩PNP, 成本增加不多....
当然最好是一个都不增加, 坛子高人多, 也许就有惊喜{:biggrin:} !! 本帖最后由 delazio 于 2013-12-14 23:59 编辑
rebar 发表于 2013-12-14 23:46
俩电阻俩PNP, 成本增加不多....
当然最好是一个都不增加, 坛子高人多, 也许就有惊喜 !! ...
我看俩PNP和俩电阻加起来的成本都比你原来切换降下来的少少多了 delazio 发表于 2013-12-14 23:51
我看俩PNP和俩电阻加起来的成本都比你原来切换降下来的少少多了
那看来还是值得换的{:biggrin:} wajlh 发表于 昨天 23:14 static/image/common/back.gif
硬件不用动,软件改下扫描方式就可以了。原来按位扫描,改成按段扫描。这样可以保证同时最多只有2段LED点亮。电流肯定没问题了。
电流没问题了,亮度是问题吧, 超高亮的管子或者换换颜色! xiaodao35 发表于 2013-12-15 11:34
超高亮的管子或者换换颜色!
超亮管子是什么工作原理,是不是电流一样,亮度差别? 可以每个数码管的高4位字段和低4位字段分时点亮,这样电流就可以降低一半了 rebar 发表于 2013-12-15 11:41
超亮管子是什么工作原理,是不是电流一样,亮度差别?
是的,同样电流,超高亮要亮一些! wajlh 发表于 2013-12-14 23:14
硬件不用动,软件改下扫描方式就可以了。原来按位扫描,改成按段扫描。这样可以保证同时最多只有2段LED点亮 ...
按照wailh的建议试验了一下,段扫是可行的,亮度也能接受
就是STM8s103的端口有点拧巴,PD口只有1-6, 数码管的g段放在PC7了
没理会dp
下面是图和不成熟的测试代码
不知道为什么加上asm("sim");编译出错,注释掉就好, 什么东东没有include?
/* MAIN.C file
*
* Copyright (c) 2002-2005 STMicroelectronics
*/
#include "iostm8s103.h"
//显示码
unsigned char leddata[]={
0xC0,//"0"
0xF9,//"1"
0xA4,//"2"
0xB0,//"3"
0x99,//"4"
0x92,//"5"
0x82,//"6"
0xF8,//"7"
0x80,//"8"
0x90,//"9"
0x88,//"A"
0x83,//"B"
0xC6,//"C"
0xA1,//"D"
0x86,//"E"
0x8E,//"F"
0x89,//"H"
0xC7,//"L"
0xC8,//"n"
0xC1,//"u"
0x8C,//"P"
0xA3,//"o"
0xBF,//"-"
0xFF,//熄灭
0xFF//自定义
};
_Bool CA1 @PC_ODR:5;
_Bool CA2 @PC_ODR:6;
_Bool LED_g @PC_ODR:7;
unsigned char i=0;
unsigned char j=0;
unsigned int k=0;
void GPIO_init(void)
{
//asm("sim");
PC_DDR |= 0xE0;
PC_CR1 |= 0xE0;//推挽输出
PD_DDR |= 0x7E;
PD_CR1 |= 0x00;//开漏输出
//asm("rim");
}
void CLK_init(void)
{
CLK_CKDIVR = 0x08; //16M内部RC经2分频后系统时钟8M
}
void delay(unsigned int count)//不精确延时
{
while(count !=0)
{
count--;
}
}
void Light_segment(unsigned char dsp_data)//段扫函数
{
unsigned char segment;
dsp_data = dsp_data<<1;
for(segment=0;segment<8;segment++)
{
switch(segment)
{
case 1:
PD_ODR = dsp_data | 0xFD;//a
delay(100);
break;
case 2:
PD_ODR = dsp_data | 0xFB;//b
delay(100);
break;
case 3:
PD_ODR = dsp_data | 0xF7;//c
delay(100);
break;
case 4:
PD_ODR = dsp_data | 0xEF;//d
delay(100);
break;
case 5:
PD_ODR = dsp_data | 0xDF;//e
delay(100);
break;
case 6:
PD_ODR = dsp_data | 0xBF;//f
delay(100);
break;
case 7:
LED_g = dsp_data>>7;//7段数码管的g段接在PC7上,单独处理
delay(100);
break;
default:
break;
}
PD_ODR |= 0xFF;
LED_g =1;
delay(10);
}
}
main()
{
GPIO_init();
CLK_init();
for(;;){
for(j=0;j<11;j++)//滚动显示0-9
{
for(k=0;k<1000;k++)//
{
if(i==0)
{
CA1=1;
i=1;
}
else
{
CA2=1;
i=0;
}
Light_segment(leddata);//将显示数据进行段扫
}
}
}
}
页:
[1]