📄 pic16f877.txt
字号:
#include<pic1687x.h>
#include<math.h>
#define CLRDOG asm("clrwdt")
#define TIME1_L 0x00
#define TIME1_H 0xff
#define ADDR 0x01
unsigned char bank3 word_model[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xce};
static unsigned char bank3 dispbuf[7];
static unsigned char bank3 receive_buf[11];
static unsigned char bank3 receive_counter=0;
static unsigned char bank3 dispcount=0;
static unsigned char bank3 return_data=0;
static bit bank3 key1_flag=0;
static bit bank3 key2_flag=0;
static bit bank3 key3_flag=0;
static bit bank3 key4_flag=0;
static unsigned char bank3 showcount=0;
void io_init();
void timer_init();
void key_handle();
unsigned char i2c_write( unsigned char i2cWriteData );
int i2c_read( unsigned char ack );
void i2c_stop();
void i2c_repStart();
void i2c_start();
void i2c_waitForIdle();
void i2c_init();
void write_ext_eeprom(unsigned char device, unsigned char address, unsigned char data);
unsigned char read_ext_eeprom(unsigned char device, unsigned char address);
void delayNms(unsigned char N);
void dispdata_handle(unsigned char sel,unsigned int ival,unsigned char dot);
//void write_INEErom(unsigned char addr,unsigned char data);
//unsigned char read_INEErom(unsigned char addr);
#pragma interrupt_level 1
unsigned char read_INEErom(unsigned char addr)
{
unsigned char data;
EEADR=addr;
EEPGD=0;
RD=1;
data=EEDATA;
return data;
}
//#pragma interrupt_level 1
void write_INEErom(unsigned char addr,unsigned char data)
{
// unsigned char i;
EEADR=addr;
EEDATA=data;
EEPGD=0;
WREN=1;
//EEPROM_WRITE(addr,data);
EECON2=0x55;
EECON2=0xaa;
WR=1;
WREN=0;
// while(WR==1);
}
void io_init()
{
/* init watchdog */
CLRDOG;
OPTION=0x0f;
TRISA=0x03;
PORTA=0xff;
TRISB=0x00;
PORTB=0xff;/*0xfe*/
TRISC=0xd8;
PORTC=0xff;/*0x0b*/
TRISD=0x1e;
PORTD=0xff;
TRISE=0x00;//its 4th bit can control portd
PORTE=0xff;
ADCON1=0x0d;
}
void serial_init()
{
SPBRG=0x19;
TXSTA=0x04;
RCSTA=0x80;
TRISC6=1;
TRISC7=1;
RC5=0;
RCIE=1;
//RCIF=0;
CREN=1;
receive_counter=0;
//TXIE=1;
//INTCON=0xc0;
}
void i2c_init()
{
TRISC3=1; // set SCL and SDA pins as inputs
TRISC4=1;
SSPCON = 0x38; // set I2C master mode
SSPCON2 = 0x00;
//file://SSPADD = 0x6; // 400kHz bus with 10MHz xtal - use 0x0C with 20MHz xtal
SSPADD = 10; // 100k at 4Mhz clock
STAT_CKE=1; // use I2C levels worked also with '0'
STAT_SMP=1; // disable slew rate control worked also with '0'
PSPIF=0; // clear SSPIF interrupt flag
BCLIF=0; // clear bus collision flag
}
void timer_init()
{
T1CON=1;
TMR1IF=0;
TMR1IE=1;
TMR1L=TIME1_L;
TMR1H=TIME1_H;
INTCON=0xc0;
}
void dispdata_handle(unsigned char sel,unsigned int ival,unsigned char dot)
{
unsigned int divd=100;
unsigned char i,bitdata;
switch(sel)
{
case 0:
{
for(i=0; i<3; i++)
{
bitdata=ival/divd;
ival=ival%divd;
dispbuf[i]=word_model[bitdata];
if(dot==i) dispbuf[i]+=0x01;
divd=divd/10;
}
}
break;
case 1:
{
for(i=3; i<6; i++)
{
bitdata=ival/divd;
ival=ival%divd;
dispbuf[i]=word_model[bitdata];
if(dot==(i-3)) dispbuf[i]+=0x01;
divd=divd/10;
}
}
break;
case 2:
dispbuf[6]=ival;
break;
}
}
#pragma interrupt_level 1
void interrupt t_1()
{
// unsigned char i;
if(RCIF==1)
{
GIE=0;
dispbuf[0]=word_model[0];
receive_buf[receive_counter]=RCREG;
receive_counter=receive_counter+1;
if(receive_counter>=10)
{
dispbuf[1]=word_model[1];
receive_counter=0;
if((receive_buf[0]==0xff)&&(receive_buf[1]==0xaa)
&&(receive_buf[10]=0x55)&&(receive_buf[2]=ADDR))
{
dispbuf[2]=word_model[2];
if(receive_buf[3]==2)
{
RC5=1;
TXEN=1;
delayNms(2);
dispbuf[3]=word_model[3];
TXREG=read_INEErom(0);
//0x12;
while(1)
{
if(TXIF==1) break;
}
delayNms(1);
dispbuf[4]=word_model[4];
RC5=0;
}
}
}
GIE=1;
}
else if(TMR1IF==1)
{
TMR1L=TIME1_L;
TMR1H=TIME1_H;
CLRDOG;
TMR1IF=0;
if(showcount>6)
showcount=0;
switch(showcount)
{
case 0:
RA5=1;
RE0=0;
RE1=0;
RE2=0;
RD7=0;
RD6=0;
RD5=0;
PORTB=dispbuf[0];
break;
case 1:
RA5=0;
RE0=1;
RE1=0;
RE2=0;
RD7=0;
RD6=0;
RD5=0;
PORTB=dispbuf[1];
break;
case 2:
RA5=0;
RE0=0;
RE1=1;
RE2=0;
RD7=0;
RD6=0;
RD5=0;
PORTB=dispbuf[2];
break;
case 3:
RA5=0;
RE0=0;
RE1=0;
RE2=1;
RD7=0;
RD6=0;
RD5=0;
PORTB=dispbuf[3];
break;
case 4:
RA5=0;
RE0=0;
RE1=0;
RE2=0;
RD7=1;
RD6=0;
RD5=0;
PORTB=dispbuf[4];
break;
case 5:
RA5=0;
RE0=0;
RE1=0;
RE2=0;
RD7=0;
RD6=1;
RD5=0;
PORTB=dispbuf[5];
break;
case 6:
RA5=0;
RE0=0;
RE1=0;
RE2=0;
RD7=0;
RD6=0;
RD5=1;
PORTB=dispbuf[6];
break;
}
showcount=showcount+1;
}
}
void delayNms(unsigned char N)
{
int i,j;
for(j=0;j<N;j++)
{
for(i=0;i<1000;i++) continue;
}
}
//#pragma interrupt_level 1
void key_handle()
{
if(key1_flag==1)
{
if(RD4==1)
{
/* dispcount=dispcount+1;
if(dispcount>9)
dispcount=0;
write_ext_eeprom(0xa2,dispcount,dispcount+2); // it to eeprom
delayNms(1);
return_data=read_ext_eeprom(0xa2,dispcount);
PORTB=word_model[return_data];
*/
write_INEErom(0,9);
dispbuf[0]=word_model[1];
key1_flag=0;
}
}
else
{
if(RD4==0)
{
key1_flag=1;
}
}
/**************************/
if(key2_flag==1)
{
if(RD3==1)
{
unsigned char data=0;
data=read_INEErom(0);
dispbuf[0]=word_model[data];
key2_flag=0;
}
}
else
{
if(RD3==0)
{
key2_flag=1;
}
}
/*****************************/
if(key3_flag==1)
{
if(RD2==1)
{
dispbuf[2]=word_model[3];
key3_flag=0;
}
}
else
{
if(RD2==0)
{
key3_flag=1;
}
}
/*****************************/
if(key4_flag==1)
{
if(RD1==1)
{
dispbuf[3]=word_model[4];
key4_flag=0;
}
}
else
{
if(RD1==0)
{
key4_flag=1;
}
}
}
/******************************************************************************************/
void i2c_waitForIdle()
{
while (( SSPCON2 & 0x1F ) | STAT_RW ) {}; // wait for idle and not writing
}
/******************************************************************************************/
void i2c_start()
{
i2c_waitForIdle();
SEN=1;
}
/******************************************************************************************/
void i2c_repStart()
{
i2c_waitForIdle();
RSEN=1;
}
/******************************************************************************************/
void i2c_stop()
{
i2c_waitForIdle();
PEN=1;
}
/******************************************************************************************/
int i2c_read( unsigned char ack )
{
unsigned char i2cReadData;
i2c_waitForIdle();
RCEN=1;
i2c_waitForIdle();
i2cReadData = SSPBUF;
i2c_waitForIdle();
if ( ack )
{
ACKDT=0;
}
else
{
ACKDT=1;
}
ACKEN=1; // send acknowledge sequence
return( i2cReadData );
}
/******************************************************************************************/
unsigned char i2c_write( unsigned char i2cWriteData )
{
i2c_waitForIdle();
SSPBUF = i2cWriteData;
return ( ! ACKSTAT ); // function returns '1' if transmission is acknowledged
}
//下面是读写函数:
void write_ext_eeprom(unsigned char device, unsigned char address, unsigned char data)
{
unsigned char flag;
while(1)
{
i2c_start();
flag=i2c_write(device);
if (flag) break; //判定是否在写EEPROM
i2c_stop();
}
i2c_write(address);
i2c_write(data);
i2c_stop();
//DelayMs(5); //等待写EEPROM
}
/******************************************************************************************/
unsigned char read_ext_eeprom(unsigned char device, unsigned char address)
{
unsigned char data;
unsigned char flag;
while(1)
{
i2c_start();
flag=i2c_write(device);
if (flag) break; //判定是否在写EEPROM
i2c_stop();
}
i2c_write(address);
i2c_repStart();
i2c_write(device+1);
data=i2c_read(0);
i2c_stop();
return(data);
}
void main()
{
unsigned char i;
for(i=0;i<6;i++)
{
dispbuf[i]=0xce;
}
CLRDOG;
io_init();
i2c_init();
timer_init();
serial_init();
while(1)
{
key_handle();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -