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

📄 ht1632.c

📁 HT1632 LED 驱动程式
💻 C
字号:
#include <p18f452.h>
#include "Ram.h"
#include <timers.h>
void F_LEDScan(void);
void F_HT1632Init(void);
void F_SetAllLED(unsigned char data);
void F_SendHTCMD(unsigned char  cmdbyte,unsigned char  sendbits);
void F_CLEARLED(void);
void F_LED_Start(void);
void F_SystemInit(void);
void InterruptHandlerHigh (void);
void F_detectI(void);

//HT1632前導碼
#define C_16_READ      0xc0		//%11000000
#define C_16_WRITE     0xa0		//%10100000
#define C_16_CMD       0x80		//%10000000
//HT1632編碼
#define C_16_SYSDIS     0x00		//%00000000       //; Turn off LED bias generator
#define C_16_SYSEN      0x01		//%00000001       //; Turn on LED oscillator
#define C_16_LCDOFF     0x02		//%00000010       //; Turn off LED
#define C_16_LCDON      0x03		//%00000011       //; Turn on LED
#define C_16_PWM         0xad          //%10101101        //; SET PWM
#define C_16_CACLK       0x14         //%00010100        //; SET CASCADE CLK
#define C_16_EXTCLK     0x1c         //%00011100        //; SET EXT CLK
#define C_16_WDTDIS     0x05		//%00000101       //; Disable WDT time-out flag output
#define C_16_TIMEREN    0x06		//%00000110       //; Enable time base output
#define C_16_WDTEN      0x07		//%00000111       //; Enable WDT time-out flag output
#define C_16_TONEOFF   0x08	         // %00001000       //; Turn off tone output
#define C_16_CLRTIMER  0x0d   //%00001101 //Clear the contents of the time base generator
#define C_16_CLRWDT     0x0f	//%00001111       //; Clear the contents of WDT stage
#define C_16_RC32K      0x18	//%00011000  //System clock source, on chip RC oscillator
#define C_16_TONE4K     0x40	//%01000000       //; Tone frequency output:4KHz
#define C_16_TONE2K     0x60	//%01100000       //; Tone frequency output:2KHz
#define C_16_IRQDIS     0x80	//%10000000       //; Disable IRQ output
#define C_16_IRQEN      0x88	//%10001000       //; Enable IRQ output
#define C_16_FCOM         0x20
#define C_16_NORMAL     0xe3	//%11100011       //; Normal Mode
unsigned char PWM=0,Beep=0;	
unsigned char count=0;
unsigned char flag=1;
void main(void)
{ F_SystemInit();
  F_HT1632Init();  	
  F_SetAllLED(0xff);  
  F_CLEARLED(); 
  CCPR1L=PWM;
  CCP1CON=0X0c;             //设置CCP1模块为PWM工作方式,且其工作,循环的低2位为11,高8位为00011111=1F    
  T2CON=0X1f;				//*打开TMR2,且使其前分频为16,同时开始输出PWM波形		    				
  PR2=249;					///*设置PWM的工作周期    2KHz  
  //ADCON0bits.GO=1;
   //Display.LEDBuffer0[0]=0xfc;//0
   //Display.LEDBuffer0[1]=0x60;//1
   Display.LEDBuffer0[2]=0xfc;//0
   //Display.LEDBuffer0[3]=0xf2;//3
   //Display.LEDBuffer0[4]=0x66;//4
   //Display.LEDBuffer0[5]=0xb6;//5
   Display.LEDBuffer0[6]=0xfc;//0
   //Display.LEDBuffer0[7]=0xe0;//7
   //Display.LEDBuffer0[8]=0xfe;//8
   //Display.LEDBuffer0[9]=0xf6;//9
   Display.LEDBuffer0[10]=0xfc;
   //Display.LEDBuffer0[11]=0x60;
   //Display.LEDBuffer0[12]=0xda;
   //Display.LEDBuffer0[13]=0xf2;
   Display.LEDBuffer0[14]=0xfc;
   Display.LEDBuffer0[15]=0x00;
  for(;;)
  {
   if(if_100ms==1)//每100毫秒读一次AD,10次求平均值再显示
	  {
	   if_100ms=0;
	   F_detectI();			  
	 }		 
  }
 }
void F_SystemInit(void)                            //初始化
{   
	INTCONbits.GIEH = 0;
	TRISA=0x1f;
	TRISB=0xf0;
	TRISC=0x03;
	TRISD=0xff;
	TRISE=0b00000100;
	PORTA=0x20;
	PORTB=0x00;
	PORTC=0x00;
	PORTD=0x00;
	PORTE=0x00;
	ADCON0=0x8d;  //0b10001101  ;Fosc/64,channel 1( AN1);
    ADCON1=0xc4;  //0b11000100   ;;0100:AN0,AN1,AN3=Analog input,Vref+=VDD,Vref-=VSS,	ADFM=1
  	//-------------------------  Interrupt initial  ----------------------        
    OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_1);   
    INTCONbits.GIEH = 1;
}
#pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh (void)
{   _asm
    goto InterruptHandlerHigh    //jump to interrupt routine
   _endasm
}
#pragma code	// end 
// High priority interrupt routine
#pragma interrupt InterruptHandlerHigh
void InterruptHandlerHigh (void)
{
if (INTCONbits.TMR0IF)//check for TMR0 overflow
	 {INTCONbits.TMR0IF = 0; 			//clear interrupt flag       
	  WriteTimer0(65535-1716);	 	 //8M OSC, 250u Sec  
	  F_LEDScan();  
	  incline.counter100ms++;
	 if(incline.counter100ms>=400)
	 	{
	 	 incline.counter100ms=0;
	 	 if_100ms=1;
	 	} 	 
   } 
}

