历史上的今天
返回首页

历史上的今天

今天是:2024年11月19日(星期二)

正在发生

2019年11月19日 | PIC32数码管程序实例

2019-11-19 来源:51hei

#include

#pragma config JTAGEN =OFF

char   Led[]={0x42, 0xf3, 0x86, 0xa2, 0x33, 0x2a, 0x0a, 0xf2, 0x02, 0x22, 0x40, 0xf1, 0x84, 0xa0, 0x31, 0x28, 0x08, 0xf0, 0x00, 0x20, 0x1e, 0x0e, 0x0f, 0xbf, 0x23, 0x9b, 0x8b};

//led字库


void spiout(char image[],int len)

{

    int i;

PORTClearBits(IOPORT_B, BIT_9);

    for (i = 0; i < len; i++)

        {

            SpiChnPutC(2, image[i]);

        }


for(i=0;i<2;i++);//延时使数据传输完后锁存,通常数码管乱码都是这导致的。

PORTSetBits(IOPORT_B, BIT_9);//数据锁存

}

int main()

{

SpiOpenFlags oFlags = SPI_OPEN_MSTEN | SPI_OPEN_CKP_HIGH | SPI_OPEN_MODE8 | SPI_OPEN_ON;//作为主机, ,8位数据模式,SPI使能

PORTSetPinsDigitalOut(IOPORT_B, BIT_9);//外部移位寄存器数据锁存,1锁存,0开放

SpiChnOpen(2, oFlags, 6);//打开通道2即SDO2,配置SPI,fpbDiv(2~1024).波特率BR=Fpb/fpbDiv

PPSOutput(2, RPB8, SDO2);//输出针脚组2中,查表将针脚RPB8,作为数据输出2口SDO2.实际连线也是如此

spiout(Led,4);

}




//PPSOutput(2,RPB5,SDO1);//输出针脚组2中,查表将针脚RPB5,作为数据输出1口SDO1.


//也可查数据手册用另一种,以后再说


//查找头文件PPSOUT.h在C:Program Files (x86)Microchipxc32v1.21pic32-libsincludeperipheral

{


                                        Output Pin Group 2

#define OUT_PIN_PPS2_RPA1        RPA1Rbits.RPA1R

#define OUT_PIN_PPS2_RPB5        RPB5Rbits.RPB5R

#define OUT_PIN_PPS2_RPB1        RPB1Rbits.RPB1R

#define OUT_PIN_PPS2_RPB11       RPB11Rbits.RPB11R

#define OUT_PIN_PPS2_RPB8        RPB8Rbits.RPB8R

#define OUT_PIN_PPS2_RPA8        RPA8Rbits.RPA8R

#define OUT_PIN_PPS2_RPC8        RPC8Rbits.RPC8R

#define OUT_PIN_PPS2_RPA9        RPA9Rbits.RPA9R


//#define OUT_FN_PPS2_SDO1         3  // RPn tied to SDO1

//#define OUT_FN_PPS2_SDO2         4  // RPn tied to SDO2

//#define OUT_FN_PPS2_OC2           5  // RPn tied to OC2

}




秒表


#include

#pragma config JTAGEN=OFF

#pragma config FPLLIDIV = DIV_2         //振荡器配置

#pragma config FPLLMUL = MUL_24

#pragma config FPLLODIV = DIV_2

#pragma config FNOSC = FRCPLL          

#pragma config FPBDIV = DIV_1           //8MHZ/2*24/2/1=48MHZ

#pragma config FWDTEN = OFF

#pragma POSCMOD = OFF

#define PERIOD 48000                    //t=ps*period/48000000=0.001s

int n=0,sta=0,ledflag=1,butflag=0,i=0,b=0,bit1=0,bit2=0;;

char   t[4],Led[]={0x42, 0xf3, 0x86, 0xa2, 0x33, 0x2a, 0x0a, 0xf2, 0x02, 0x22, 0x40, 0xf1, 0x84, 0xa0, 0x31, 0x28, 0x08, 0xf0, 0x00, 0x20, 0x1e, 0x0e, 0x0f, 0xbf, 0x23, 0x9b, 0x8b},image[]={0x42,0x42,0x42,0x42};

//Led 字库


void timer1init()//时钟源1初始化,配置中断等

