×
单片机 > 单片机程序设计 > 详情

基于pic16f877a的电压输出并显示

发布时间:2020-06-18 发布时间:
|

 

程序源码如下

#include


//引脚定义

#define din RC7           //显示串行数据输入端

#define load RC6          //显示数据锁存端

#define clk RC5           //显示时钟输入端


#define DecodeMode 0x09     //译码模式

#define Intensity 0x0a      //亮度

#define ScanLimit 0x0b      //扫描界限

#define ShutDown 0x0c       //掉电模式

#define DisplayTest 0x0f    //显示测试

#define ShutdownMode 0x00      //掉电方式

#define NormalOperation 0x01   //正常操作方式

#define DecodeDigit 0xff       //译码位数设置

#define IntensityGrade 0x08    //显示亮度级别设置

#define ScanDigit 0x07         //扫描位数设置

#define TestMode 0x01          //显示测试方式

#define TextEnd 0x00           //显示测试结束,正常工作


unsigned char votAJU = 0x00;    //是否使用CVRR位置,由RD7控制

unsigned char votCounter =0;    //电压输出计数器


//4MHz下以ms为单位的延时

void delayMS(unsigned int ms)

{

  int i,j;

  for(i=0;i

  {

    for(j=0;j<70;j++);

  }

}


//向max7219写入一个字节

void Write_Max7219_byte(unsigned char DATA)           //LED写数据函数

{

       unsigned char i,k;

       load=0;

       for(i=8;i>=1;i--)

          {

            clk=0;

            k=DATA&0x80;

                        if(k==0x80)din=1;

                        else din=0;

            DATA<<=1;

            clk=1;

           }                                             

}

//向max7219写入指定位置的数据,address为位置,dat为数据

void Write_Max7219(unsigned char address,unsigned char dat)

{

  load=0;

  Write_Max7219_byte(address);

  Write_Max7219_byte(dat);

  load=1;               

}


//初始化max7219

void init_max7219(void)

{

    Write_Max7219(DecodeMode,DecodeDigit);      //设置译码模式

    Write_Max7219(Intensity,IntensityGrade);    //设置亮度

        Write_Max7219(ScanLimit,ScanDigit);         //设置扫描界限

    Write_Max7219(ShutDown,NormalOperation);    //设置电源工作模式

        Write_Max7219(DisplayTest,TextEnd);              //显示测试寄存器,写入00H,实现正常工作

}



//显示函数

void displayVoltage(unsigned char temp[4])

{

    Write_Max7219(0x01,0x0E);

    Write_Max7219(0x02,0x0A);

    if(RD7 == 1)

    {

      Write_Max7219(0x03,1);

    }

    else if(RD7 == 0)

    {

      Write_Max7219(0x03,0);

    }

    else

    {

    }

    Write_Max7219(0x04,0x0F);

    Write_Max7219(0x05,(temp[0]|0x80));

    Write_Max7219(0x06,temp[1]);

    Write_Max7219(0x07,temp[2]);

    Write_Max7219(0x08,temp[3]);        

}


void initINT(void)

{

        OPTION = 0x00;        //设置端口B为弱上拉电阻,RB为下降沿触发中断

    GIE = 1;

    INTE = 1;

    //允许RB0/INT中断

}


void initPORT(void)  //初始化端口D

{

  TRISB0 = 1;     //RB0为输入

  TRISC = 0x00;   //设置为输出

  PORTC = 0x00;   //输出都为0

  TRISD7 = 0;     //RD7为输入

}



void interrupt INTISR(void)

{

        if(INTF == 1)    //如果是外部中断

        {

                INTF = 0;                  //清除标志

        votCounter++;

        if(votCounter > 0x0F)  //只有16X2种可能

        {

          votCounter = 0;

        }

        }

}


void initVotOut(void)

{

  CVRR = 1;

  CVR3 = 0;

  CVR2 = 0;

  CVR1 = 0;

  CVR0 = 0;     //输出1.25V

  CVROE = 1;    //输出AN2引脚

  CVREN = 1;   //开启电压输出

}



void main(void)

{

    unsigned char vtemp[4];

    initPORT();             //端口初始化

    initINT();

    initVotOut();

    init_max7219();          //MAX7219初始化

    vtemp[0] = 0;

    vtemp[1] = 0;

    vtemp[2] = 0;

    vtemp[3] = 0;            //输出0V

    while (1)

    {  

      delayMS(20);

      CVRR = RD7;;

      if(votCounter == 0x00)     //1.25V或者0V

      {

        CVR3 = 0;

        CVR2 = 0;

        CVR1 = 0;

        CVR0 = 0;   

        if(RD7 == 1)             //CVRR = 1

        {

          vtemp[0] = 0;

          vtemp[1] = 0;

          vtemp[2] = 0;

          vtemp[3] = 0;            //输出0V      

        }

        else if(RD7 == 0)

        {

          vtemp[0] = 1;

          vtemp[1] = 2;

          vtemp[2] = 5;

          vtemp[3] = 0;            //输出1.25V   

        }

      }

      else if(votCounter == 0x01)     //0.21或1.41V

      {

        CVR3 = 0;

        CVR2 = 0;

        CVR1 = 0;

        CVR0 = 1;   



关键字:pic16f877a  电压输出  显示


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会