|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2013-12-16 16:56:35
|
显示全部楼层
按照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[j-1]);//将显示数据进行段扫
}
}
}
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|