{

OpenTimer1(T1_ON|T1_SOURCE_INT|T1_PS_1_1,PERIOD);

ConfigIntTimer1(T1_INT_ON|T1_INT_PRIOR_2|T1_INT_SUB_PRIOR_0);

INTEnableSystemMultiVectoredInt();

}

void spiinit()//SPI初始化

{

SpiOpenFlags oFlags = SPI_OPEN_MSTEN | SPI_OPEN_CKP_HIGH | SPI_OPEN_MODE8 | SPI_OPEN_ON;//作为主机,,8位数据模式,SPI使能

SpiChnOpen(2, oFlags, 6);//打开通道2即SDO2,配置SPI,fpbDiv(2~1024).波特率BR=Fpb/fpbDiv

PPSOutput(2, RPB8, SDO2);//输出针脚组2中,查表将针脚RPB8,作为数据输出2口SDO2.实际连线也是如此

PORTSetPinsDigitalOut(IOPORT_B,BIT_9);//外部移位寄存器SLCK数据锁存,1锁存,0开放

PORTSetBits(IOPORT_B, BIT_9);//先置一锁存数据

}

void __ISR(_TIMER_1_VECTOR,ipl2) timer(void)//中断函数0.001s一次中断

{

  INTClearFlag(INT_T1);

  n++;

  if(n>100)//0.1s

  {

      n=0;

      ledflag=1;

//      PORTBINV=(1<<7);    RB7口led灯与按键AN1的RA0并联冲突,不能同时使用

  }


}


void buttoninit()//按键初始化

{

//    ANSELAbits.ANSA0 = 0; //Button1

//    ANSELAbits.ANSA1 = 0; //Button2


PORTSetPinsDigitalIn(IOPORT_A,BIT_0|BIT_1);//按键电位检测读数据

PORTSetPinsDigitalIn(IOPORT_B,BIT_3|BIT_14);//需将对应的按键针脚位设为数字输入


}


void spiout(char im[])//SPI数据输出函数

{

  PORTClearBits(IOPORT_B, BIT_9);

for(i=0;i<4;i++)

{

SpiChnPutC(2,im[i]);//2号通道依次传输数据

}

  for(i=0;i<2;i++);//延时使数据传输完后锁存,通常数码管乱码都是这导致的。

PORTSetBits(IOPORT_B, BIT_9);//数据锁存

}


void led(char imag[3])//秒表换算函数

{

   t[0]++;

   if(t[0]>9)

   {

   t[0]=0;

   t[1]++;

   if(t[1]>19)

   {

   t[1]=10;

   t[2]++;

   if(t[2]>9)

   {

   t[2]=0;

   t[3]++;

  if(t[3]>9)

   t[3]=0;

   }

   }

}

image[0]=Led[t[3]];

image[1]=Led[t[2]];

image[2]=Led[t[1]];

image[3]=Led[t[0]];

spiout(image); //四个数据相互变换

}




void main()//主函数

{


    timer1init();

    spiinit();

    buttoninit();



PORTSetPinsDigitalOut(IOPORT_B,BIT_13);

PORTSetBits(IOPORT_B,BIT_13);

while(1)//死循环检测按键状态和不断投影数码管

{


if(PORTAbits.RA0==0)

{

bit1++;

if(bit1==5)//防止按键颤动,一种状态只运行一次(非常巧妙)

{

     sta=0;

PORTBINV=(1<<13);

}

}

else bit1=0;

if(PORTAbits.RA1==0)

{

    bit2++;

    if(bit2==5)//防止按键颤动,一种状态只运行一次(非常巧妙)

    {

    if(sta==1)

     sta=2;

    else

     sta=1;

    }

}

else bit2=0;

switch(sta)//不同状态运行不同函数

{

     case 0:

for(i=0;i<4;i++)

t[i]=0;

t[1]=10;

image[0]=Led[t[3]];

image[1]=Led[t[2]];

image[2]=Led[t[1]];

image[3]=Led[t[0]];

spiout(image);break;   //初始化重置数码管

     case 1:

         if(ledflag==1)

         {

             ledflag=0;

             led(image);

         }

         break;        //秒表开始

     case 2:

         break;        //暂停

}



}


}



//  }


推荐阅读

史海拾趣

川土(Chipanalog)公司的发展小趣事

随着业务的不断发展,川土微电子开始在全国范围内进行战略布局。公司不仅在上海设立了总部和研发中心,还在其他地区设立了办事处和生产基地。此外,川土微电子还积极与多家封测厂合作建立了封测专线,确保了产品的质量和供应的稳定性。

Advanced Optoelectronic Technology Corp公司的发展小趣事

为了进一步提高竞争力,AOTC开始寻求与上下游企业的合作。通过与原材料供应商、生产设备制造商以及销售渠道商建立紧密的合作关系,公司成功实现了产业链的整合,降低了生产成本,提高了生产效率。此外,公司还与其他科技公司开展战略合作,共同研发新产品,拓展新市场。

Chen Yang Technologies GmbH & Co KG公司的发展小趣事

随着业务的发展,Chen Yang Technologies意识到单靠自身力量难以实现快速扩张。因此,公司开始积极寻求与其他电子行业巨头的战略合作。通过与这些公司的合作,Chen Yang Technologies不仅获得了更多的资金支持和技术资源,还成功进入了新的市场领域。这些合作使得公司的业务范围得到了极大的拓展,同时也提升了公司的品牌影响力。

General Industrial Controls ( GIC )公司的发展小趣事
最高输入电压可达40V,最低输入电压为4.5V。
Foxboro I C T Inc公司的发展小趣事
内部集成频率补偿和固定频率发生器,开关频率为150kHz,相比低频开关调节器,可以使用更小规格的滤波元件。
ALTERA(阿尔特拉)公司的发展小趣事
优化PCB布局和走线,减少信号干扰和电磁辐射。例如,将反馈线远离电感器,使用地线屏蔽或单点接地等方式来降低噪声和干扰。

问答坊 | AI 解惑

两种典型控制方法在逆变器控制器中的比较

摘要:对比分析了逆变器控制中的电容电流反馈和电感电流反馈两种控制方式。推导了控制器的控制模型,分析了控制器的设计方法,给出了各种突加负载及恒定负载状态下的实验结果,指出了两种控制方法的特点以及优缺点。实验在800VA的逆变器中进行,逆变 ...…

查看全部问答>

新闻早班车:超高容值液钽电容器

大家可以关注下这款器件,Vishay在无源器件方面世界领先 日前,Vishay Intertechnology, Inc.宣布,推出通过了DSCC Drawing 10004认证的超高容值液钽电容器——DSCC 10004。Vishay的新款DSCC 10004器件具有业内最高的容值,采用轴向T1、T2、T3和 ...…

查看全部问答>

你们从事的行业那些东西是进口的?请写在下面吧……

你们从事的行业那些东西是进口的?请写在下面吧……让我们看看中国的现状!…

查看全部问答>

关于驱动中实现短等待的小问题

      现在在写一个简单打印机(数字记录仪)的驱动,打印机给出数据申请信号(中断实现),然后主机发送数据,通过查询BUSY信号来确定数据发送的时间。       问题出现了:BUSY设定为普通的一个IO口,驱 ...…

查看全部问答>

驱动加载的方法

除了inf和安装服务还有什么别的法子么?…

查看全部问答>

什么语言最适合嵌入式系统开发?

什么语言最适合嵌入式系统开发?…

查看全部问答>

关于一个串口类定义两个子串口类对象,和两个通信协议的问题.

问题描述: 一个串口类,采用线程,然后定义两个类对象,分别用于两个通信协议, RS485的MODBUS通信协议(假设为A协议)和用于GPRS上的通信协议(假设为B协议), 那么我原本是在串口类中采用回调函数来处理接收到的数据, 但是由于,底层的驱动是是每接收 ...…

查看全部问答>

关于 wince 下 IESIMPLE 应用问题

                   怎么能让IE 打开之后 显示 我指定的图片呢 也就是说 我怎么把我的地址 传给IE 费解 请大侠 指点!…

查看全部问答>

关于2812外扩ad采样的问题

我采用max115来采样。而115需要/CS片选信号,然后还有中断信号/INT,还有/WR,/RD。请问这些信号是否可以直接用2812的XA端口信号,或者使用GPIO来控制? 如果采用CPLD进行统一的逻辑控制可能比较容易,但是我只是打算用2812 自身的资源。 谢谢各 ...…

查看全部问答>