📄 main.c
字号:
#include "C8051F020.h"
#include "absacc.h"
#include "string.h"
#include "stdlib.h"
#include "stdio.h"
#include "setjmp.h"
#include "intrins.h"
#include "define.h"
#include "Hzcode.h"
#include "ZiTi.h"
#include "Init.c"
#include "Edit.c"
#include "ADC.c"
#include "DAC.c"
#include "SPI.c"
#include "I2C.c"
#include "Uart.c"
#include "Timer.c"
//#define SYSCLK 22118400L // System clock frequency in Hz
#define SMB_FREQUENCY 10000L // Target SCL clock rate
// This example supports between 10kHz
// and 100kHz
#define WRITE 0x00 // WRITE direction bit
#define READ 0x01 // READ direction bit
// Device addresses (7 bits, lsb is a don't care)
#define SLAVE_ADDR 0x64 // Device address for slave target
#define MY_ADDR 0x02 // Address of this SMBus device
// (dummy value since this device does
// not have any defined slave states)
#define SMB_BUS_ERROR 0x00 // (all modes) BUS ERROR
#define SMB_START 0x08 // (MT & MR) START transmitted
#define SMB_RP_START 0x10 // (MT & MR) repeated START
#define SMB_MTADDACK 0x18 // (MT) Slave address + W transmitted;
// ACK received
#define SMB_MTADDNACK 0x20 // (MT) Slave address + W transmitted;
// NACK received
#define SMB_MTDBACK 0x28 // (MT) data byte transmitted;
// ACK rec'vd
#define SMB_MTDBNACK 0x30 // (MT) data byte transmitted;
// NACK rec'vd
#define SMB_MTARBLOST 0x38 // (MT) arbitration lost
#define SMB_MRADDACK 0x40 // (MR) Slave address + R transmitted;
// ACK received
#define SMB_MRADDNACK 0x48 // (MR) Slave address + R transmitted;
// NACK received
#define SMB_MRDBACK 0x50 // (MR) data byte rec'vd;
// ACK transmitted
#define SMB_MRDBNACK 0x58 // (MR) data byte rec'vd;
// NACK transmitted
sbit SDA = P0^0; // SMBus on P0.0
sbit SCL = P0^1; // and P0.1
unsigned char SMB_DATA_IN; // Global holder for SMBus data
// All receive data is written here
unsigned char SMB_DATA_OUT; // Global holder for SMBus data.
// All transmit data is read from here
unsigned char TARGET; // Target SMBus slave address
bit SMB_BUSY; // Software flag to indicate when the
// SMB_Read() or SMB_Write() functions
// have claimed the SMBus
bit SMB_RW; // Software flag to indicate the
// direction of the current transfer
unsigned long NUM_ERRORS; // Counter for the number of errors.
//-----------------------------------------------------------------------------
// SMBus_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// The SMBus peripheral is configured as follows:
// - SMBus enabled
// - Assert Acknowledge low (AA bit = 1b)
// - Free and SCL low timeout detection enabled
//
void SMBus_Init (void)
{
SMB0CN = 0x07; // Assert Acknowledge low (AA bit = 1b);
// Enable SMBus Free timeout detect;
// Enable SCL low timeout detect
// SMBus clock rate (derived approximation from the Tlow and Thigh equations
// in the SMB0CR register description)
SMB0CR = 257 - (SYSCLK / (2 * SMB_FREQUENCY));
//SMB0ADR = MY_ADDR; // Set own slave address.
SMB0CN |= 0x40; // Enable SMBus;
}
void I2CStart()
{
STA = 1;
}
void WaitAck()
{
byte ch,i=5;
while(i--)
{
ch = SMB0STA;
if(ch == SMB_MTADDACK)
break;
}
}
void I2CSendByte(byte Dat)
{
byte ch;
while(1)
{
ch = SMB0STA;
if(ch == SMB_START)
break;
}
STA = 0;
SMB0DAT = Dat;
//SMB_BUSY = 1;
while (SMB_BUSY);
}
void I2CStop()
{
STO = 1;
}
void SendNotAck()
{
AA = 0;
}
void SendAck()
{
AA = 1;
}
byte I2CReceiveByte()
{
byte Dat;
Dat = SMB0DAT;
SMB_BUSY = 0;
return Dat;
}
uchar Clock(uchar opt, uchar tm, uchar val)
{
uchar buf[8];
switch(opt)
{
case TIME_INIT:
Ds1307(RD_OPT, 0, 8, buf);
buf[0] &= 0x7f;
buf[2] &= 0x3f;
buf[7] = 0;
Ds1307(WR_OPT, 0, 8, buf);
break;
case WR_OPT:
Ds1307(WR_OPT, tm, 1, &val);
break;
default:
;
}
return 0;
}
void Ds1307(opt, uchar word_addr, uchar num, uchar *buf)
{
uchar i;
uchar device_addr;
switch(opt)
{
case WR_OPT:
device_addr = 0x64;
I2CStart();
I2CSendByte(device_addr);
WaitAck();
I2CSendByte(word_addr);
WaitAck();
for (i = 0; i < num; i++)
{
I2CSendByte(buf[i]);
WaitAck();
}
I2CStop();
break;
case RD_OPT:
//set the begin address
device_addr = 0x64;
I2CStart();
I2CSendByte(device_addr);
WaitAck();
I2CSendByte(word_addr);
WaitAck();
I2CStop();
device_addr = 0x65;
I2CStart();
I2CSendByte(device_addr);
WaitAck();
for (i = 0; i < num; i++)
{
buf[i] = I2CReceiveByte();
if (i != num - 1)
SendAck();//除最后一个字节外,其他都要从MASTER发应答。
}
SendNotAck();
I2CStop();
break;
}
}
byte hexbcd(uchar kir)
{
byte ch;
ch=kir/0x10;
ch=ch*10+kir%0x10;
return ch;
}
void GetTime(void)
{
uchar ch;
uchar i;
byte xdata buff[8];
uchar xdata a[6] = {0, 1, 2, 4, 5, 6};
uchar xdata b[6] = {17, 14, 11, 8, 5, 2};
Ds1307(RD_OPT, 0, 8, buff);
for (i = 0; i < 6; i++)
{
time_hexbuff[i] = buff[a[i]];
time_buff[i]=hexbcd(buff[a[i]]);
ch = time_buff[i];
str_time[b[i]] = ch /10;
str_time[b[i] + 1] = ch % 10;
}
str_time[1]=0;
str_time[0]=2;
}
/*******SPI0*************/
void Timer0_us(byte n)
{
byte i,j;
for(i=0;i<n;i++)
{
for(j=0;j<100;j++);
}
}
void SPI0_Init (void)
{
SPI0CFG = 0x07; // data sampled on 1st SCK rising edge
// 8-bit data words
SPI0CN = 0x03; // Master mode; SPI enabled; flags
// cleared
SPI0CKR = SYSCLK/2/2000000; // SPI clock <= 2MHz (limited by
// EEPROM spec.)
//EIE1 |= 0x01;
SPI_WP = 1;
SPI_HOLD = 1;
CS25 = 1;
}
/*
BYTE CheckSPIF()
{
uint Cnt=0;
while(1)
{
Cnt++;
if(SPIF)
{
SPIF = 0;
return 1;
}
if(Cnt>10000)
return 0;
}
}
*/
/*
BYTE SPI_WRITE_CMD(BYTE CMD)
{
CS25 = 0;
SPIF = 0;
SPI0DAT = CMD;
while (SPIF == 0);
CS25 = 1;
return 1;
}
BYTE SPI_WRITE_STA(BYTE STA)
{
CS25 = 0;
SPIF = 0;
SPI0DAT = SPI_WRITE_STA_REG;
while (SPIF == 0);
SPIF = 0;
SPI0DAT = STA;
while (SPIF == 0);
CS25 = 1;
return 1;
}
BYTE SPI_READ_STA(BYTE *STA)
{
CS25 = 0;
SPIF = 0;
SPI0DAT = SPI_READ_STA_REG;
while (SPIF == 0);
SPIF = 0 ;
SPI0DAT = 5;
while (SPIF == 0);
STA[0] = SPI0DAT ;
CS25 = 1;
return 1;
}
BYTE SPI_Write_Pro(byte *addr,byte *buf,byte len)
{
uint i;
byte ret;
SPI_WRITE_CMD(0x06);
Timer0_us(1);
// SPI_WRITE_STA(0xff);
SPI_READ_STA(&ret);
CS25 = 0;
SPIF = 0;
Timer0_us(1);
SPI0DAT = 2;
while (SPIF == 0);
for(i=0;i<3;i++)
{
SPIF = 0;
SPI0DAT = 0;//addr[i];
while (SPIF == 0);
}
Timer0_us(1);
for(i=0;i<256;i++)
{
SPIF = 0;
SPI0DAT = 255-i;//buf[i];
while (SPIF == 0);
}
while(1)
{
SPI_READ_STA(&i);
if((i&0xfe)==0)
break;
}
Timer0_us(1);
CS25 = 1;
SPI_WRITE_CMD(0x04);
return 1;
}
*/
/*
BYTE CheckBusy()
{
uint Cnt=0;
while(1)
{
Cnt++;
if(!BUSY)
{
SPIF = 0;
return 1;
}
if(Cnt>10000)
return 0;
}
}
*/
byte abc;
byte xdata buf[256] = {1,2};
byte xdata RecBuf[256] = {0};
BYTE SPI_Read_Pro(byte *addr,byte *buf,byte len)
{
byte i,ch;
CS25 = 0;
SPIF = 0;
Timer0_us(1);
SPI0DAT = 0x03;
while (SPIF == 0);
for(i=0;i<3;i++)
{
SPIF = 0;
SPI0DAT = 0;//addr[i];
while (SPIF == 0);
}
for(i=0;i<len;i++)
{
RecBuf[i]=0x55;
SPIF = 0;
SPI0DAT = 0;
while (SPIF == 0);
abc = SPI0DAT;
RecBuf[i] = abc;
//Timer0_us(1);
//dis_int_numXX(0,2,0,RecBuf[i]);
}
CS25 = 1;
Timer0_us(1);
return 1;
}
///////////////////////////
byte initSpi()
{
byte ret;
SPI_WRITE_CMD(SPI_WRITE_ENABLE);
SPI_WRITE_STA(0x80);
SPI_READ_STA(&ret);
return ret;
}
/*BYTE SPI_TEST_PRO()
{
byte ret;
byte addr[3]={0,0,0};
//
// ret = SPI_WRITE_CMD(SPI_WRITE_ENABLE);
// if(!ret)
// return 0;
// SPI_READ_STA(&ret);
// ret = SPI_WRITE_CMD(SPI_WRITE_DISABLE);
// if(!ret)
// return 0;
// SPI_READ_STA(&ret);
// ret = SPI_WRITE_CMD(SPI_WRITE_ENABLE);
// if(!ret)
// return 0;
// SPI_READ_STA(&ret);
ret = SPI_Write_Pro(addr,buf,256);
if(!ret)
return 0;
ret = SPI_Read_Pro(addr,RecBuf,255);
if(!ret)
return 0;
dis_int_numXX(0,2,0,RecBuf[0]) ;
dis_int_numXX(0,4,0,RecBuf[1]) ;
return ret;
}
*/
byte cnt=0;
void SPI0_ISR (void) interrupt 6
{
SPIF = 0;
if(hh==0)
datasoi[cnt++] = SPI0DAT;
else
hh=0;
}
uint xdata ADC0OutVal=0;
void ProTime_10ms()
{
CHAN = 1;
ADC_Start(CHAN);
adcbufCnt++;
if(adcbufCnt>12)
adcbufCnt =0;
ADC0OutVal = 4000;
DAC0Out(ADC0OutVal);
//dis_int_numXX(0,0,0,ADC0OutVal);
ADC0OutVal++;
if(ADC0OutVal>4095)
ADC0OutVal = 0;
}
void ProTime_100ms()
{
uint i;
byte ch;
unsigned long Dat;
for(ch=0;ch<8;ch++)
{
for(Dat=0,i=0;i<12;i++)
{
Dat += AdcBuff[ch][i];
}
Dat = Dat/12;
//temp = TempCount(Dat);
//Dat = temp;
//Dat *= 244;//33
//Dat /= 4096;
//DAC0Out(Dat);
//dis_int_numXX(ch/4*0x40,ch%4*2,0,(int)Dat);
}
}
uint xdata bvuf[10240];
void ProTime_200ms()
{
uint i,Dat;
for(i=0;i<10240;i++)
{
bvuf[i]=i;
Dat = bvuf[i];
if(Dat !=i)
{
Work = ~Work;
K3 = OutBuf;
dis_int_numXX(0,2,0,Dat) ;
}
}
}
void disb8(uchar y,uchar x,uchar z,bit cpls)
{
uchar ch,com,dat,j;
int hznum;
hznum=z*0x8;
com=x|0xb8;
prl0(com);
prr0(com);
if(y<0x40)
{
com=y|0x40;
prl0(com);
for(j=0;j<8;j++)
{
dat=CTAB[hznum];
if(cpls)
dat=~dat;
prl1(dat);
hznum++;
}
}
else
{
ch=y-0x40;
com=ch|0x40;
prr0(com);
for(j=0;j<8;j++)
{
dat=CTAB[hznum];
if(cpls)
dat=~dat;
prr1(dat);
hznum++;
}
}
}
void Distime1()
{
byte i;
// if(time_buff[0]==DisTimeFlag) return;
// else DisTimeFlag=time_buff[0];
for(i=0;i<=9;i++)
{
disb8(0x30+i*8,7,str_time[i],0);
dis_int_numXX(0,4,0,str_time[i]) ;
}
for(i=11;i<19;i++)
{
disb8(0x40+(i-11)*8,0,str_time[i],0);
dis_int_numXX(0,2,0,str_time[i]) ;
}
}
void ProTime_500ms()
{
Work = ~Work;
K3 = OutBuf;
Uart1Send();
GetTime();
Distime1();
disb8(0x30,7,5,0);
}
void m_pro(void)
{
byte i;
for(i=0;i<max_pro;i++)
{
if(!OP_TIME[i])
{
OP_TIME[i] = OP[i].time_val;
OP[i].proc();
}
}
}
void DelayMs(uint cnt)
{
uint idata mmm;
while(cnt--)
{
for(mmm=0;mmm<860;mmm++)
{;}
}
}
byte GetKey()
{
bit Bit;
Bit = xXR1;
Bit = xXR2;
Bit = xXR3;
Bit = xXR4;
yYW1 = 0;
yYW2 = 1;
yYW3 = 1;
yYW4 = 1;
Bit = xXR1;
if(Bit==0)
return 1;
Bit = xXR2;
if(Bit==0)
return 2;
Bit = xXR3;
if(Bit==0)
return 3;
Bit = xXR4;
if(Bit==0)
return 4;
/******************/
yYW1 = 1;
yYW2 = 0;
yYW3 = 1;
yYW4 = 1;
Bit = xXR1;
if(Bit==0)
return 5;
Bit = xXR2;
if(Bit==0)
return 6;
Bit = xXR3;
if(Bit==0)
return 7;
Bit = xXR4;
if(Bit==0)
return 8;
/******************/
yYW1 = 1;
yYW2 = 1;
yYW3 = 0;
yYW4 = 1;
Bit = xXR1;
if(Bit==0)
return 9;
Bit = xXR2;
if(Bit==0)
return 10;
Bit = xXR3;
if(Bit==0)
return 11;
Bit = xXR4;
if(Bit==0)
return 12;
/******************/
yYW1 = 1;
yYW2 = 1;
yYW3 = 1;
yYW4 = 0;
Bit = xXR1;
if(Bit==0)
return 13;
Bit = xXR2;
if(Bit==0)
return 14;
Bit = xXR3;
if(Bit==0)
return 15;
Bit = xXR4;
if(Bit==0)
return 16;
return 0;
}
#define SET_PIC 1
void SetPro()
{
// byte i;
}
void OpenBJQ()
{
BJQQ = 1;
K3 = OutBuf;
}
void CloseBJQ()
{
BJQQ = 0;
K3 = OutBuf;
}
void PulaseGgatherInt() interrupt 1 //t0中断,置0.1ms标志,使用
{
static uint WDOGCnt=0;
byte i;
SELECT_P62256
TF0 = 0;
TR0 = 0;
TL0 = 0x66;//0x8F;
TH0 = 0xfc;//0xFE; //置T0初值,(0xFFFF-TH0TL0+1)*12/22.1184MHz=0.2ms
TR0 = 1;
//WDOG
WDI = ~WDI;
P4 = PP4;
WDOGCnt++;
if(WDOGCnt>9000)
{
OpenBJQ();
yYW1 = 1;
yYW2 = 1;
yYW3 = 1;
yYW4 = 1;
xXR1=1;
xXR2=1;
xXR3=1;
xXR4=1;
}
else
{
CloseBJQ();
yYW1 = 0;
yYW2 = 0;
yYW3 = 0;
yYW4 = 0;
xXR1=0;
xXR2=0;
xXR3=0;
xXR4=0;
}
if(WDOGCnt>10000)
{
WDOGCnt = 0;
}
for(i=0;i<max_pro;i++)
{
if(OP_TIME[i])
OP_TIME[i]--;
}
}
void AxlesGatherInt() interrupt 3 //t1中断,禁止
{
}
/******************************************************************/
/******************************************************************/
void main(void)
{
byte key,i,j;
OscInit();
SELECT_P62256
CpuIinit();
KeyIni();
InitPro();
IniLcd();
SPI0_Init();
clearlcd();
Init8123();
DAC0Init();
ADCInit();
SMBus_Init();
Clock(TIME_INIT,0,0);
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
dishzXX(0x10*j,i*2,4*i+j,0);
}
clearlcd();
for(i=0;i<max_pro;i++)
OP_TIME[i]=OP[i].time_val;
SPI_WP = 1;
SPI_HOLD = 1;
initSpi();
while(1)
{
/*
CS25 = 0;
SPIF = 0;
hh=1;
SPI0DAT = 0x01;
Timer0_us (100);
hh=1;
SPI0DAT = 0x0;
Timer0_us (100);
CS25 = 1;
Timer0_us (100);
CS25 = 0;
SPIF = 0;
SPI0DAT = 0x05;
Timer0_us (10000);
CS25 = 1;
*/
// SPI_TEST_PRO();
key = GetKey();
switch(key)
{
case SET_PIC:
SetPro();
//SPI_TEST_PRO();
break;
default:
;
}
m_pro();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -