高级会员
- 积分
- 503
- 金钱
- 503
- 注册时间
- 2017-7-24
- 在线时间
- 117 小时
|
5金钱
个人努力写了一个数码管显示的模块,大概思路是这样的,传入参数a,让a对10求余,显示一个数,再a=a/10,再对a求余得到第二位,依次类推。直至四位都显示。但是最近遇到一个问题就是显示负数的时候无法解决。负号不能正常的按照既定思路的显示出来,我个人的思路是假如a求完了,在前面固定显示负号,后来我发现逻辑上不行,因为我的每一位都是循环数据读取的。有没有什么方法可以让第二位固定显示负号呢?附上显示模块的代码:
void DisPlayNum(int n)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE); //使能
if (n < 9999)
{ int i;
int s;
int fu;
s = n;
i=0;
for (i=0;i<4;i++)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|
GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|
GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15 );
if(s<0)
{
s=s-2*s;
fu=1;
}
switch (i)
{
case 0:
GPIO_SetBits(GPIOB,GPIO_Pin_7);
break;
case 1:
GPIO_SetBits(GPIOB,GPIO_Pin_6);
break;
case 2:
if(i==1&&fu==1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|
GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_15 );
}
else GPIO_SetBits(GPIOB,GPIO_Pin_5);
break;
case 3:
GPIO_SetBits(GPIOB,GPIO_Pin_4);
break;
}
switch (s % 10)
{
case 0:
GPIO_SetBits(GPIOB,GPIO_Pin_14|GPIO_Pin_15); // 0
break;
case 1:
GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); // 1
break;
case 2:
GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_13|GPIO_Pin_15); // 2
break;
case 3:
GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_15); // 3
break;
case 4:
GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_15); // 4
break;
case 5:
GPIO_SetBits(GPIOB,GPIO_Pin_9|GPIO_Pin_12|GPIO_Pin_15); // 5
break;
case 6:
GPIO_SetBits(GPIOB,GPIO_Pin_9|GPIO_Pin_15); // 6
break;
case 7:
GPIO_SetBits(GPIOB,GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); // 7
break;
case 8:
GPIO_SetBits(GPIOB,GPIO_Pin_15); // 8
break;
case 9:
GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_15); // 9
break;
}
s = s / 10;
if(s==0)
break;
delay_ms(5);
}
}
}
|
最佳答案
查看完整内容[请看2#楼]
给你一段代码作为参考,这是个显示某一个数码管调用函数。
u8 ledShow(u8 num, u8 dp)//传入显示的字符,小数点
{
u8 code = 0;
switch (num)
{
case 0:
code = 0x3F; //8位二进制表示数码管XGFEDCBA,3F=0011 1111代表点亮FEDCBA,即显示0.其他同理
break;
case 'F':
code = 0x71;
break;
... ....//此处省去n行
case '-': ...
|