⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pic-595.c

📁 PIC驱动595显示的经典例子
💻 C
字号:
#include <pic.h>
#define  CLK_595    RC3    // 移位时钟----------74HC595 11# 
//#define  LOAD_595   RC4     //锁存时钟----------74HC595 12# 
#define  LOAD_595   RC0     //锁存时钟----------74HC595 12# 
#define  DATA_595   RC5     //数据--------------74HC595 14#
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long

unsigned int ADC_Value;
unsigned long a;
unsigned  char flag;
void delay_1ms(void);
void delay_nms(unsigned int n);
void sendbyte(unsigned int data);
void out595(void);
void spiintial(void);
void Display(unsigned int dat,unsigned char DotPosition,unsigned char ClearZeroFlag);

//---------------8位2进制段代码对应数码管笔段 hcdb afge----------------//
const displaycode[] = {0x82,0xaf,0xc4,0x85,0xa9,0x91,0x90,0xa7,0x80,0x81,
				            0xa0,0x98,0xd2,0x8c,0xd0,0xf0,0xfd,0xff};//0-9,A-F,-,全灭
uchar PortCode[8] = {0,0,0,0,0,0,0,0};
void delay_1ms(void)                
  { 
   	unsigned int b; 
   	for (b=0;b<150;b++); 
  } 
   
void delay_nms(unsigned int n)      
  { 
   	unsigned int c=0; 
   	for (c=0;c<n;c++) 
   	delay_1ms(); 
  }
/**************************************************595显示程序*****************************************************/

/*SPI显示子程序*/
void Display(unsigned int dat,unsigned char DotPosition,unsigned char ClearZeroFlag)
{
	unsigned char i;

	for(i = 0; i != 8; i++)
	{ 	
		if(i == DotPosition)/// 小数点处理
			{
			PortCode[i] = (displaycode[(dat%10)]&0x7f);
			}
		else
		PortCode[i] = displaycode[dat%10];

		if(ClearZeroFlag&&(!dat)&&(i>DotPosition)) PortCode[i]=0xff;		

		dat /= 10;			

		
	}	
		sendbyte(PortCode[0]);			
		sendbyte(PortCode[1]);
		sendbyte(PortCode[2]);
		sendbyte(PortCode[3]);
		sendbyte(PortCode[4]);			  
		sendbyte(PortCode[5]);				   
		sendbyte(PortCode[6]);
		sendbyte(PortCode[7]);
		out595();
}
void sendbyte(unsigned int data)      //595 发送数据函数
{
    LOAD_595 =1;
	SSPBUF=data;			/*启动发送*/
	while(SSPIF==0);		/*等待发送完毕*/
	SSPIF=0;				/*清除SSPIF标志*/
}
void out595(void)           // 打开锁存,显示
{
        LOAD_595=0;
        asm("nop");
        LOAD_595=1;

}
/*********************************ADC转换***********************************************/
/*
void interrupt timer0_ADC_isr(void)
{
 // unsigned int ADC_Value;
  //unsigned char i;
  
  if(T0IF==1)//TMR0定时1mS时间到
    {
      T0IF=0;//清TMR0溢出标志位
      TMR0=256-4;//重新装入TMR0的定时1mS初值
      //共阴数码管动态显示扫描程序段
      PORTD=LEDDATA[LEDBuffer[ScanLEDCount]];
      PORTE=ScanLEDCount;
      ScanLEDCount++;
      if(ScanLEDCount==sizeof(LEDBuffer))ScanLEDCount=0;  
    }

  if(ADIF==1)//AD转换结束
    {
       ADIF=0;//清A/D转换结束标志
       ADC_Value=(unsigned int)ADRESH*256+ADRESL;//读取A/D转换的结果       
       ADGO=1;//启动A/D转换开始
    }    
}

*/

/***********************************************************************************/

/***********************************************************************************/

void spiintial(void)   //spi初始化
	{  
	   SSPCON=0x32;  //主控方式,空闲时时钟为高电平,时钟为:Fosc/4
	   SSPSTAT=0xc0; //SCK上升沿数据传送。
	   TRISC3=0;     //SCK时钟输出引脚。
	   TRISC0=0;     //输出锁存器控制脉冲(595-12)
	   TRISC5=0;     //串行数据输出引脚。
	   //INTCON= 0x80;//   GIE=1,开总中断,595显示不用开中断
	}


void adcintial(void)  //ad初始化
	{
    
  ADCS1=1;//设置ADC的时钟为fosc/32
  ADCS0=0;
  CHS2=0;//选择A/D转换的通道0
  CHS1=0;
  CHS0=0;
  //ADCON1: ADFM - - - PCFG3 PCFG2 PCFG1 PCFG0  
  ADFM=1;//转换的数据格式为右对齐
  PCFG3=0;//设置AN0-AN5为模拟输入端,RE0(AN5)-RE2(AN7)为数字IO,VREF+=VDD,VREF-=VSS
  PCFG2=0;
  PCFG1=1;
  PCFG0=0; 
/*
  TMR0=256-4;//定时1mS的初值装入TMR0
  T0CS=0;
  PSA=0;  ///分频器
  T0IF=0;//清TMR0溢出标志
  T0IE=1;//允许TMR0溢出中断
*/
  ADIF=0;//清A/D转换结束标志
  ADIE=1;//允许A/D转换中断
  PEIE=1;//启动中断的第二梯队
  //GIE=1;//CPU开中断
  
//  ADON=1;//启动A/D工作
 // ADGO=1;//A/D转换开始
	   
	}




/*****************************************************************************************************
                                             主函数
****************************************************************************************************/
void main()
{  
    spiintial(); //SPI初始化
    adcintial(); //ad初始化
  PEIE=1;//启动中断的第二梯队
  GIE=1;//CPU开中断
  ADON=1;//启动A/D工作
  ADGO=1;//A/D转换开始
    while(1)							  
    { 
	  if(ADIF==1)//AD转换结束
	    {
	       ADIF=0;//清A/D转换结束标志
	       ADC_Value=(unsigned int)ADRESH*256+ADRESL;//读取A/D转换的结果       
	       ADGO=1;//启动A/D转换开始
	    } 
       a++;
   	Display(a,3,0);
   delay_nms(50);	
    }    
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -