历史上的今天

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

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

发布者:Serene123 来源: 51hei关键字:PIC32  数码管  程序实例 手机看文章 扫描二维码
随时随地手机看文章

#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;        //暂停

}



}


}



//  }


关键字:PIC32  数码管  程序实例 引用地址:PIC32数码管程序实例

上一篇:pic 18 __config 配置位 学习
下一篇:PIC单片机上串口测试模块

推荐阅读

蜂鸣器是很常见的设备,分为无源和有源两种。根据项目需求选择不同类型的蜂鸣器。最近的项目里有用到有源蜂鸣器对有源蜂鸣器。还是老一套,把电路板画完,接着编程。在项目中原理图如下:如果不能保证I/O的输出性能可以根据情况增加上拉或者下拉电阻。切入正题:在程序里面这个蜂鸣器的驱动就是个高低电平驱动。高电平三极管导通、蜂鸣器发声,低电平三极...
心音身份识别是指一种利用人体心音信号进行身份识别的技术,心音是心脏及心血管系统机械运动状况的反映,包含了心脏各个部分本身及相互之间作用的生理和病理信息。因此,心音信号在不同的人身上有着完全不同的特征并且具有极高的稳定性,可以用作生物识别技术的识别特征。心音信号除了很难伪装,伪造及篡改外还具有容易获取的优势,因此人体心音信号可以为...
新浪数码讯 11月19日上午消息,前天,华为正式官宣出售荣耀品牌,之后荣耀手机的升级售后问题怎么办? 今天,@荣耀手机 官方微博回答了网友这个问题。  11月17日,深圳特区报上刊登了30多家公司收购华为荣耀的公告。华为出售荣耀品牌,在昨天正式官宣,收购方由 深圳市智信新信息技术有限公司,与30余家荣耀供应商、代理商共同组成。同日,华...
固态激光雷达传感器Velarray H800和Velarray M1600、远距离Alpha Prime 传感器……这些先进的Velodyne Lidar激光雷达解决方案悉数亮相2021年广州国际车展。通过全面展示突破性、高性价比的固态激光雷达传感器,还有以智慧基础设施解决方案为首的领先技术,Velodyne Lidar致力于为中国市场实现安全的自动化驾驶和智慧城市基础设施建设提供关键性支持...

史海拾趣

问答坊 | AI 解惑

基于VC环境的变频器联网控制

摘要:变频器是工业自动化系统中的基本拖动设备。当应用环境非常恶劣,不适合于人在现场对变频器直接进行控制时就需要对变频器进行远程控制。主要介绍了如何用VC编写控制软件对变频器进行联网控制。 关键词:变频器;控制软件;联网控制   0  ...…

查看全部问答∨

基于TI射频标签多协议芯片及Microchip

     近年来随着微电子技术的不断发展,半导体技术和集成电路技术也在迅速发展。目前,IC卡已经深入到社会生活的各个角落,各种各样的卡大大方便了人们的生活,如银行使用的信用卡、公交车使用的交通卡、食堂使用的就餐卡 ...…

查看全部问答∨

异步串口通信

紧急求助各位大侠,为何我从串口读取信息的时候老发生溢出错误,UFSTAT1的值为0X100(即接收FIFO已满,但接收数据量为零)我用是44BOX,给串口发信息的是GSM模块,当串口需要接收的信息稍多的时候,首先会触发串口中断,可是在串口中断函数内部,UF ...…

查看全部问答∨

C51中断处理过程

说明:由于转发的帖子是在很久前浏览网页的时候收藏下来的,作者与源地址已经无从考究,请作者见谅! C51中断处理过程        C51编译器支持在C源程序中直接开发中断过程,因此减轻了使用汇编语言的繁琐工作,提高了开发效率 ...…

查看全部问答∨

关于c52与摄像头

欲制作一通过c52实现参数设置功能并实现数据的存取操作的不使用usb摄像头的远程实时监控系统 在网上搜索时发现ov7620摄像头模块价格较低,但不知是否适用于此单片机,或建议我一些性价比较高的并适用于c52的摄像头模块··· 知道的兄弟请解我疑 ...…

查看全部问答∨

能给出tonardo下memshow()的代码吗?

在网上找过但是没找到,many thanks!…

查看全部问答∨

小弟新手,急求红外防盗报警器的资料,希望高手帮帮忙,谢谢了!!!

小弟新手,急求【红外线防盗报警器的设计资料】,希望高手哥哥姐姐们帮帮忙,谢谢了!!!有的话可以邮箱我,lijunchong@qq.com,小弟不胜感激!!…

查看全部问答∨

新手DIY的宿舍管理系统

$(\'flv_s66\').innerHTML=(mobileplayer() ? \"\" : AC_FL_RunContent(\'width\', \'400\', \'height\', \'300\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', \'http://player.youku.com/player.php/sid/XMz ...…

查看全部问答∨

uda1341的驱动不起来

ModelSim Altera仿真效果图如下:Udal341芯片L3接口控制如图1,在Mode_L3为低时(地址模式),每个Sysclk_L3的上升沿给Data_L3送一个数据,依次为01101000(低位在前);之后,再将Mode_L3拉高(数据传输模式),每个Sysclk_L3的上升沿给Data_L3送 ...…

查看全部问答∨

开关电源损坏的奇怪原因

    各位高手,我用过一批国产开关电源,带铅蓄电池充放电功能的。在现场使用中常常有坏的情况,容易在出现停电、天气变化时好多被损坏,严重的地区有1/3坏的。     电源返回来可以修好,主要就是坏了PWM芯片、芯片供电串联 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved