这是我第二次在这里问了一个问题。上次非常有帮助,所以我想我会再次访问,因为我被困在另一个C项目上!
我只是补充一点,我或多或少在C总共n00b但是知道几乎足以在最小的帮助下尝试这个(直到现在!)并且我不是要求有人为我这样做,只是在正确的方向上指点(没有双关语)。
我已经在谷歌搜索了这个主题,但我正在努力不要只是复制和粘贴来自某些在线资源的代码,因为我想从这个中学习,所以我正在努力开发我自己编码。
我正在尝试做什么: 我自己制作了一块PIC开发板,其中两个共用的阴极7段显示器连接到'877A的PORTD。我已经将RB0和RB1连接到开启7个segs的晶体管,并用简单的代码测试了一切,它工作正常,因此电路完全没有问题。我已经设法创建一个从0到9这个非常基本的程序,我现在决定尝试多路复用并从0-99开始计数。我已经写了一些代码并将其发布在下面,我想请某人向我指出我做错了什么。到目前为止,我的单位数字计数为0-9,但十位数似乎保持在0.
我有一种感觉,我会遗漏一些东西,但我不知道是什么。我可能也有点过分复杂了。
我正在努力制作一个程序作为温度传感器,使用热敏电阻分压器电路输入到PIC的ADC(这是我的实际项目)并显示值多路复用显示器实际上并不是项目的一部分(我们只应该使用一个在“2”和“5”之间交替的数字和“C”代替“25C”等)但我想进一步考虑所以我正在尝试为改进版本开发这个。
无论如何,这对我来说已经足够了,我会粘贴代码并希望有人可以提供帮助。
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#pragma config CP = OFF, DEBUG = OFF, PWRTE = OFF
#pragma config CPD = OFF, LVP = OFF
#pragma config BOREN = OFF, WRT = OFF
#pragma config WDTE = OFF, FOSC = HS
#define _XTAL_FREQ 8000000
void segments (int digits);
int main(int argc, char** argv) {
TRISD = 0x00; //creates an output
TRISB = 0x00;
PORTD = 0x00; //sends zeros to all bits of port D
PORTB = 0x00;
int i,j,num,tens,units,digits;
do {
for (i=0;i<100;i++)
{
units=i%10; //extract units digit
num=i-units; //takes units away leaving multiple of 10
tens=num%10; //extract tens digit
for(j=0;j<20;j++) //should display each ten and unit for 200ms
{
RB0=1; //switch on units segment
RB1=0;
digits=units;
segments(digits);
__delay_ms (5);
RB0=0;
RB1=1;
digits=tens;
segments(digits);
__delay_ms (5);
}
}
}while (1); //do while runs forever
return (EXIT_SUCCESS);
}
void segments (int digits)
{
switch (digits)
{
case 0:
PORTD=0x3F; //zero
break;
case 1:
PORTD=0x06; //one
break;
case 2:
PORTD=0x5B; //two
break;
case 3:
PORTD=0x4F; //three
break;
case 4:
PORTD=0x66; //four
break;
case 5:
PORTD=0x6D; //five
break;
case 6:
PORTD=0x7D; //six
break;
case 7:
PORTD=0x07; //seven
break;
case 8:
PORTD=0x7F; //eight
break;
case 9:
PORTD=0x6F; //nine
break;
}
}
如果我忘记添加任何内容,请告诉我。非常感谢您的任何帮助!
答案 0 :(得分:0)
您应该使用tens = num / 10;
代替%
。
例如,如果在计算单位i
时y
为52,则将除数除以10提取,其为2.然后从52中减去2得到50,并执行相同操作在计算十,这肯定会给你0。