// Module Name : F_SetAllLED
void F_SetAllLED(unsigned char data)
{
  unsigned char  i;	
 for(i=0;i<16;i++)	
   {
   Display.LEDBuffer0[i]=data;
   }
   b_beepon=1;
}	
void F_HT1632Init(void)
{
	C_16_CS=1;
	C_16_WT=1;
	C_16_DA=1;
	Nop(); 
// SYS DIS
  C_16_CS=0;
	F_SendHTCMD(C_16_CMD,3);
	F_SendHTCMD(C_16_SYSDIS,9);
	Nop();  
	C_16_CS=1;
	Nop();  
//P-MOS 8 COMMON
	C_16_CS=0;
	F_SendHTCMD(C_16_CMD,3);
	F_SendHTCMD(C_16_FCOM,9);
	Nop();  
	C_16_CS=1;
	Nop(); 
// Set PWM
  C_16_CS=0;
	F_SendHTCMD(C_16_CMD,3);
	F_SendHTCMD(C_16_PWM,9);
	Nop();  
	C_16_CS=1;
	Nop();  
//; Set RC Oscillator
	C_16_CS=0;
	F_SendHTCMD(C_16_CMD,3);
	F_SendHTCMD(C_16_RC32K,9);
	Nop();  
	C_16_CS=1;
	Nop();  
//; Turn on LED Oscillator
	C_16_CS=0;
	F_SendHTCMD(C_16_CMD,3);
	F_SendHTCMD(C_16_SYSEN,9);
	Nop();  
	C_16_CS=1;
	Nop(); 
//; LED ON
	C_16_CS=0;
	F_SendHTCMD(C_16_CMD,3);
	F_SendHTCMD(C_16_LCDON,9);
	Nop();  
	C_16_CS=1;
	Nop(); 
//; CLEAR All LED RAM FROM LED DIRVE
	C_16_CS=0;
	F_SendHTCMD(C_16_WRITE,3);
	Nop(); 
//	Display.LEDAddress=0;
	F_SendHTCMD(0,7);
	Nop();  
	C_16_CS=1;
	Nop(); 
//清空LED Driver Ram
	for(Display.LEDAddress=0;Display.LEDAddress<64;Display.LEDAddress++)
		F_SendHTCMD(0,4);
	Display.LEDAddress=0;
}
//Send Command to HT1632 / START CMD
void F_SendHTCMD(unsigned char cmdbyte,unsigned char sendbits) //x,y
{
	while(sendbits!=0)
	{
	C_16_WT=0;
	Nop();  
	if(cmdbyte&BIT7)
		{
		C_16_DA=1;
		}
	else
		{
		C_16_DA=0;
		}
	C_16_WT=1;
	Nop();  

	cmdbyte<<=1;
	sendbits--;
	}
}
//START bits
void F_LED_Start(void)
{
	C_16_CS=0;
	Nop();  
	Nop(); 
	C_16_WT=0;
	Nop();  
	C_16_DA=1; 	 // 1         
 	Nop();  
	C_16_WT=1;
	Nop();  
	C_16_WT=0;
	Nop();  
	C_16_DA=0;	// 0
	Nop();  
	C_16_WT=1;
	Nop();  
	C_16_WT=0;
	Nop();  
	C_16_DA=1;	// 1
	Nop(); 
	C_16_WT=1;
	Nop();  
	C_16_WT=0;
	Nop();  
}
//;;F_LEDScan();
void F_LEDScan(void)
{
	unsigned char Temp1,Temp2;
	F_LED_Start();
	Temp1=Display.LEDAddress<<1;//+Display.LEDAddress;
	Temp2=BIT6;
	while(Temp2!=0) 
	{
	if (Temp1&Temp2)
		{
		C_16_DA=1;	// 1
		Nop();  
		C_16_WT=1;
		Nop();  
		C_16_WT=0;
		Nop(); 
	  }
	else
		{
		C_16_DA=0;	// 0
		Nop();  
		C_16_WT=1;
		Nop(); 
		C_16_WT=0;
		Nop();  
		}
	Temp2>>=1;
	}
//--------- L_LEDScanData -----------
	Temp1=Display.LEDBuffer0[Display.LEDAddress];
        C_16_WT=0;
	Nop();  
	Temp2=BIT7;
	while(Temp2!=0)
	{
	if (Temp1&Temp2)
		{
		C_16_DA=1;	// 1
		Nop();  
		C_16_WT=1;
		Nop();  
		C_16_WT=0;
		Nop();  
		}
	else
		{
		C_16_DA=0;	// 0
		Nop();  
		C_16_WT=1;
		Nop();  
		C_16_WT=0;
		Nop();  
		}
	Temp2>>=1;
	}
	C_16_CS=1;
	Nop();  
	C_16_WT=1;  
	Display.LEDAddress++;
	if(Display.LEDAddress>=16)
		Display.LEDAddress=0;
}
void F_CLEARLED(void)
{unsigned char i;
  for(i=0;i<=15;i++)
  	Display.LEDBuffer0[i]=0;
}

void F_detectI(void)//电流检测程式
{
 unsigned int Temp1;
  unsigned char Temp2;    
	   if(ADCON0bits.GO==0)
	   	{ Temp1=ADRESH;		   	 	  
		  Temp2=ADRESL;	  			   
		  dianliutemp+=Temp1*256+Temp2;
		  DLcounter++;
		  if(DLcounter==10)
			{
			DLcounter=0;
			count++;
			if(count<=1)
			{
              dianliutemp=0;
			}
			if(count>1&&flag==1)
			{
			 count=3;
			 flag=0;
			}
			if(!flag)
			{
			dianliutemp=dianliutemp/10;	        		
			DATADL=1000*dianliutemp/1023;
		    Display.DLBuffer[3]=DATADL/1000;
		    Display.DLBuffer[2]=DATADL%1000/100;
		    Display.DLBuffer[1]=DATADL%100/10;
		    Display.DLBuffer[0]=DATADL%10;		
		    Display.LEDBuffer0[7]=code_bin[Display.DLBuffer[3]];		
	        Display.LEDBuffer0[8]=code_bin[Display.DLBuffer[2]];
		    Display.LEDBuffer0[9]=code_bin[Display.DLBuffer[1]];
		    Display.LEDBuffer0[10]=code_bin[Display.DLBuffer[0]];
		    }	
		    }	 
		  ADCON0bits.GO=1;
		}		
}		 

⌨️ 快捷键说明

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