📄 harve.c
字号:
#include "harve.h"
#byte STATUS=0x03
#bit C=STATUS.0
#byte SPBRG=0x99
#byte TXSTA=0x98
#byte RCSTA=0x18
#byte TXREG=0x19
#byte RCREG=0x1A
#bit RX9 =RCSTA.6
#bit CREN=RCSTA.4
#bit FERR=RCSTA.2
#bit RX9D=RCSTA.0
#bit OERR=RCSTA.1
#bit SPEN=RCSTA.7
#bit CSRC=TXSTA.7
#bit TXEN=TXSTA.5
#bit SYNC=TXSTA.4
#bit BRGH=TXSTA.2
#bit TRMT=TXSTA.1
#bit TX9 =TXSTA.6 //for serial
#byte PIR1=0x0C
#bit RCIF=PIR1.5
#bit TXIF=PIR1.4
#byte TRISA=0x85
#byte TRISB=0x86
#byte TRISC=0x87
#byte POTA=0x05
#byte POTB=0x06
#byte POTC=0x07
//#byte POTD=0x08
//#byte POTE=0x09 //define port
#byte INTCON=0x0B
#byte OPTION=0x81
#byte PIE1 =0x8C
#byte PIR1 =0x0C
#byte TMR1L = 0x0e
#byte TMR1H = 0x0f
#byte T1CON = 0x10
#byte TMR0 = 0x01
#bit TMR1ON=T1CON.0
#bit TMR1IF=PIR1.0
#bit T0IF=INTCON.2 //use for time
#bit LinEN=POTA.0
#bit testbit1=POTA.1
#bit testbit2=POTA.2
#bit testbit3=POTA.3
#bit testbit4=POTA.4
#bit testbit5=POTA.5
#bit A1=POTC.0
#bit A2=POTC.1
#bit A3=POTC.2
#bit A4=POTC.3
#bit A5=POTC.4
#bit CAR1=POTC.5
#bit TXD=POTC.6
#bit RXD=POTC.7
//#bit P02=POTC.1
//#bit P03=POTC.2
//#bit P07=POTC.3
#bit P00=POTC.2
#bit P01=POTC.4
#bit P02=POTC.3
#bit red=POTA.2
//HT1621控制位(液晶模块接口定义)
#bit HT1621_DAT=POTB.2
#bit HT1621_CS=POTB.5 //lower enable
#bit HT1621_WR=POTB.3 //rising edge
#bit LED=POTB.0 //LED
#define BIAS 0x52 //0b1000 0101 0010 1/3duty 4com
#define BIAS2 0x50 //0b1000 0101 0000 1/2duty 4com
#define SYSDIS 0x00 //0b1000 0000 0000 关振系统荡器和LCD偏压发生器
#define LCDOFF 0x04 //0b1000 0000 0100 关LCD偏压
#define LCDON 0x06 //0b1000 0000 0110 打开LCD偏压
#define SYSEN 0x02 //0b1000 0000 0010 打开系统振荡器
#define XTAL 0x28 //0b1000 0010 1000 外部接时钟
#define RC256 0x30 //0b1000 0011 0000 内部时钟
#define TONEON 0x12 //0b1000 0001 0010 打开声音输出
#define TONEOFF 0x10 //0b1000 0001 0000 关闭声音输出
#define WDTDIS 0x0A //0b1000 0000 1010 禁止看门狗
unsigned char show[6]=0x00,0x00,0x00,0x00,0x00,0x00;
unsigned char data[11]=0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00;
unsigned char sound[8]=0x0E,0x36,0x4E,0x76,0x8E,0xB6,0xCE,0xF6;
unsigned char getdatatimeout=0;
unsigned char olddata=9;
unsigned char new_rx_data=0xFF;
#use fixed_io(a_outputs=PIN_A0,PIN_A1,PIN_A2,PIN_A3,PIN_A4,PIN_A5)
#use fixed_io(b_outputs=PIN_B0,PIN_B2,PIN_B3,PIN_B4,PIN_B5,PIN_B6,PIN_B7)
//#use fixed_io(c_outputs=PIN_C0,PIN_C2,PIN_C3,PIN_C4,PIN_C5) //harve070314
#use fixed_io(c_outputs=PIN_C0,PIN_C2,PIN_C3,PIN_C5)
void show0(void);
void show1(void);
void show2(void);
void show3(void);
void show4(void);
void getdata(void);
void RTError(void);
void getword(void);
void getbit(unsigned char i);
void intlzation(void);
void Ht1621WrByte(unsigned char ucTmpData);
void Ht1621WrDataCmd(unsigned char ucAddr);
void Ht1621WrCmd(unsigned char ucTmpCmd);
void soundout(void);
void main()
{
unsigned char i,j,now;
//sleep();
output_a(0x00);
output_b(0x00);
output_c(0x00);
P02=1;
intlzation();
LED=1;
while(1)
{
TMR1H=10;
TMR1L=0;
TMR1ON=1;
TMR1IF=0;
i++;
//if (i%15==0)
{
HT1621_CS=0;
Ht1621WrDataCmd(0);
for(j=0;j<6;j++)
{
if(getdatatimeout<70)
Ht1621WrByte(show[j]);
else
Ht1621WrByte(0x00);
}
HT1621_CS=1;
}
getdata();
soundout();
while(TMR1H<0x80);
i++;
}
}
/////////////////////////
// get-data //
/////////////////////////
void getdata(void)
{
unsigned char i,sum,ErrorData;
int1 flag;
TXREG=0x00; //out put 00H
delay_us(250);
delay_us(250);
TXREG=0x55; //out put 55H
sum=RCREG;
delay_us(250);
delay_us(250);
TXREG=0x47;//0x47;//0100-0111 //out put ID
while(!TRMT);
delay_cycles(4);
CREN=1; //open recive
for(i=0;i<9;i++) //修改后
//for(i=0;i<8;i++)
{
TMR0=0;
delay_cycles(20);
RTError();
if(OERR)
RTError();
while(!RCIF&&TMR0<60);
// {
// flag=RCIF;
// }
if(RCIF)
{
sum=RCREG;
data[i]=sum;
}
new_rx_data=data[7];
}
CREN=0; //get 6 bite data from serial
sum=0x47;
sum+=data[0];
if(C)
sum++;
sum+=data[1];
if(C)
sum++;
sum+=data[2];
if(C)
sum++;
sum+=data[3];
if(C)
sum++;
sum+=data[4];
if(C)
sum++;
sum+=data[5];
if(C)
sum++;
sum+=data[7];
if(C)
sum++;
sum+=data[6];
if(C)
sum++;
//caculate
if(data[8]==(0xFF^sum))
{
for(i=0;i<6;i++)
show[i]=data[i]; //if no bite bad agree it
// new_rx_data=data[7];
getdatatimeout=0;
}
else
{
if(getdatatimeout<200)
getdatatimeout++;
// delay_us(20);
}
//delay_us(300);
TXREG=0x02;
}
///////////////////////////
// RTError //
///////////////////////////
void RTError(void)
{
unsigned char ErrorData;
if(OERR)
{
ErrorData=RCREG;
ErrorData=RCREG;
CREN=0;
delay_cycles(3);
CREN=1;
}
if(FERR)
{
C=RX9D;
ErrorData=RCREG;
}
}
///////////////////////////
// intlzation //
///////////////////////////
void intlzation(void)
{
POTC=0xFF;
POTB=0x00;
delay_ms(50);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_counters(RTCC_INTERNAL,RTCC_DIV_32);//2.5ms=156.25 time0
setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);
setup_timer_2(T2_DISABLED,0,1);
//TRISB=0x00;
//LinEN=1;
INTCON=0x00;
PIE1 =0x00;
CREN=0;
SPBRG=25;
SYNC=0;
SPEN=1;
TX9 =0;
TXEN=1;
BRGH=1;
RX9 =0; //for sireal
HT1621_CS=1;
HT1621_WR=0;
HT1621_DAT=1;
delay_ms(100); //延时使LCD工作电压稳定
Ht1621WrCmd(BIAS);
// Ht1621WrCmd(BIAS2);
Ht1621WrCmd(RC256); //使用内部振荡器
Ht1621WrCmd(SYSDIS);
Ht1621WrCmd(WDTDIS);
Ht1621WrCmd(SYSEN);
Ht1621WrCmd(LCDON);
}
///////////////////////////
// A command //
///////////////////////////
void Ht1621WrCmd(unsigned char ucTmpCmd)
{
unsigned char i,ucCmdByte=0x80;
HT1621_CS=0;
delay_cycles(8);
for (i=0;i<4;i++)
{
if (ucCmdByte&0x80)
HT1621_DAT=1;
else
HT1621_DAT=0;
HT1621_WR=0;
delay_cycles(8);
HT1621_WR=1;
delay_cycles(4);
ucCmdByte<<=1;
}
for (i=0;i<8;i++)
{
if (ucTmpCmd&0x80) HT1621_DAT=1;
else HT1621_DAT=0;
HT1621_WR=0;
delay_cycles(8);
HT1621_WR=1;
delay_cycles(4);
ucTmpCmd<<=1;
}
HT1621_CS=1;
delay_cycles(8);
}
///////////////////////////
// adder //
///////////////////////////
void Ht1621WrDataCmd(unsigned char ucAddr)
{
unsigned char i,ucDataCmd=0x05; //101
ucDataCmd<<=5;
for (i=0;i<3;i++)
{
if (ucDataCmd&0x80) HT1621_DAT=1;
else HT1621_DAT=0;
HT1621_WR=0;
delay_cycles(8);
HT1621_WR=1;
delay_cycles(4);
ucDataCmd<<=1;
}
ucAddr<<=2;
for (i=0;i<6;i++)
{
if (ucAddr&0x80) HT1621_DAT=1;
else HT1621_DAT=0;
HT1621_WR=0;
delay_cycles(8);
HT1621_WR=1;
delay_cycles(4);
ucAddr<<=1;
}
}
///////////////////////////
// write a word //
///////////////////////////
void Ht1621WrByte(unsigned char ucTmpData)
{
unsigned char i;
for (i=0;i<8;i++)
{
if (ucTmpData&0x80)
HT1621_DAT=1;
else
HT1621_DAT=0;
HT1621_WR=0;
delay_cycles(8);
HT1621_WR=1;
delay_cycles(4);
if (i<4)
ucTmpData<<=1;
}
for (i=0;i<8;i++)
{
if (ucTmpData&0x80)
HT1621_DAT=1;
else
HT1621_DAT=0;
HT1621_WR=0;
delay_cycles(8);
HT1621_WR=1;
delay_cycles(4);
ucTmpData<<=1;
}
}
void soundout(void)
{
unsigned char sound_code,i,sounddata;
sounddata=new_rx_data;
// TMR1ON=0;
if(sounddata<170)
{//red=!red;
if(sounddata<40)
sound_code=0xCE;
else if(sounddata<=50)
sound_code=0x4E;
else if(sounddata<=70)
sound_code=0x8E;
else if(sounddata<=90)
sound_code=0x0E;
else if(sounddata<=110)
sound_code=0xF6;
else if(sounddata<=130)
sound_code=0x76;
else if(sounddata<=150)
sound_code=0xB6;
else //if(sounddata<=170)
sound_code=0x36;
if(((sound_code!=olddata)||(sound_code==0xCE))&&(!P01))
{
olddata=sound_code;
// if((sounddata<160)&&(!P01)){
// olddata=sound_code;
// if(!P01)
// {
P00=0;
delay_ms(16);
for(i=8;i>0;i--)
{
//sounddata=sounddata<<1;
#asm
RRF sound_code,f
#endasm
if(C)
{
P00=1;delay_ms(1);
P00=0;delay_us(250);delay_us(250);
}
else
{
P00=1;delay_us(250);delay_us(250);
P00=0;delay_ms(1);
}
}
P00=1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -