📄 ht1632.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 + -