www.pudn.com > test20070811V10.rar > main._c, change:2007-08-04,size:70324b
//ICC-AVR application builder : 2007-5-12 23:12:06
// Target : M16
// Crystal: 1.0000Mhz
#include <iom16v.h>
#include <macros.h>
#include <eeprom.h>
//#include <math.h>
//#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#define uint unsigned int
#define uchar unsigned char
#define TRUE 1
#define FALSE 0
#define VERSION_CONTROL 1
#define YEAR_SETUP 0x07
#define MONTH_SETUP 0x06
#define DAY_SETUP 0x10
#define INIT_YEAR 0x07
#define INIT_MONTH 0x06
#define INIT_DATE 0x10
#define INIT_DAY 0x07
#define INIT_HOUR 0x19
#define INIT_MINUTE 0x07
#define INIT_SECOND 0x00
#define KEY_UP 0xc2 //pc0 ,K2
#define KEY_DOWN 0xc1 //pc1 ,K3
#define KEY_FUNCTION 0x83 //pc6 ,K1
#define KEY_K4 0x43 //pc7 ,K4
#define KEY_K1K4RST 0x03 //k1k4
#define KEY_K3K4RST 0x41 //k3k4
#define KEY_RESET 0xd
#define MAXVAL_LENGHT 9999
//#define MINVAL_LENGHT 8
#define MINVAL_LENGHT 4
#define MAXVAL_KIND 112
#define MINVAL_KIND 0
#define MODE_NOMALE 1
#define MODE_LENGHT 2
#define MODE_KIND 3
#define MODE_PASSWORD 4
//#define CLASSNUMBER 32
#define CLASSNUMBER 4
//从前向后,正向。
#define DIR0 0x00
//从后向前,反向。
#define DIR1 0x04
//从中间向两边。
#define DIR2 0x08
//从两边向中间。
#define DIR3 0x0c
//整体
//#define DIR4 0x40
//全彩
#define KIND0 0x00
//慧星拖尾
#define KIND1 0x10
//红-青-红
#define KIND2 0x20
//六色刷色
#define KIND3 0x30
//混合色
#define KIND4 0x40
//三路交叠
#define KIND5 0x50
//多彩
#define KIND6 0x60
#define KIND7 0x70
#define ALLBLACK 0x95 //10010101
#define UNLOCKDATA 0x15 //00010101
#define SPEED0 0x00
#define SPEED1 0x01
#define SPEED2 0x02
#define SPEED3 0x03
#define PASSWORDLENGHT 6
#define PASS_DISABLE 0xff
#define PASSWORD_SETUP 0x11
#define DATE_SETUP 0x22
#define INVALE_SETUP 0x33
//#define PASSWORD_ENTER 0x44
#define MAXDATE 250
#define MAXNUMBER 99
//typedef struct {
char ModeStatus;
char CurrentKey;
char BackKey;
char K1Count;
uchar K4Count;
char CurrentKind;
char val_kind;
uchar Password_alarm;
uchar Password_Enable;
uchar PassDate_flag; //0x11 : password setup ; 0x22 : date setup
uint val_lenght;
uint BLenghtCount;
uint FLenghtCount;
uint HalfLenght;
uint left;
uint right;
uint PwModify_flag;
//}WORKLED;
//WORKLED WorkLed;
unsigned char KindData[MAXVAL_KIND];
uchar PasswordData[PASSWORDLENGHT];
uchar DateValue[4];
uchar DayData[2];
uchar Oneday;
//uchar tc1,tc2;
uchar color1,color2;
/*
KindDataStr[MAXVAL_KIND][2]:
mode data 8bit; dir data 4bit + speed data 4bit
1 byte 2byte
speed data:
0 -->speed 1
1 -->speed 2
2 -->speed 3
3 -->speed 4
dir data:
0 --> 正向
1 --> 反向
2 -->中间向两边
3 -->两边向中间
*/
#define RBASE 0x94 //D2D1
#define GBASE 0x85 //D6D5
#define BBASE 0x91 //D4D3
#define YBASE 0xbf&RBASE&GBASE
#define WBASE 0xbf&RBASE&GBASE&BBASE
#define RBBASE 0xbf&RBASE&BBASE
#define GBBASE 0xbf&GBASE&BBASE
//亮00
#define SDATA0 0x00
//灭01
#define SDATA1 0x01
//渐暗10
#define SDATA2 0x02
//渐明11
#define SDATA3 0x03
#define BDATA 0x80
#define GBIT 4
#define BBIT 2
#define RBIT 0
//全彩
#define ALLCOLOR BDATA |(SDATA3<<GBIT)|(SDATA1<<BBIT)|(SDATA0<<RBIT) //0xb1
#define SEVENCOLOR0 BDATA |(SDATA3<<GBIT)|(SDATA1<<BBIT)|(SDATA2<<RBIT)
#define SEVENCOLOR1 BDATA |(SDATA2<<GBIT)|(SDATA1<<BBIT)|(SDATA3<<RBIT)
#define SEVENCOLOR2 BDATA |(SDATA3<<GBIT)|(SDATA2<<BBIT)|(SDATA1<<RBIT)
#define SEVENCOLOR3 BDATA |(SDATA2<<GBIT)|(SDATA3<<BBIT)|(SDATA1<<RBIT)
#define SEVENCOLOR4 BDATA |(SDATA1<<GBIT)|(SDATA3<<BBIT)|(SDATA2<<RBIT)
#define SEVENCOLOR5 BDATA |(SDATA1<<GBIT)|(SDATA2<<BBIT)|(SDATA3<<RBIT)
#define THREECOLORR BDATA |(SDATA1<<GBIT)|(SDATA1<<BBIT)|(SDATA2<<RBIT)
#define THREECOLORG BDATA |(SDATA2<<GBIT)|(SDATA1<<BBIT)|(SDATA1<<RBIT)
#define THREECOLORB BDATA |(SDATA1<<GBIT)|(SDATA2<<BBIT)|(SDATA1<<RBIT)
#define THREECOLORR1 BDATA |(SDATA3<<GBIT)|(SDATA1<<BBIT)|(SDATA2<<RBIT)
#define THREECOLORG1 BDATA |(SDATA1<<GBIT)|(SDATA3<<BBIT)|(SDATA2<<RBIT)
#define THREECOLORB1 BDATA |(SDATA2<<GBIT)|(SDATA3<<BBIT)|(SDATA1<<RBIT)
#define ALLCOLOR0 BDATA |(SDATA3<<GBIT)|(SDATA1<<BBIT)|(SDATA0<<RBIT)
#define ALLCOLOR4 BDATA |(SDATA1<<GBIT)|(SDATA0<<BBIT)|(SDATA3<<RBIT)
#define ALLCOLOR3 BDATA |(SDATA0<<GBIT)|(SDATA3<<BBIT)|(SDATA1<<RBIT)
#define ALLCOLOR2 BDATA |(SDATA3<<GBIT)|(SDATA0<<BBIT)|(SDATA1<<RBIT)
#define ALLCOLOR1 BDATA |(SDATA0<<GBIT)|(SDATA1<<BBIT)|(SDATA3<<RBIT)
#define ALLCOLOR5 BDATA |(SDATA1<<GBIT)|(SDATA3<<BBIT)|(SDATA0<<RBIT)
#define ALLSTAR0 BDATA |(SDATA1<<GBIT)|(SDATA1<<BBIT)|(SDATA0<<RBIT) //red
#define ALLSTAR1 BDATA |(SDATA0<<GBIT)|(SDATA1<<BBIT)|(SDATA1<<RBIT) //green
#define ALLSTAR2 BDATA |(SDATA1<<GBIT)|(SDATA0<<BBIT)|(SDATA1<<RBIT) //blue
#define ALLSTAR3 BDATA |(SDATA1<<GBIT)|(SDATA0<<BBIT)|(SDATA0<<RBIT) //0xb1
#define ALLSTAR4 BDATA |(SDATA0<<GBIT)|(SDATA1<<BBIT)|(SDATA0<<RBIT) //0xb1
#define ALLSTAR5 BDATA |(SDATA0<<GBIT)|(SDATA0<<BBIT)|(SDATA1<<RBIT) //0xb1
//#define UNITEC0 BDATA |(SDATA1<<GBIT)|(SDATA3<<BBIT)|(SDATA2<<RBIT) //red
//#define UNITEC1 BDATA |(SDATA3<<GBIT)|(SDATA1<<BBIT)|(SDATA2<<RBIT) //green
//#define UNITEC2 BDATA |(SDATA2<<GBIT)|(SDATA1<<BBIT)|(SDATA3<<RBIT) //blue
#define UNITEC0 BDATA |(SDATA1<<GBIT)|(SDATA1<<BBIT)|(SDATA0<<RBIT) //red
#define UNITEC1 BDATA |(SDATA0<<GBIT)|(SDATA1<<BBIT)|(SDATA1<<RBIT) //green
#define UNITEC2 BDATA |(SDATA1<<GBIT)|(SDATA0<<BBIT)|(SDATA1<<RBIT) //blue
#define UNITEC3 BDATA |(SDATA2<<GBIT)|(SDATA3<<BBIT)|(SDATA1<<RBIT) //0xb1
#define UNITEC4 BDATA |(SDATA1<<GBIT)|(SDATA2<<BBIT)|(SDATA3<<RBIT) //0xb1
#define UNITEC5 BDATA |(SDATA3<<GBIT)|(SDATA2<<BBIT)|(SDATA1<<RBIT) //0xb1
#define ALL_ID 0
#define STAR_ID 1
#define SIX_ID 2
#define SEVEN_ID 3
//整体三路交叠渐变
#define THREE_ID 4
//三路交叠飘动
#define THREE1_ID 5
//整体全彩渐变
#define ALLCOLOR_ID 6
//混合色交叠渐变
#define UNITEC_ID 7
const unsigned char KindGroudData[8][7]=
{
//全彩
{ALLCOLOR0,ALLCOLOR1,ALLCOLOR2,ALLCOLOR3,ALLCOLOR4,ALLCOLOR5,0x00},
//慧星拖尾
{ALLSTAR0,ALLSTAR1,ALLSTAR2,ALLSTAR3,ALLSTAR4,ALLSTAR5,0x00},
// {ALLSTAR0,ALLSTAR1,ALLSTAR2,0x00,0x00,0x00,0x00},
//六色刷色: 红 绿 兰 黄 紫 青
{RBASE,GBASE,BBASE,YBASE,RBBASE,GBBASE,0x00},
//多彩: 红 绿 兰 黄 紫 青 白
{SEVENCOLOR0,SEVENCOLOR1,SEVENCOLOR2,SEVENCOLOR3,SEVENCOLOR4,SEVENCOLOR5,0x00},
//整体三路交叠渐变: 红 绿 兰
{THREECOLORR,THREECOLORG,THREECOLORB,0x00,0x00,0x00,0x00},
//三路交叠飘动: 红 绿 兰
{THREECOLORR1,THREECOLORB1,THREECOLORG1,0x00,0x00,0x00,0x00},
//整体全彩渐变
{ALLCOLOR0,ALLCOLOR1,ALLCOLOR2,ALLCOLOR3,ALLCOLOR4,ALLCOLOR5,0x00},
//混合色交叠渐变
{UNITEC0,0x00,0x00,0x00,0x00,0x00,0x00},
// {UNITEC0,UNITEC1,UNITEC2,UNITEC3,UNITEC4,UNITEC5,0x00},
};
const unsigned char KindDataValue[60][2]=
{
//0 -->52
{GBBASE ,RBASE},{GBBASE ,RBASE},{GBBASE ,RBASE},{GBBASE ,RBASE},
//-->56
{GBBASE ,RBASE},{GBBASE ,GBASE},{GBBASE ,GBASE},{GBBASE ,GBASE},
//8 -->60
{GBBASE,GBASE},{GBBASE,GBASE},{WBASE,YBASE},{WBASE,YBASE},
//12-->64
{WBASE,YBASE},{WBASE,YBASE},{WBASE,YBASE},{RBBASE,BBASE},
//16-->68
{RBBASE,BBASE},{RBBASE,BBASE},{RBBASE,BBASE},{RBBASE,BBASE},
//20-->72
{YBASE,GBASE},{YBASE,GBASE},{YBASE,GBASE},{YBASE,GBASE},
//24-->76
{YBASE,GBASE},{WBASE,GBBASE},{WBASE,GBBASE},{WBASE,GBBASE},
//28-->80 v
{WBASE,GBBASE},{WBASE,GBBASE},{GBBASE,BBASE},{GBBASE,BBASE},
//32-->84
{GBBASE,BBASE},{GBBASE,BBASE},{GBBASE,BBASE},{YBASE,RBASE},
//36-->88
{YBASE,RBASE},{YBASE,RBASE},{YBASE,RBASE},{YBASE,RBASE},
//40-->92
{WBASE,RBBASE},{WBASE,RBBASE},{WBASE,RBBASE},{WBASE,RBBASE},
//44-->96
{WBASE,RBBASE},{WBASE,GBASE},{WBASE,GBASE},{WBASE,GBASE},
//48-->100
{WBASE,GBASE},{WBASE,GBASE},{WBASE,RBASE},{WBASE,RBASE},
//52-->104
{WBASE,RBASE},{WBASE,RBASE},{WBASE,RBASE},{WBASE,BBASE},
//56-->108
{WBASE,BBASE},{WBASE,BBASE},{WBASE,BBASE},{WBASE,BBASE}
};
const unsigned char KindDataStr[MAXVAL_KIND][2]=
{
//0 v
{ALL_ID,KIND0|DIR0|SPEED0},{ALL_ID,KIND0|DIR0|SPEED1},{ALL_ID,KIND0|DIR0|SPEED2},{ALL_ID,KIND0|DIR0|SPEED3},
// 4 v
{ALL_ID,KIND0|DIR1|SPEED0},{ALL_ID,KIND0|DIR1|SPEED1},{ALL_ID,KIND0|DIR2|SPEED0},{ALL_ID,KIND0|DIR2|SPEED1},
//8 v
{ALL_ID,KIND0|DIR3|SPEED0},{ALL_ID,KIND0|DIR3|SPEED1},{STAR_ID,KIND1|DIR0|SPEED0},{STAR_ID,KIND1|DIR0|SPEED1},
//12
{STAR_ID,KIND1|DIR0|SPEED2},{STAR_ID,KIND1|DIR1|SPEED0},{STAR_ID,KIND1|DIR1|SPEED1},{STAR_ID,KIND1|DIR2|SPEED0},
//16
{STAR_ID,KIND1|DIR2|SPEED1},{STAR_ID,KIND1|DIR3|SPEED0},{STAR_ID,KIND1|DIR3|SPEED1},{ALLCOLOR_ID,KIND0|DIR0|SPEED0},
//20v
{SIX_ID,KIND3|DIR0|SPEED0},{SIX_ID,KIND3|DIR0|SPEED1},{SIX_ID,KIND3|DIR0|SPEED2},{SIX_ID,KIND3|DIR0|SPEED3},
//24v
{SIX_ID,KIND3|DIR1|SPEED0},{SIX_ID,KIND3|DIR1|SPEED1},{SIX_ID,KIND3|DIR2|SPEED0},{SIX_ID,KIND3|DIR2|SPEED1},
//28v
{SIX_ID,KIND3|DIR3|SPEED0},{SIX_ID,KIND3|DIR3|SPEED1},{THREE_ID,KIND0|DIR0|SPEED0},{UNITEC_ID,KIND0|DIR0|SPEED0},
//32
{UNITEC_ID,KIND0|DIR0|SPEED1},{UNITEC_ID,KIND0|DIR0|SPEED2},{UNITEC_ID,KIND0|DIR0|SPEED3},{UNITEC_ID,KIND0|DIR1|SPEED0},
//36
{UNITEC_ID,KIND0|DIR1|SPEED1},{UNITEC_ID,KIND0|DIR2|SPEED0},{UNITEC_ID,KIND0|DIR2|SPEED1},{UNITEC_ID,KIND0|DIR3|SPEED0},
//40
{UNITEC_ID,KIND0|DIR3|SPEED1},{THREE1_ID,KIND0|DIR0|SPEED0},{THREE1_ID,KIND0|DIR0|SPEED1},{THREE1_ID,KIND0|DIR0|SPEED2},
//44 v
{THREE1_ID,KIND0|DIR1|SPEED0},{THREE1_ID,KIND0|DIR1|SPEED1},{SEVEN_ID,KIND0|DIR0|SPEED0},{SEVEN_ID,KIND0|DIR0|SPEED1},
//48 v
{SEVEN_ID,KIND0|DIR0|SPEED2},{SEVEN_ID,KIND0|DIR0|SPEED3},{SEVEN_ID,KIND0|DIR1|SPEED0},{SEVEN_ID,KIND0|DIR1|SPEED1},
//52
{RBASE,KIND2|DIR0|SPEED0},{RBASE,KIND2|DIR0|SPEED1},{RBASE,KIND2|DIR0|SPEED2},{RBASE,KIND2|DIR1|SPEED0},
//56
{RBASE,KIND2|DIR1|SPEED1},{GBASE,KIND2|DIR0|SPEED0},{GBASE,KIND2|DIR0|SPEED1},{GBASE,KIND2|DIR0|SPEED2},
//60
{GBASE,KIND2|DIR1|SPEED0},{GBASE,KIND2|DIR1|SPEED1},{YBASE,KIND2|DIR0|SPEED0},{YBASE,KIND2|DIR0|SPEED1},
//64
{YBASE,KIND2|DIR0|SPEED2},{YBASE,KIND2|DIR1|SPEED0},{YBASE,KIND2|DIR1|SPEED1},{BBASE,KIND2|DIR0|SPEED0},
//68
{BBASE,KIND2|DIR0|SPEED1},{BBASE,KIND2|DIR0|SPEED2},{BBASE,KIND2|DIR1|SPEED0},{BBASE,KIND2|DIR1|SPEED1},
//72
{GBASE,KIND2|DIR0|SPEED0},{GBASE,KIND2|DIR0|SPEED1},{GBASE,KIND2|DIR0|SPEED2},{GBASE,KIND2|DIR1|SPEED0},
//76
{GBASE,KIND2|DIR1|SPEED1},{GBBASE,KIND2|DIR0|SPEED0},{GBBASE,KIND2|DIR0|SPEED1},{GBBASE,KIND2|DIR0|SPEED2},
//80
{GBBASE,KIND2|DIR1|SPEED0},{GBBASE,KIND2|DIR1|SPEED1},{BBASE,KIND2|DIR0|SPEED0},{BBASE,KIND2|DIR0|SPEED1},
//84
{BBASE,KIND2|DIR0|SPEED2},{BBASE,KIND2|DIR1|SPEED0},{BBASE,KIND2|DIR1|SPEED1},{RBASE,KIND2|DIR0|SPEED0},
//88
{RBASE,KIND2|DIR0|SPEED1},{RBASE,KIND2|DIR0|SPEED2},{RBASE,KIND2|DIR1|SPEED0},{RBASE,KIND2|DIR1|SPEED1},
//92
{RBBASE,KIND2|DIR0|SPEED0},{RBBASE,KIND2|DIR0|SPEED1},{RBBASE,KIND2|DIR0|SPEED2},{RBBASE,KIND2|DIR1|SPEED0},
//96
{RBBASE,KIND2|DIR1|SPEED1},{GBASE,KIND2|DIR0|SPEED0},{GBASE,KIND2|DIR0|SPEED1},{GBASE,KIND2|DIR0|SPEED2},
//100
{GBASE,KIND2|DIR1|SPEED0},{GBASE,KIND2|DIR1|SPEED1},{RBASE,KIND2|DIR0|SPEED0},{RBASE,KIND2|DIR0|SPEED1},
//104
{RBASE,KIND2|DIR0|SPEED2},{RBASE,KIND2|DIR1|SPEED0},{RBASE,KIND2|DIR1|SPEED1},{BBASE,KIND2|DIR0|SPEED0},
//108
{BBASE,KIND2|DIR0|SPEED1},{BBASE,KIND2|DIR0|SPEED2},{BBASE,KIND2|DIR1|SPEED0},{BBASE,KIND2|DIR1|SPEED1}
};
#define SIZE 20
unsigned char SPI_rx_buff[SIZE];
unsigned char SPI_tx_buff[SIZE];
unsigned char rx_wr_index,rx_rd_index,rx_counter,rx_buffer_overflow;
unsigned char tx_wr_index,tx_rd_index,tx_counter;
char DispBuffer[6];
const char CharFont[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0xc7,0x8c,0xa1};
// 0 1 2 3 4 5 6 7 8 9 a b c d e f - L P d
long val;
unsigned char KeyCode;
void Display(void);
void Display_Fast(void);
char PressKeyProcess(void);
void spi_init(void);
void putSPIchar(char c);
unsigned char getSPIchar(void);
void spi_stc_isr(void);
void WatchDog(char tim);
unsigned char SendKindData(char kind);
void EepromICnumberWr(void);
void EepromICnumberRd(void);
void FactorySetup(void);
void EepromViewModeWr(void);
void EepromViewModeRd(void);
void EepromPasswordRd(void);
void EepromPasswordWr(void);
void EepromDateValueRd(void);
void EepromDateValueWr(void);
void EepromDayDataRd(void);
void EepromDayDataWr(void);
int CompareDate(void);
int CalMonthDay(uchar month,uchar day);
uchar ProcessEdgeToMiddle(char data,uchar mode,uchar BC,uchar class);
uchar ProcessMiddleToEdge(char data,uchar mode,uchar BC,uchar class );
void AllClearICBuffer(void);
void DelayNs(char tim);
uchar SendFirstToEnd(uchar kind,uchar mode,uchar si_flag,uchar ss_flag);
char SpeedDelay(uchar speed);
void AllStarRight(uchar da1,uchar da2,uchar da3,uchar da4,uint init);
uchar AllStarMiddleToEdge(uchar da1,uchar da2,uchar da3,uchar da4,uchar mode);
void timer0_init(void) ;
void Delay(char tim)
{
unsigned char i,j;
for(j=0;j<tim;j++)
{
for(i=200;i>0;i--)
{
asm("nop");
asm("nop");
asm("nop");
}
#ifdef VERSION_CONTROL
/* WDT 复位*/
_WDR();
#endif
}
}
void DelayNs(char tim)
{
unsigned char j;
for(j=0;j<tim;j++)
{
asm("nop");
asm("nop");
asm("nop");
}
#ifdef VERSION_CONTROL
/* WDT 复位*/
_WDR();
#endif
}
void SendSS(uchar loop )
{
if(loop==0) return;
PORTB |= 0x10; //SS output high 电平
DelayNs(20);
PORTB &=(~0x10); //SS output low 电平
}
void SendSI(uchar loop)
{
uchar i;
if(loop==0) return;
for(i=0;i<loop;i++)
{
PORTB |= 0x08; //S_I output high 电平
// DelayNs(255);
// DelayNs(255);
Display_Fast();
PORTB &=(~0x08); //S_I output low 电平
// DelayNs(255);
// DelayNs(255);
Display_Fast();
}
}
uint hmod(uint source,uint dest)
{
uchar i,src;
src=source;
if(src<dest) return src;
for(i=0;i<source;i++)
{
src=src-dest;
if(src<dest) break;
}
return src;
}
uchar AllStar(uchar da1,uchar da2,uchar da3,uchar da4,uchar mode)
{
uchar tim,i=0;//,mode;
uchar loop1=16,loop2=70;
for(i=0;i<val_lenght;i++)
{
putSPIchar(da1);
DelayNs(50);
putSPIchar(da1);
DelayNs(50);
SendSS(1);
SendSI(loop1);
i++;
if(i>val_lenght)break;
if(SpeedDelay(mode & 0x03)==1) return 1;
putSPIchar(da2);
DelayNs(50);
putSPIchar(da2);
DelayNs(50);
SendSS(1);
SendSI(loop1);
i++;
if(i>val_lenght)break;
if(SpeedDelay(mode & 0x03)==1) return 1;
putSPIchar(da3);
DelayNs(50);
putSPIchar(da3);
DelayNs(50);
SendSS(1);
SendSI(loop1);
i++;
if(i>val_lenght)break;
if(SpeedDelay(mode & 0x03)==1) return 1;
putSPIchar(da4);
DelayNs(50);
putSPIchar(da4);
DelayNs(50);
SendSS(1);
SendSI(loop1);
if(SpeedDelay(mode & 0x03)==1) return 1;
}
// if(SpeedDelay(mode & 0x03)==1) return 1;
return 0;
}
void PasswordCannel(void)
{
PasswordData[0]=PASS_DISABLE;
PasswordData[1]=PASS_DISABLE;
PasswordData[2]=PASS_DISABLE;
PasswordData[3]=PASS_DISABLE;
PasswordData[4]=PASS_DISABLE;
PasswordData[5]=0x00;
Password_alarm=FALSE;
Password_Enable=FALSE;
}
//mega16 7.3728MHz石英晶体 iccavr6.31a
/*
去掉电池:
year/mon/day =00/01/01
hour/min/second=00/00/00
去掉芯片:
year/mon/day =ff/1f/3f
hour/min/second=3f/7f/7f
重新扦入芯片,永远为:
year/mon/day =00/01/01
hour/min/second=00/00/00
*/
//相关定义:
#define DS1302_RST 2 //pd2
#define DS1302_SDA 0 //pd0
#define DS1302_SCLK 1 //pd1
//ds1302相关
//DS1302_RST=1
#define Set_DS1302_RST() PORTD|=1<<DS1302_RST
//DS1302_RST=0
#define Clr_DS1302_RST() PORTD&=~(1<<DS1302_RST)
//DS1302_SDA=1
#define Set_DS1302_SDA() PORTD|=1<<DS1302_SDA
//DS1302_SDA=0
#define Clr_DS1302_SDA() PORTD&=~(1<<DS1302_SDA)
//DS1302_SCLK=1
#define Set_DS1302_SCLK() PORTD|=1<<DS1302_SCLK
//DS1302_SCLK=0
#define Clr_DS1302_SCLK() PORTD&=~(1<<DS1302_SCLK)
//DS1302的SDA置为输出脚
#define Set_DS1302_DDRSDA() DDRD|=1<<DS1302_SDA
//DS1302的SDA置为输入脚
#define Clr_DS1302_DDRSDA() DDRD&=~(1<<DS1302_SDA)
#define DS1302_SEC_Reg 0x80
#define DS1302_MIN_Reg 0x82
#define DS1302_HR_Reg 0x84
#define DS1302_DATE_Reg 0x86
#define DS1302_MONTH_Reg 0x88
#define DS1302_DAY_Reg 0x8a
#define DS1302_YEAR_Reg 0x8c
#define DS1302_CONTROL_Reg 0x8e
#define DS1302_CHARGER_Reg 0x90
#define DS1302_CLKBURST_Reg 0xbe
//全局变量
//为了方便,我把个位和十位分开了
uchar year1=0x88;
uchar year0=0x88;
uchar month1=0x88;
uchar month0=0x88;
uchar date0=0x88;
uchar date1=0x88;
uchar day=0x88;
uchar hour1=0x88;
uchar hour0=0x88;
uchar minute1=0x88;
uchar minute0=0x88;
uchar second1=0x88;
uchar second0=0x88;
void DS1302_Init(void);
uchar Check_DS1302(void);
uchar DS1302_Read(uchar reg);
void DS1302_Write(uchar reg,uchar data);
void ReadTime(void);
//////////////////////////////////////////////
void port_init(void)
{
PORTA = 0x00;
DDRA = 0xff;//PORTA0-PORTA7 ==> OUTPUT CHAR DATA
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0xc3;//PORTC7,PORTC6,PORTC1,PORTC0 ==> key input ,enable_up
DDRC = 0x00;//PC7,PC6,PC1,PC0 ==> PRESS KEY INPUT ; PC2PC3PC4PC5 ==>JTAG USE
PORTD = 0xf8;//PORTD3-PORTD7 ==> LED CS ,enable_up ;
DDRD = 0xff;//PD3,PD4,PD5,PD6,PD7 ==>LED CS USE ;PD2,PD1,PD0 OUTPUT DS1302 USE
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
// CLI(); //disable all interrupts
port_init();
spi_init(); //初始化SPI接口
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources
// SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void PasswordProcess(void)
{
int val;
EepromDayDataRd();
if(DayData[0]==0)
{
Password_alarm=TRUE;
}
else
{
ReadTime();
EepromDateValueRd();
// if((year0==0 && year1==0 &&month1==0 &&month0==1 &&date1==0&&date0==1)||(year0==0xf && year1==0xf &&month1==0x1 &&month0==0xf &&date1==0x3&&date0==0xf))
if((year1==0 && month1==0 && date1==0)||(year1==0xa5 && month1==0x1f && date1==0x3f)) //070616 modify
{
Password_alarm=TRUE;
}
else
{
val=CompareDate();
if((val==-1) ||( val > DayData[0])) Password_alarm=TRUE;
else
{
if(val!=Oneday)
{
Oneday=val;
DayData[0]=DayData[0]-val;
EepromDayDataWr();
}
Password_alarm=FALSE;
}
}
}
}
void main(void)
{
char bit,i=0,kind=0;
uint loop=0,KK=0,pwloop=0;
uchar tempPW[PASSWORDLENGHT];
val=0;
KeyCode=0;
DispBuffer[0]=CharFont[16];
DispBuffer[1]=CharFont[16];
DispBuffer[2]=CharFont[0];
DispBuffer[3]=CharFont[0];
DispBuffer[4]=CharFont[0];
DispBuffer[5]=0x00;
CLI(); //关中断
init_devices();
timer0_init();
// FactorySetup();
ModeStatus=MODE_NOMALE;
CurrentKey=KEY_FUNCTION;
BackKey=KEY_FUNCTION;
CurrentKind=KIND0;
K1Count=0;
val_kind=0;
Password_alarm=FALSE;
EepromDateValueRd();
#ifdef VERSION_CONTROL
if(DateValue[0]==0xff && DateValue[1]==0xff && DateValue[2]==0xff && DateValue[3]==0xff ) //070617 mask
#endif
{
FactorySetup();
val_lenght=MINVAL_LENGHT;
EepromICnumberWr();
EepromViewModeWr();
DS1302_Init();
EepromDateValueWr();
EepromDayDataWr();
PasswordCannel();
}
EepromICnumberRd();
EepromViewModeRd();
for(i=MAXVAL_KIND-1;i>=0;i--)
{
if(KindData[i]!=0)
{
i=i+1;
break;
}
}
val_kind=i;
EepromPasswordRd();
if(Password_Enable==TRUE)
{
PasswordProcess();
}
SEI(); //开中断
#ifdef VERSION_CONTROL
WatchDog(7);
#endif
while(1)
{ if(KeyCode==0) KeyCode=PressKeyProcess();
if(KeyCode!=0){
switch(KeyCode)
{
case KEY_UP://k2
if(ModeStatus==MODE_LENGHT)
{
if(val_lenght<MAXVAL_LENGHT)
val_lenght++;
K1Count=5;
}
else if(ModeStatus==MODE_KIND)
{
if(val_kind<MAXVAL_KIND)
{
KindData[val_kind]=TRUE;
val_kind++;
}
else val_kind=0;
}
else if(ModeStatus==MODE_PASSWORD)
{
if(PassDate_flag==PASSWORD_SETUP)
{
if(KK<MAXNUMBER) KK++;
}
else
{
if(KK<MAXDATE) KK++;
}
K1Count=0;
//K4Count=0;
}
break;
case KEY_DOWN://k3
// DS1302_Init();
// ReadTime();
if(ModeStatus==MODE_LENGHT)
{
if(val_lenght>MINVAL_LENGHT)
val_lenght--;
K1Count=5;
}
else if(ModeStatus==MODE_KIND)
{
if(val_kind<MAXVAL_KIND)
{
KindData[val_kind]=FALSE;
val_kind++;
}
else val_kind=0;
}
else if(ModeStatus==MODE_PASSWORD)
{
if(KK>0) KK--;
K1Count=0;
// K4Count=0;
}
break;
case KEY_FUNCTION://k1
BackKey=CurrentKey;
CurrentKey=KEY_FUNCTION;
K1Count++;
switch(ModeStatus)
{
case MODE_NOMALE:
ModeStatus=MODE_LENGHT;
break;
case MODE_LENGHT:
if(K1Count==2)
{
ModeStatus=MODE_KIND;
}
else if(K1Count==7) //base 5
{
K1Count=0;
ModeStatus=MODE_NOMALE;
kind=0;
EepromICnumberWr();
}
break;
case MODE_KIND:
K1Count=0;
ModeStatus=MODE_NOMALE;
kind=0;
EepromViewModeWr();
break;
case MODE_PASSWORD:
if(PassDate_flag==INVALE_SETUP || PassDate_flag==DATE_SETUP)
{
PassDate_flag=DATE_SETUP;
if(K1Count==2)
{
K1Count=0;
ModeStatus=MODE_NOMALE;
kind=0;
DayData[0]=KK;
DayData[1]=0x00;
EepromDayDataWr();
}
}
break;
default:
break;
}
break;
case KEY_K4: //k4
if(ModeStatus==MODE_PASSWORD)
{
if(PassDate_flag==INVALE_SETUP || PassDate_flag==PASSWORD_SETUP){
PassDate_flag=PASSWORD_SETUP;
// if(KK==0 && K4Count>0)
if(K4Count>5)
{
if(Password_Enable==FALSE)
{
K1Count=0;
ModeStatus=MODE_NOMALE;
kind=0;
EepromPasswordWr();
Password_Enable=TRUE;
break;
}
else
{
if(tempPW[0]==PasswordData[0] &&tempPW[1]==PasswordData[1]&&tempPW[2]==PasswordData[2]&&tempPW[3]==PasswordData[3]&&tempPW[4]==PasswordData[4])
{
ModeStatus=MODE_PASSWORD;
PassDate_flag=PASSWORD_SETUP;
PwModify_flag=TRUE;
K1Count=0;
K4Count=0;
KK=0;
break;
}
else
{
if(PwModify_flag==3)
{
EepromPasswordWr();
}
K1Count=0;
ModeStatus=MODE_NOMALE;
kind=0;
break;
}
}
}
K4Count++;
switch(K4Count)
{
case 2: //byte1
PasswordData[0]=KK;
break;
case 3: //byte2
PasswordData[1]=KK;
break;
case 4: //byte3
PasswordData[2]=KK;
break;
case 5: //byte4
PasswordData[3]=KK;
break;
case 6: //byte5
PasswordData[4]=KK;
break;
default:
break;
}
// if(Password_Enable==TRUE && PwModify_flag>=TRUE)
if(Password_Enable==TRUE && PwModify_flag==TRUE) //070616 modify
{
if(K4Count==2 && PasswordData[0]==0x3)
{
ModeStatus=MODE_PASSWORD;
PassDate_flag=PASSWORD_SETUP;
PwModify_flag=3;
K1Count=0;
K4Count=0;
KK=0;
}
else if(K4Count==2 && PasswordData[0]==0x8)
{
ModeStatus=MODE_PASSWORD;
PassDate_flag=DATE_SETUP;
K1Count=0;
K4Count=0;
KK=0;
}
else if(K4Count==3 && PasswordData[0]==38&& PasswordData[1]==83)
{
K1Count=0;
ModeStatus=MODE_NOMALE;
kind=0;
PasswordCannel();
break;
}
}
KK=0;
}
}
break;
case KEY_K1K4RST://k1k4
FactorySetup();
EepromICnumberWr();
EepromViewModeWr();
WatchDog(0);
while(1);
break;
case KEY_K3K4RST: //k3k4
EepromPasswordRd();
PwModify_flag=FALSE;
if(Password_Enable==FALSE)
{
ModeStatus=MODE_PASSWORD;
PassDate_flag=INVALE_SETUP;
K1Count=0;
K4Count=0;
KK=0;
}
else
{
ModeStatus=MODE_PASSWORD;
PassDate_flag=PASSWORD_SETUP;
K1Count=0;
K4Count=0;
for(i=0;i<PASSWORDLENGHT;i++)
tempPW[i]=PasswordData[i];
KK=0;
}
break;
default:
break;
}
KeyCode=0;
if(ModeStatus==MODE_LENGHT)
{
DispBuffer[0]=CharFont[17];
loop=val_lenght;
bit=loop/1000;
DispBuffer[1]=CharFont[bit];
loop=loop-bit *1000;
bit=loop/100;
DispBuffer[2]=CharFont[bit];
loop=loop-bit *100;
bit=loop/10;
DispBuffer[3]=CharFont[bit];
loop=loop-bit *10;
DispBuffer[4]=CharFont[loop];
BLenghtCount=val_lenght;
}
else if(ModeStatus==MODE_KIND)
{
DispBuffer[0]=CharFont[0];
loop=val_kind;
DispBuffer[1]=CharFont[16];
bit=loop/100;
DispBuffer[2]=CharFont[bit];
loop=loop-bit *100;
bit=loop/10;
DispBuffer[3]=CharFont[bit];
loop=loop-bit *10;
DispBuffer[4]=CharFont[loop];
}
else if(ModeStatus==MODE_PASSWORD)
{
if(PassDate_flag==PASSWORD_SETUP)
{
DispBuffer[0]=CharFont[18];
DispBuffer[2]=CharFont[0];
switch(K4Count)
{
case 1: //byte1
DispBuffer[1]=CharFont[1];
break;
case 2: //byte2
DispBuffer[1]=CharFont[2];
break;
case 3: //byte3
DispBuffer[1]=CharFont[3];
break;
case 4: //byte4
DispBuffer[1]=CharFont[4];
break;
case 5: //byte5
DispBuffer[1]=CharFont[5];
break;
default:
if(PwModify_flag==TRUE) //070616 modify
DispBuffer[1]=CharFont[18];
else if(PwModify_flag==3)//070616 modify
DispBuffer[1]=CharFont[16];
else
DispBuffer[1]=CharFont[6];
break;
}
loop=KK;
bit=loop/10;
DispBuffer[3]=CharFont[bit];
loop=loop-bit *10;
DispBuffer[4]=CharFont[loop];
}
else if(PassDate_flag==DATE_SETUP)
{
DispBuffer[0]=CharFont[19];
DispBuffer[1]=CharFont[19];
loop=KK;
bit=loop/100;
DispBuffer[2]=CharFont[bit];
loop=loop-bit *100;
bit=loop/10;
DispBuffer[3]=CharFont[bit];
loop=loop-bit *10;
DispBuffer[4]=CharFont[loop];
}
else
{
DispBuffer[0]=CharFont[18];
DispBuffer[1]=CharFont[19];
loop=KK;
bit=loop/100;
DispBuffer[2]=CharFont[bit];
loop=loop-bit *100;
bit=loop/10;
DispBuffer[3]=CharFont[bit];
loop=loop-bit *10;
DispBuffer[4]=CharFont[loop];
}
}
else
{
DispBuffer[0]=CharFont[16];
DispBuffer[1]=CharFont[16];
DispBuffer[2]=CharFont[0];
DispBuffer[3]=CharFont[0];
DispBuffer[4]=CharFont[0];
}
DispBuffer[5]=0x00;
}
if(ModeStatus==MODE_NOMALE)
{
if(Password_alarm==FALSE)
{
if(KindData[kind]==TRUE)
{
DispBuffer[0]=CharFont[16];
DispBuffer[1]=CharFont[16];
loop=kind;
bit=loop/100;
DispBuffer[2]=CharFont[bit];
loop=loop-bit *100;
bit=loop/10;
DispBuffer[3]=CharFont[bit];
loop=loop-bit *10;
DispBuffer[4]=CharFont[loop];
Display();
SendKindData(kind);
/* for(i=1;i<val_lenght;i++)
{
if(SendKindData(0x0 | 0x80)==1) break;
}
*/
}
kind++;
if(kind>=MAXVAL_KIND)
kind=0;
}
else
{
kind=0;
DispBuffer[0]=CharFont[16];
DispBuffer[1]=CharFont[16];
loop=kind;
bit=loop/100;
DispBuffer[2]=CharFont[bit];
loop=loop-bit *100;
bit=loop/10;
DispBuffer[3]=CharFont[bit];
loop=loop-bit *10;
DispBuffer[4]=CharFont[loop];
Display();
SendKindData(kind);
}
}
/*
KK++;
if(KK>1500)
{KK=0;
ReadTime();
DispBuffer[0]=CharFont[hour1];
DispBuffer[1]=CharFont[hour0];
DispBuffer[2]=CharFont[minute1];
DispBuffer[3]=CharFont[minute0];
DispBuffer[4]=CharFont[second0];
}
*/
Display();
if(pwloop>100)
{
pwloop=0;
if(Password_Enable==TRUE)
{
PasswordProcess();
}
}
else pwloop++;
}
}
void Display(void)
{
PORTD=0xf7;
PORTA=DispBuffer[0];
Delay(10);
PORTD=0xef;
PORTA=DispBuffer[1];
Delay(10);
PORTD=0xdf;
PORTA=DispBuffer[2];
Delay(10);
PORTD=0xbf;
PORTA=DispBuffer[3];
Delay(10);
PORTD=0x7f;
PORTA=DispBuffer[4];
Delay(10);
#ifdef VERSION_CONTROL
/* WDT 复位*/
_WDR();
#endif
}
void Display_Fast(void)
{
PORTD=0xf7;
PORTA=DispBuffer[0];
Delay(1);
PORTD=0xef;
PORTA=DispBuffer[1];
Delay(1);
PORTD=0xdf;
PORTA=DispBuffer[2];
Delay(1);
PORTD=0xbf;
PORTA=DispBuffer[3];
Delay(1);
PORTD=0x7f;
PORTA=DispBuffer[4];
Delay(1);
#ifdef VERSION_CONTROL
/* WDT 复位*/
_WDR();
#endif
}
char PressKeyProcess(void)
{
char temp1,temp2;
temp1=PINC;
temp1 &=0xc3;//get pc0,pc1,pc6,pc7
if(temp1==0xc3)return 0;
Display();
Delay(50);
Display();
Delay(50);
Display();
Delay(50);
//
temp2=PINC;
temp2 &=0xc3;//get pc0,pc1,pc6,pc7
if(temp2==0xc3)return 0;
Display();
Delay(50);
Display();
Delay(50);
//
temp1=PINC;
temp1 &=0xc3;//get pc0,pc1,pc6,pc7
temp2 &=temp1;
if(temp2==0xc3)return 0;
if(temp2==KEY_K1K4RST ||temp2==KEY_K3K4RST )
{
Delay(250);
Delay(250);
Delay(250);
Delay(250);
Delay(250);
Delay(250);
Delay(250);
Delay(250);
Delay(250);
Delay(250);
Delay(250);
Delay(250);
return temp2;
}
Display();
Delay(50);
Display();
Delay(50);
return temp2;
}
//#pragma interrupt_handler spi_stc_isr:18 //atmega128 ,SPI_vecter
#pragma interrupt_handler spi_stc_isr:11
//spi_stc_isr:11 ;atmega16 ,SPI_vecter
void spi_stc_isr(void)
{
SPI_rx_buff[0] = SPDR; //从ISP口读出收到的字节
}
unsigned char getSPIchar(void)
{
unsigned char data;
return 0;
while (rx_counter == 0); //无接收数据,等待
data = SPI_rx_buff[rx_rd_index]; //从接收缓冲区取出一个SPI收到的数据
if (++rx_rd_index == SIZE) rx_rd_index = 0; //调整指针
CLI();
--rx_counter;
SEI();
return data;
}
void putSPIchar(char c)
{
CLI();
SPDR = c; //发送缓冲区中空且SPI口空闲,直接放入SPDR由SIP口发送
SEI();
}
void spi_init(void)
{
unsigned char temp;
// DDRB |= 0x10; //SS = output
DDRB = (1<<7)|(1<<5)|(1<<4)|(1<<3); //SS = output ,PB3 ==>output S_I use
PORTB = 0x00; //SS 平时为low 电平
// SPCR = 0xD5; //SPI允许,主机模式,MSB,允许SPI中断,极性方式01,1/16系统时钟速率
SPCR = 0x55; //SPI允许,主机模式,MSB,disable SPI中断,极性方式01,1/16系统时钟速率
SPSR = 0x00;
temp = SPSR;
temp = SPDR; //清空SPI,和中断标志,使SPI空闲
PORTB &=(~0x10); //SS output low 电平
PORTB &=(~0x08); //S_I output low 电平
}
void WatchDog(char tim)
{
/* WDT 复位*/
_WDR();
/* 置位 WDTOE 和 WDE*/
WDTCR |= (1<<WDTOE) | (1<<WDE);
/* run WDT 16.3ms*/
WDTCR = (1<<WDE) |(tim);
}
void WDT_off(void)
{
/* WDT 复位*/
_WDR();
/* 置位 WDTOE 和 WDE*/
WDTCR |= (1<<WDTOE) | (1<<WDE);
/* 关闭WDT */
WDTCR = 0x00;
}
char SpeedDelay(uchar speed)
{
uchar tim,i;
switch(speed)
{
case SPEED1:
tim=6;
break;
case SPEED2:
tim=9;
break;
case SPEED3:
tim=12;
break;
case SPEED0:
default:
tim=3;
break;
}
for(i=0;i<tim;i++)
{
Display();
KeyCode=PressKeyProcess();
if(KeyCode!=0) return 1 ;
Display_Fast();
}
return 0;
}
uchar SendFirstToEnd(uchar kind,uchar mode,uchar si_flag,uchar ss_flag)
{
uchar tim,i;
putSPIchar(kind);
DelayNs(150);
putSPIchar(kind);
DelayNs(150);
SendSS(ss_flag);
SendSI(si_flag);
if(SpeedDelay(mode & 0x03)) return 1;
else
return 0;
}
char SendEndToFirst(uchar kind,uchar mode,uchar BC,uchar si_flag,uchar ss_flag)
{
uchar tim,i;
for(i=0;i<FLenghtCount;i++)
{
putSPIchar(BC);
DelayNs(150);
putSPIchar(BC);
DelayNs(150);
}
putSPIchar(kind);
DelayNs(150);
putSPIchar(kind);
DelayNs(150);
for(i=i+1;i<BLenghtCount;i++)
{
putSPIchar(BC);
DelayNs(150);
putSPIchar(BC);
DelayNs(150);
}
SendSS(ss_flag);
SendSI(si_flag);
if(SpeedDelay(mode & 0x03)) return 1;
else return 0;
}
char SendMiddleToEdge(uchar kind,uchar mode,uchar BC,uchar class)
{
uchar tim,i;
for(i=1;i<left;i++)
{
putSPIchar(BC);
DelayNs(150);
putSPIchar(BC);
DelayNs(150);
}
SendSS(1);
SendSI(class);
if(SpeedDelay(mode & 0x03)) return 1;
else return 0;
}
char SendEdgeToMiddle(uchar kind,uchar mode,uchar BC,uchar class)
{
uchar tim,i;
for(i=1;i<left;i++)
{
putSPIchar(BC);
DelayNs(150);
putSPIchar(BC);
DelayNs(150);
}
SendSS(1);
SendSI(class);
if(SpeedDelay(mode & 0x03)) return 1;
else return 0;
}
void AllColorProcess(uchar kind,uchar mode)
{
uchar tim,i,value;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
// SendFirstToEnd(value,mode & 0x0f,CLASSNUMBER,1);
for(tim=0;tim<val_lenght ;tim++)
{
if(SendFirstToEnd(value,mode & 0x0f,0,0)==1) return;
}
SendSS(1);
// Delay(250);
Display();
Display();
Display();
Display();
Display();
// for(tim=0;tim<200;tim +=2) //20070715 modify
for(tim=0;tim<200;tim +=4)
{
// SendSI(2); //20070715 modify
SendSI(4);
// Delay(30);
if(SpeedDelay(mode & 0x03)) return ;
}
}
}
}
void Three1ColorProcess(uchar kind,uchar mode)
{
uchar tim,i,value;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
SendFirstToEnd(value,mode & 0x0f,CLASSNUMBER,1);
for(tim=1;tim<val_lenght ;tim++)
{
if(SendFirstToEnd(UNLOCKDATA,mode & 0x0f,CLASSNUMBER,1)==1) return;
}
}
}
}
void Three1ColorProcess_1(uchar kind,uchar mode)
{
uchar tim,i,value;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
FLenghtCount=0;
SendEndToFirst(value,mode & 0x0f,UNLOCKDATA,CLASSNUMBER,1);
for(tim=1;tim<val_lenght;tim++)
{
FLenghtCount++;
if(SendEndToFirst(value,mode & 0x0f,UNLOCKDATA,CLASSNUMBER,1)==1) return;
}
}
}
}
void ThreeColorProcess(uchar kind,uchar mode)
{
uchar tim,i,value;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
for(tim=0;tim<val_lenght ;tim++)
{
if(SendFirstToEnd(value,mode & 0x0f,0,0)==1) return;
}
SendSS(1);
Display();
Display();
Display();
Display();
Display();
// for(tim=0;tim<200;tim +=2) //20070715 modify
for(tim=0;tim<200;tim +=4)
{
// SendSI(2);//20070715 modify
SendSI(4);
// Delay(30);
// if(SpeedDelay(mode & 0x03)) return ;
if(SpeedDelay(0)) return ;
}
}
}
}
void GetMiddleColor(uchar value)
{
switch(value)
{
case ALLSTAR1:
color1=BDATA | (SDATA2 <<GBIT)| (SDATA1 <<BBIT)| (SDATA1 <<RBIT);
color2=BDATA | (SDATA3 <<GBIT)| (SDATA1 <<BBIT)| (SDATA1 <<RBIT);
break;
case ALLSTAR2:
color1=BDATA | (SDATA1 <<GBIT)| (SDATA2 <<BBIT)| (SDATA1 <<RBIT);
color2=BDATA | (SDATA1 <<GBIT)| (SDATA3 <<BBIT)| (SDATA1 <<RBIT);
break;
case ALLSTAR3:
color1=BDATA | (SDATA1 <<GBIT)| (SDATA2 <<BBIT)| (SDATA2 <<RBIT);
color2=BDATA | (SDATA1 <<GBIT)| (SDATA3 <<BBIT)| (SDATA3 <<RBIT);
break;
case ALLSTAR4:
color1=BDATA | (SDATA2 <<GBIT)| (SDATA1 <<BBIT)| (SDATA2 <<RBIT);
color2=BDATA | (SDATA3 <<GBIT)| (SDATA1 <<BBIT)| (SDATA3 <<RBIT);
break;
case ALLSTAR5:
color1=BDATA | (SDATA2 <<GBIT)| (SDATA2 <<BBIT)| (SDATA1 <<RBIT);
color2=BDATA | (SDATA3 <<GBIT)| (SDATA3 <<BBIT)| (SDATA1 <<RBIT);
break;
case ALLSTAR0:
default:
color1=BDATA | (SDATA1 <<GBIT)| (SDATA1 <<BBIT)| (SDATA2 <<RBIT);
color2=BDATA | (SDATA1 <<GBIT)| (SDATA1 <<BBIT)| (SDATA3 <<RBIT);
break;
}
}
uchar UniteColor(uchar da1,uchar da2,uchar da3,uchar da4,uchar da5,uchar da6,uchar mode)
{
uchar tim,i=0;//,mode;
uchar loop1=16,loop2=70;
for(i=0;i<val_lenght;i++)
{
putSPIchar(da1);
DelayNs(50);
putSPIchar(da1);
DelayNs(50);
SendSS(1);
SendSI(loop1);
i++;
if(i>val_lenght)break;
if(SpeedDelay(mode & 0x03)==1) return 1;
putSPIchar(da2);
DelayNs(50);
putSPIchar(da2);
DelayNs(50);
SendSS(1);
SendSI(loop1);
i++;
if(i>val_lenght)break;
if(SpeedDelay(mode & 0x03)==1) return 1;
putSPIchar(da3);
DelayNs(50);
putSPIchar(da3);
DelayNs(50);
SendSS(1);
SendSI(loop1);
i++;
if(i>val_lenght)break;
if(SpeedDelay(mode & 0x03)==1) return 1;
putSPIchar(da4);
DelayNs(50);
putSPIchar(da4);
DelayNs(50);
SendSS(1);
SendSI(loop1);
i++;
if(i>val_lenght)break;
if(SpeedDelay(mode & 0x03)==1) return 1;
putSPIchar(da5);
DelayNs(50);
putSPIchar(da5);
DelayNs(50);
SendSS(1);
SendSI(loop1);
i++;
if(i>val_lenght)break;
if(SpeedDelay(mode & 0x03)==1) return 1;
putSPIchar(da6);
DelayNs(50);
putSPIchar(da6);
DelayNs(50);
SendSS(1);
SendSI(loop1);
if(SpeedDelay(mode & 0x03)==1) return 1;
}
// if(SpeedDelay(mode & 0x03)==1) return 1;
return 0;
}
void UniteColorProcess(uchar kind,uchar mode)
{
uchar tim,i,value;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
// GetMiddleColor(value);
if(UniteColor( value, UNITEC1,UNITEC2,UNITEC3, UNITEC4, UNITEC5,mode)==1) return;
}
}
}
void UniteColorRight(uchar da1,uchar da2,uchar da3,uchar da4,uchar da5,uchar da6,uint init)
{
// uchar tim;//,i;
uchar loop1=16,loop2=70;
uint val1=0x00,i;
if(FLenghtCount!=0)
{
val1=hmod(FLenghtCount,6);
switch(val1)
{
case 5:
putSPIchar(da5);
DelayNs(50);
putSPIchar(da5);
DelayNs(50);
case 4:
putSPIchar(da4);
DelayNs(50);
putSPIchar(da4);
DelayNs(50);
case 3:
putSPIchar(da3);
DelayNs(50);
putSPIchar(da3);
DelayNs(50);
case 2:
putSPIchar(da2);
DelayNs(50);
putSPIchar(da2);
DelayNs(50);
case 1:
putSPIchar(da1);
DelayNs(50);
putSPIchar(da1);
DelayNs(50);
break;
default:
break;
}
if(FLenghtCount>val1)
{
i=val1;
for(;i<FLenghtCount;i+=6)
{
putSPIchar(da6);
DelayNs(50);
putSPIchar(da6);
DelayNs(50);
putSPIchar(da5);
DelayNs(50);
putSPIchar(da5);
DelayNs(50);
putSPIchar(da4);
DelayNs(50);
putSPIchar(da4);
DelayNs(50);
putSPIchar(da3);
DelayNs(50);
putSPIchar(da3);
DelayNs(50);
putSPIchar(da2);
DelayNs(50);
putSPIchar(da2);
DelayNs(50);
if(BLenghtCount==0 && (i+6)>=FLenghtCount)break;
else{
putSPIchar(da1);
DelayNs(50);
putSPIchar(da1);
DelayNs(50);
}
}
}
}
i=init;
for(;i<BLenghtCount;i++)
{
putSPIchar(UNLOCKDATA);
DelayNs(50);
putSPIchar(UNLOCKDATA);
DelayNs(50);
}
}
void UniteColorProcess_1(uchar kind,uchar mode)
{
uchar i,value,j;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
// GetMiddleColor(value);
FLenghtCount=0;
BLenghtCount=val_lenght;
for(j=0;j<val_lenght;j++)
{
FLenghtCount++;
UniteColorRight(value, UNITEC1,UNITEC2,UNITEC3, UNITEC4, UNITEC5,FLenghtCount);
SendSS(1);
SendSI(16);
if(SpeedDelay(mode & 0x03)) return;;
}
}
}
}
void UniteColorLeft(uchar da1,uchar da2,uchar da3,uchar da4,uchar da5,uchar da6,uint loop)
{
uint tim,i;//,mode;
// uchar loop1=16,loop2=70;
if(loop>6)
{
// tim=loop;
for(;loop>=6;loop-=6)
{
putSPIchar(da1);
DelayNs(50);
putSPIchar(da1);
DelayNs(50);
putSPIchar(da2);
DelayNs(50);
putSPIchar(da2);
DelayNs(50);
putSPIchar(da3);
DelayNs(50);
putSPIchar(da3);
DelayNs(50);
putSPIchar(da4);
DelayNs(50);
putSPIchar(da4);
DelayNs(50);
putSPIchar(da5);
DelayNs(50);
putSPIchar(da5);
DelayNs(50);
putSPIchar(da6);
DelayNs(50);
putSPIchar(da6);
DelayNs(50);
}
}
i=0;
if(i<loop){
putSPIchar(da1);
DelayNs(50);
putSPIchar(da1);
DelayNs(50);
}
if(i+1<loop){
putSPIchar(da2);
DelayNs(50);
putSPIchar(da2);
DelayNs(50);
}
if(i+2<loop){
putSPIchar(da3);
DelayNs(50);
putSPIchar(da3);
DelayNs(50);
}
if(i+3<loop){
putSPIchar(da4);
DelayNs(50);
putSPIchar(da4);
DelayNs(50);
}
if(i+4<loop){
putSPIchar(da5);
DelayNs(50);
putSPIchar(da5);
DelayNs(50);
}
if(i+5<loop){
putSPIchar(da6);
DelayNs(50);
putSPIchar(da6);
DelayNs(50);
}
}
uchar UniteColorMiddleToEdge(uchar da1,uchar da2,uchar da3,uchar da4,uchar da5,uchar da6,uchar mode)
{
uint tim,i,diff,j;
//芯片数为双数, 为单数
HalfLenght=val_lenght/2;
// left =0;
// right=1;
FLenghtCount=1;
BLenghtCount=HalfLenght+1;
putSPIchar(da1);
DelayNs(50);
putSPIchar(da1);
DelayNs(50);
for(i=1;i<BLenghtCount;i++)
{
putSPIchar(UNLOCKDATA);
DelayNs(50);
putSPIchar(UNLOCKDATA);
DelayNs(50);
}
SendSS(1);
// SendSI(loop1);
if(SpeedDelay(mode & 0x03)) return 1;
// else return 0;
// AllStarRight(da1, da2, da3, da4,mode);
for(i=1;i<BLenghtCount;i++)
{
UniteColorLeft(da1, da2, da3, da4,da5,da6,i);
// left--;
// right++;
// diff=right - left;
FLenghtCount++;
UniteColorRight(da1, da2, da3, da4,da5,da6,FLenghtCount);
SendSS(1);
SendSI(16);
if(SpeedDelay(mode & 0x03)) return 1;
}
return 0;
}
//从中间向两边。
void UniteColorProcess_2(uchar kind,uchar mode)
{
uchar i,value;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
// GetMiddleColor(value);
if(UniteColorMiddleToEdge(value, UNITEC1,UNITEC2,UNITEC3, UNITEC4, UNITEC5,mode)==1) break;
}
}
}
uchar UniteColorEdgeToMiddle(uchar da1,uchar da2,uchar da3,uchar da4,uchar da5,uchar da6,uchar mode)
{
uint tim,i,diff,j;
//芯片数为双数, 为单数
HalfLenght=val_lenght/2;
// left =0;
// right=1;
FLenghtCount=1;
BLenghtCount=val_lenght-2;
for(i=1;i<=HalfLenght;i++)
{
UniteColorRight(da1, da2, da3, da4,da5,da6,0);
// left--;
// right++;
// diff=right - left;
FLenghtCount++;
UniteColorLeft(da1, da2, da3, da4,da5,da6,i);
SendSS(1);
SendSI(16);
if(SpeedDelay(mode & 0x03)) return 1;
if(BLenghtCount==1)
{
BLenghtCount=0;
UniteColorRight(da1, da2, da3, da4,da5,da6,0);
// FLenghtCount++;
UniteColorLeft(da1, da2, da3, da4,da5,da6,i+1);
SendSS(1);
SendSI(16);
if(SpeedDelay(mode & 0x03)) return 1;
return 0;
}
else
BLenghtCount-=2;
}
return 0;
}
//从两边向中间.
void UniteColorProcess_3(uchar kind,uchar mode)
{
uchar i,value;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
// GetMiddleColor(value);
if(UniteColorEdgeToMiddle(value, UNITEC1,UNITEC2,UNITEC3, UNITEC4, UNITEC5,mode)==1) break;
}
}
}
void AllStarProcess(uchar kind,uchar mode)
{
uchar tim,i,value;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
GetMiddleColor(value);
if(AllStar( value, color1, color2, ALLBLACK,mode)==1) return;
}
}
}
void AllStarProcess_1(uchar kind,uchar mode)
{
uchar i,value,j;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
GetMiddleColor(value);
FLenghtCount=0;
BLenghtCount=val_lenght;
for(j=0;j<val_lenght;j++)
{
FLenghtCount++;
AllStarRight(value, color1, color2, ALLBLACK,FLenghtCount);
SendSS(1);
SendSI(16);
if(SpeedDelay(mode & 0x03)) return;;
}
}
}
}
void AllStarLeft(uchar da1,uchar da2,uchar da3,uchar da4,uint loop)
{
uint tim,i;//,mode;
// uchar loop1=16,loop2=70;
if(loop>4)
{
// tim=loop;
for(;loop>=4;loop-=4)
{
putSPIchar(da1);
DelayNs(50);
putSPIchar(da1);
DelayNs(50);
putSPIchar(da2);
DelayNs(50);
putSPIchar(da2);
DelayNs(50);
putSPIchar(da3);
DelayNs(50);
putSPIchar(da3);
DelayNs(50);
putSPIchar(da4);
DelayNs(50);
putSPIchar(da4);
DelayNs(50);
}
}
i=0;
if(i<loop){
putSPIchar(da1);
DelayNs(50);
putSPIchar(da1);
DelayNs(50);
}
if(i+1<loop){
putSPIchar(da2);
DelayNs(50);
putSPIchar(da2);
DelayNs(50);
}
if(i+2<loop){
putSPIchar(da3);
DelayNs(50);
putSPIchar(da3);
DelayNs(50);
}
if(i+3<loop){
putSPIchar(da4);
DelayNs(50);
putSPIchar(da4);
DelayNs(50);
}
}
void AllStarRight(uchar da1,uchar da2,uchar da3,uchar da4,uint init)
{
// uchar tim;//,i;
uchar loop1=16,loop2=70;
uint val1=0x00,i;
if(FLenghtCount!=0)
{
val1=hmod(FLenghtCount,4);
switch(val1)
{
case 3:
putSPIchar(da3);
DelayNs(50);
putSPIchar(da3);
DelayNs(50);
case 2:
putSPIchar(da2);
DelayNs(50);
putSPIchar(da2);
DelayNs(50);
case 1:
putSPIchar(da1);
DelayNs(50);
putSPIchar(da1);
DelayNs(50);
break;
default:
break;
}
if(FLenghtCount>val1)
{
i=val1;
for(;i<FLenghtCount;i+=4)
{
putSPIchar(da4);
DelayNs(50);
putSPIchar(da4);
DelayNs(50);
putSPIchar(da3);
DelayNs(50);
putSPIchar(da3);
DelayNs(50);
putSPIchar(da2);
DelayNs(50);
putSPIchar(da2);
DelayNs(50);
if(BLenghtCount==0 && (i+4)>=FLenghtCount)break;
else{
putSPIchar(da1);
DelayNs(50);
putSPIchar(da1);
DelayNs(50);
}
}
}
}
i=init;
for(;i<BLenghtCount;i++)
{
putSPIchar(UNLOCKDATA);
DelayNs(50);
putSPIchar(UNLOCKDATA);
DelayNs(50);
}
// SendSS(1);
// SendSI(loop1);
// if(SpeedDelay(mode & 0x03)) return 1;
// else return 0;
}
uchar AllStarMiddleToEdge(uchar da1,uchar da2,uchar da3,uchar da4,uchar mode)
{
uint tim,i,diff,j;
//芯片数为双数, 为单数
HalfLenght=val_lenght/2;
// left =0;
// right=1;
FLenghtCount=1;
BLenghtCount=HalfLenght+1;
putSPIchar(da1);
DelayNs(50);
putSPIchar(da1);
DelayNs(50);
for(i=1;i<BLenghtCount;i++)
{
putSPIchar(UNLOCKDATA);
DelayNs(50);
putSPIchar(UNLOCKDATA);
DelayNs(50);
}
SendSS(1);
// SendSI(loop1);
if(SpeedDelay(mode & 0x03)) return 1;
// else return 0;
// AllStarRight(da1, da2, da3, da4,mode);
for(i=1;i<BLenghtCount;i++)
{
AllStarLeft(da1, da2, da3, da4,i);
// left--;
// right++;
// diff=right - left;
FLenghtCount++;
AllStarRight(da1, da2, da3, da4,FLenghtCount);
SendSS(1);
SendSI(16);
if(SpeedDelay(mode & 0x03)) return 1;
}
return 0;
}
//从中间向两边。
void AllStarProcess_2(uchar kind,uchar mode)
{
uchar i,value;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
GetMiddleColor(value);
if(AllStarMiddleToEdge(value, color1, color2, ALLBLACK,mode)==1) break;
}
}
}
uchar AllStarEdgeToMiddle(uchar da1,uchar da2,uchar da3,uchar da4,uchar mode)
{
uint tim,i,diff,j;
//芯片数为双数, 为单数
HalfLenght=val_lenght/2;
// left =0;
// right=1;
FLenghtCount=1;
BLenghtCount=val_lenght-2;
for(i=1;i<=HalfLenght;i++)
{
AllStarRight(da1, da2, da3, da4,0);
// left--;
// right++;
// diff=right - left;
FLenghtCount++;
AllStarLeft(da1, da2, da3, da4,i);
SendSS(1);
SendSI(16);
if(SpeedDelay(mode & 0x03)) return 1;
if(BLenghtCount==1)
{
BLenghtCount=0;
AllStarRight(da1, da2, da3, da4,0);
// FLenghtCount++;
AllStarLeft(da1, da2, da3, da4,i+1);
SendSS(1);
SendSI(16);
if(SpeedDelay(mode & 0x03)) return 1;
return 0;
}
else
BLenghtCount-=2;
}
return 0;
}
void AllStarProcess_3(uchar kind,uchar mode)
{
uchar i,value;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
GetMiddleColor(value);
if(AllStarEdgeToMiddle(value, color1, color2, ALLBLACK,mode)==1) break;
}
}
}
void SevenColorProcess(uchar kind,uchar mode)
{
uchar tim,i,value;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
// SendFirstToEnd(value,mode & 0x0f,CLASSNUMBER,1);
SendFirstToEnd(value,mode & 0x0f,0x00,1);
for(tim=1;tim<val_lenght ;tim++)
{
if(SendFirstToEnd(UNLOCKDATA,mode & 0x0f,CLASSNUMBER,1)==1) return;
}
}
}
}
void SevenColorProcess_1(uchar kind,uchar mode)
{
uchar tim,i,value;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
FLenghtCount=0;
SendEndToFirst(value,mode & 0x0f,UNLOCKDATA,0,1);
for(tim=1;tim<val_lenght;tim++)
{
FLenghtCount++;
if(SendEndToFirst(value,mode & 0x0f,UNLOCKDATA,CLASSNUMBER,1)==1) return;
}
}
}
}
void SixColorProcess(uchar kind,uchar mode)
{
uchar tim,i,value;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
for(tim=0;tim<val_lenght ;tim++)
{
if(SendFirstToEnd(value,mode & 0x0f,0,1)==1) return;
}
}
}
}
void SixColorProcess_1(uchar kind,uchar mode)
{
uchar tim,i,value;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
FLenghtCount=0;
// SendEndToFirst(value,mode & 0x0f,ALLBLACK);
SendEndToFirst(value,mode & 0x0f,UNLOCKDATA,CLASSNUMBER,1);
for(tim=1;tim<val_lenght;tim++)
{
FLenghtCount++;
// if(SendEndToFirst(value,mode & 0x0f,ALLBLACK)==1) break;
if(SendEndToFirst(value,mode & 0x0f,UNLOCKDATA,CLASSNUMBER,1)==1) return;
}
}
}
}
void SixColorProcess_2(uchar kind,uchar mode,uchar class)
{
uchar tim,i,value;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
for(tim=0;tim<val_lenght;tim++)
{
if(ProcessMiddleToEdge(value,mode,UNLOCKDATA,class)==1) return;
}
}
}
}
void SixColorProcess_3(uchar kind,uchar mode,uchar class)
{
uchar tim,i,value;
for(i=0;i<7;i++)
{
value=KindGroudData[kind][i];
if(value!=0x00)
{
for(tim=0;tim<val_lenght;tim++)
{
if(ProcessEdgeToMiddle(value,mode,UNLOCKDATA,class)==1) return;
}
}
}
}
char SendKindData(char kind)
{
uchar mode,tim,i,diff,j=0;
uchar c1,c2,c3,data;
mode =KindDataStr[kind][1];
data =KindDataStr[kind][0];
switch(mode & 0x0c)
{
case DIR0:
//从前向后,正向。
switch(data)
{
case SIX_ID:
SixColorProcess(SIX_ID,mode);
break;
case ALL_ID:
SevenColorProcess(ALL_ID,mode);
break;
case STAR_ID:
AllStarProcess(STAR_ID,mode);
break;
case SEVEN_ID:
SevenColorProcess(SEVEN_ID,mode);
break;
case THREE_ID:
ThreeColorProcess(THREE_ID,mode);
break;
case THREE1_ID:
Three1ColorProcess(THREE1_ID,mode);
break;
case ALLCOLOR_ID:
AllColorProcess(ALLCOLOR_ID,mode);
break;
case UNITEC_ID:
UniteColorProcess(UNITEC_ID,mode);
break;
default:
break;
}
break;
case DIR1:
//从后向前,反向。
BLenghtCount=val_lenght;
switch(data)
{
case SIX_ID:
SixColorProcess_1(SIX_ID,mode);
break;
case ALL_ID:
SevenColorProcess_1(ALL_ID,mode);
break;
case STAR_ID:
AllStarProcess_1(STAR_ID,mode);
break;
case SEVEN_ID:
SevenColorProcess_1(SEVEN_ID,mode);
break;
case THREE1_ID:
Three1ColorProcess_1(THREE1_ID,mode);
break;
case UNITEC_ID:
UniteColorProcess_1(UNITEC_ID,mode);
break;
default:
break;
}
break;
case DIR2:
//从中间向两边。
switch(data)
{
case SIX_ID:
SixColorProcess_2(SIX_ID,mode,0);
break;
case ALL_ID:
SixColorProcess_2(ALL_ID,mode,CLASSNUMBER);
break;
case STAR_ID:
BLenghtCount=val_lenght;
AllStarProcess_2(STAR_ID,mode);
break;
case UNITEC_ID:
UniteColorProcess_2(UNITEC_ID,mode);
break;
default:
break;
}
break;
case DIR3:
//从两边向中间。
switch(data)
{
case SIX_ID:
SixColorProcess_3(SIX_ID,mode,0);
break;
case ALL_ID:
SixColorProcess_3(ALL_ID,mode,CLASSNUMBER);
break;
case STAR_ID:
AllStarProcess_3(STAR_ID,mode);
break;
case UNITEC_ID:
UniteColorProcess_3(UNITEC_ID,mode);
break;
default:
break;
}
break;
default:
break;
}
return 0;
}
uchar ProcessMiddleToEdge(char data,uchar mode,uchar BC,uchar class )
{
uchar tim,i,diff,j;
// AllClearICBuffer();
// mode=KindDataStr[kind][1];
HalfLenght=val_lenght/2;
if((HalfLenght *2)==val_lenght)
{
//芯片数为双数
left=HalfLenght;
right=HalfLenght+1;
putSPIchar(data);
DelayNs(150);
putSPIchar(data);
DelayNs(150);
putSPIchar(data);
DelayNs(150);
putSPIchar(data);
DelayNs(150);
if(SendMiddleToEdge(data,mode,BC,class)==1) return 1;
}
else
{
//芯片数为单数
left =HalfLenght+1;
right=left;
putSPIchar(data);
DelayNs(150);
putSPIchar(data);
DelayNs(150);
if(SendMiddleToEdge(data,mode,BC,class)==1) return 1;
}
for(i=1;i<HalfLenght;i++)
{
left--;
right++;
diff=right - left;
putSPIchar(data);
DelayNs(150);
putSPIchar(data);
DelayNs(150);
for(j=1;j<diff;j++)
{
putSPIchar(BC);
DelayNs(150);
putSPIchar(BC);
DelayNs(150);
}
putSPIchar(data);
DelayNs(150);
putSPIchar(data);
DelayNs(150);
if(SendMiddleToEdge(data,mode,BC,class)==1) return 1;
}
return 0;
}
uchar ProcessEdgeToMiddle(char data,uchar mode,uchar BC,uchar class)
{
uchar tim,i,diff,j,k;
// mode=KindDataStr[kind][1];
left =1;
right=val_lenght;
diff=right - left;
HalfLenght=val_lenght/2;
for(i=1;i<HalfLenght;i++)
{
for(k=1;k<left;k++)
{
putSPIchar(BC);
DelayNs(150);
putSPIchar(BC);
DelayNs(150);
}
putSPIchar(data);
DelayNs(150);
putSPIchar(data);
DelayNs(150);
for(j=1;j<diff;j++)
{
putSPIchar(BC);
DelayNs(150);
putSPIchar(BC);
DelayNs(150);
}
putSPIchar(data);
DelayNs(150);
putSPIchar(data);
DelayNs(150);
if(SendEdgeToMiddle(data,mode,BC,class)==1) return 1;
left++;
right--;
diff=right - left;
if(diff==0)
{
for(k=1;k<left;k++)
{
putSPIchar(BC);
DelayNs(150);
putSPIchar(BC);
DelayNs(150);
}
putSPIchar(data);
DelayNs(150);
putSPIchar(data);
DelayNs(150);
// SendEdgeToMiddle(data,mode,BC);
if(SendEdgeToMiddle(data,mode,BC,class)==1) return 1;
break;
}
else if(diff==1)
{
for(k=1;k<left;k++)
{
putSPIchar(BC);
DelayNs(150);
putSPIchar(BC);
DelayNs(150);
}
putSPIchar(data);
DelayNs(150);
putSPIchar(data);
DelayNs(150);
putSPIchar(data);
DelayNs(150);
putSPIchar(data);
DelayNs(150);
// SendEdgeToMiddle(data,mode,BC);
if(SendEdgeToMiddle(data,mode,BC,class)==1) return 1;
}
}
return 0;
}
#if 0
void EEPROM_write1(unsigned int uiAddress, unsigned char ucData)
{
/* 等待上一次写操作结束 */
while(EECR & (1<<EEWE)) ;
/* 设置地址和数据寄存器*/
EEAR = uiAddress;
EEDR = ucData;
/* 置位EEMWE */
EECR |= (1<<EEMWE);
/* 置位EEWE 以启动写操作*/
EECR |= (1<<EEWE);
}
unsigned char EEPROM_read1(unsigned int uiAddress)
{
/* 等待上一次写操作结束 */
while(EECR & (1<<EEWE));
/* 设置地址寄存器*/
EEAR = uiAddress;
/* 设置EERE 以启动读操作*/
EECR |= (1<<EERE);
/* 自数据寄存器返回数据 */
return EEDR;
}
void EepromTest(void)
{
unsigned char temp1,temp2; /*定义变量*/
unsigned char buffer[10]; /*定义数组*/
unsigned char buf[]="AVR与虚拟仪器"; /*定义字符串*/
EEPROMwrite(0x10,'a'); /*单字符写入到0x10,注意是单引号*/
temp1 = EEPROMread(0x10); /*读一个字符到temp1*/
EEPROM_WRITE(0x20,"abcdefg"); /*写字符串到0x20*/
EEPROM_READ(0x20,temp2); /*读字符到temp2,temp2=a*/
EEPROM_READ(0x20,buffer); /*读字符串到数组中 buffer[10]=abcdefg */
EEPROM_WRITE(0x30,buf); /*数组中的值写到EEPROM中:0X30开始为"AVR与虚拟仪器"*/
}
#endif
void EepromICnumberWr(void)
{
//use 4 bytes save IC number
//address: 0x02,0x03,0x04,0x05
unsigned char bit; /*定义变量*/
unsigned char buffer[5]; /*定义数组*/
long loop;
if(val_lenght > MAXVAL_LENGHT) val_lenght = MINVAL_LENGHT;
loop=val_lenght;
bit=loop/1000;
buffer[0]=bit;
loop=loop-bit *1000;
bit=loop/100;
buffer[1]=bit;
loop=loop-bit *100;
bit=loop/10;
buffer[2]=bit;
loop=loop-bit *10;
buffer[3]=loop;
buffer[4]=0x00;
EEPROM_WRITE(0x02,buffer); /*数组中的值写到EEPROM中:0X02开始为*/
}
void EepromICnumberRd(void)
{
//use 4 bytes save IC number
//address: 0x02,0x03,0x04,0x05
unsigned char buffer[5]; /*定义数组*/
EEPROM_READ(0x02,buffer); /*读字符串到数组中 buffer[10]=abcdefg */
val_lenght=buffer[0] * 1000+buffer[1] * 100+buffer[2] * 10+buffer[3];
if(val_lenght > MAXVAL_LENGHT) val_lenght = MINVAL_LENGHT;
}
void FactorySetup(void)
{
uchar i;
ModeStatus=MODE_NOMALE;
CurrentKey=KEY_FUNCTION;
BackKey=KEY_FUNCTION;
CurrentKind=KIND0;
K1Count=0;
val_kind=0;
Oneday=0xff;
// val_lenght=MINVAL_LENGHT;
for(i=0;i<MAXVAL_KIND;i++)
{
KindData[i]=TRUE;
}
DayData[0]=200;
DayData[1]=0;
}
void EepromViewModeWr(void)
{
//use 112 bytes save View mode
//address: 0x20,0x21,0x22, ... , 0x20+112
EEPROM_WRITE(0x20,KindData); /*数组中的值写到EEPROM中:0X10开始为*/
}
void EepromViewModeRd(void)
{
//use 112 bytes save View mode
//address: 0x20,0x21,0x22, ... , 0x20+112
// unsigned char buffer[5]; /*定义数组*/
EEPROM_READ(0x20,KindData); /*读字符串到数组中 buffer[10]=abcdefg */
}
void EepromPasswordRd(void)
{
//use 5 bytes save password
//address: 0x08,0x09,0x0a,0x0b,0x0c;
uchar i;
EEPROM_READ(0x08,PasswordData); /*读字符串到数组中 buffer[10]=abcdefg */
for(i=0;i<(PASSWORDLENGHT-1);i++)
{
if(PasswordData[i] !=PASS_DISABLE)
{
Password_Enable=TRUE;
return;
}
}
Password_Enable=FALSE;
}
void EepromPasswordWr(void)
{
//use 5 bytes save password
//address: 0x08,0x09,0x0a,0x0b,0x0c;
EEPROM_WRITE(0x08,PasswordData); /*数组中的值写到EEPROM中:0X10开始为*/
}
void EepromDayDataRd(void)
{
//use 2 bytes save date value
//address: 0x0d,0e;
EEPROM_READ(0x0d,DayData); /*读字符串到数组中 buffer[10]=abcdefg */
}
void EepromDayDataWr(void)
{
//use 2 bytes save date value
//address: 0x0d,0e;
EEPROM_WRITE(0x0d,DayData); /*数组中的值写到EEPROM中:0X10开始为*/
}
void EepromDateValueRd(void)
{
//use 6 bytes save date value
//address: 0x10,0x11,0x12,0x13,0x14,0x15;
EEPROM_READ(0x10,DateValue); /*读字符串到数组中 buffer[10]=abcdefg */
}
void EepromDateValueWr(void)
{
//use 6 bytes save date value
//address: 0x10,0x11,0x12,0x13,0x14,0x15;
DateValue[0]=(YEAR_SETUP & 0x0f)+((YEAR_SETUP & 0xf0) >>4) *10;
DateValue[1]=(MONTH_SETUP & 0x0f)+((MONTH_SETUP & 0x10) >>4) *10;
DateValue[2]=(DAY_SETUP & 0x0f)+((DAY_SETUP & 0x30) >>4) *10;
DateValue[3]=0x0;
EEPROM_WRITE(0x10,DateValue); /*数组中的值写到EEPROM中:0X10开始为*/
}
//////////////////////////////////////////////
//程序开始
void DS1302_Write(uchar reg,uchar data)
{
uchar i;
Set_DS1302_DDRSDA();
Clr_DS1302_RST();
asm("nop");
asm("nop");
Clr_DS1302_SCLK();
asm("nop");
asm("nop");
Set_DS1302_RST();
asm("nop");
asm("nop");
for(i=8;i>0;i--)
{
if(reg&0x01) Set_DS1302_SDA();
else Clr_DS1302_SDA();
asm("nop");
asm("nop");
Set_DS1302_SCLK();
asm("nop");
asm("nop");
Clr_DS1302_SCLK();
asm("nop");
asm("nop");
reg>>=1;
}
for(i=8;i>0;i--)
{
if(data&0x01) Set_DS1302_SDA();
else Clr_DS1302_SDA();
asm("nop");
asm("nop");
Set_DS1302_SCLK();
asm("nop");
asm("nop");
Clr_DS1302_SCLK();
asm("nop");
asm("nop");
data>>=1;
}
Clr_DS1302_RST();
asm("nop");
asm("nop");
Clr_DS1302_DDRSDA();
}
uchar DS1302_Read(uchar reg)
{
uchar data=0,i;
reg+=1;//读标志
Set_DS1302_DDRSDA();
Clr_DS1302_RST();
asm("nop");
asm("nop");
Clr_DS1302_SCLK();
asm("nop");
asm("nop");
Set_DS1302_RST();
asm("nop");
asm("nop");
for(i=8;i>0;i--)
{
if(reg&0x01) Set_DS1302_SDA();
else Clr_DS1302_SDA();
asm("nop");
asm("nop");
Set_DS1302_SCLK();
asm("nop");
asm("nop");
Clr_DS1302_SCLK();
asm("nop");
asm("nop");
reg>>=1;
}
Clr_DS1302_DDRSDA();
for(i=8;i>0;i--)
{
data>>=1;
if((PIND&(1<<DS1302_SDA))==(1<<DS1302_SDA)) data|=0x80;
Set_DS1302_SCLK();
asm("nop");
asm("nop");
Clr_DS1302_SCLK();
asm("nop");
asm("nop");
}
Clr_DS1302_RST();
asm("nop");
asm("nop");
return(data);
}
uchar Check_DS1302(void)
{
DS1302_Write(DS1302_CONTROL_Reg,0x80);
if(DS1302_Read(DS1302_CONTROL_Reg)==0x80) return 1;
return 0;
}
void DS1302_Init(void)
{
DS1302_Write(DS1302_CONTROL_Reg,0x00);//关闭写保护
DS1302_Write(DS1302_SEC_Reg,0x80);//暂停
DS1302_Write(DS1302_CHARGER_Reg,0xa9);//涓流充电
DS1302_Write(DS1302_YEAR_Reg,INIT_YEAR); //年
DS1302_Write(DS1302_MONTH_Reg,INIT_MONTH); //月
DS1302_Write(DS1302_DATE_Reg,INIT_DATE); //日
DS1302_Write(DS1302_DAY_Reg,INIT_DAY); //周
DS1302_Write(DS1302_HR_Reg,INIT_HOUR); //时
DS1302_Write(DS1302_MIN_Reg,INIT_MINUTE); //分
DS1302_Write(DS1302_SEC_Reg,INIT_SECOND); //秒
DS1302_Write(DS1302_CONTROL_Reg,0x80);//打开写保护
}
#if 0
void ReadTime(void)
{
uchar data;
data=DS1302_Read(DS1302_YEAR_Reg);//年
year0=data&0x0f;
year1=data>>4;
data=DS1302_Read(DS1302_MONTH_Reg);//月
month0=data&0x0f;
month1=(data>>4)&0x01;
data=DS1302_Read(DS1302_DATE_Reg);//日
date0=data&0x0f;
date1=(data>>4)&0x03;
data=DS1302_Read(DS1302_DAY_Reg);//周
day=data&0x07;
data=DS1302_Read(DS1302_HR_Reg);//时
hour0=data&0x0f;
hour1=(data>>4)&0x03;
data=DS1302_Read(DS1302_MIN_Reg);//分
minute0=data&0x0f;
minute1=(data>>4)&0x07;
data=DS1302_Read(DS1302_SEC_Reg);//秒
second0=data&0x0f;
second1=(data>>4)&0x07;
}
#endif
void ReadTime(void)
{
uchar data;
data=DS1302_Read(DS1302_YEAR_Reg);//年
year0=data&0x0f;
year1=data>>4;
year1=year1 * 10 +year0;
data=DS1302_Read(DS1302_MONTH_Reg);//月
month0=data&0x0f;
month1=(data>>4)&0x01;
month1=month1 * 10 + month0;
data=DS1302_Read(DS1302_DATE_Reg);//日
date0=data&0x0f;
date1=(data>>4)&0x03;
date1=date1 * 10 + date0;
}
int CalMonthDay(uchar month,uchar day)
{
uint total;
switch(month)
{
case 2:
total=31;
break;
case 3:
total=59;
break;
case 4:
total=90;
break;
case 5:
total=120;
break;
case 6:
total=151;
break;
case 7:
total=181;
break;
case 8:
total=212;
break;
case 9:
total=243;
break;
case 10:
total=273;
break;
case 11:
total=304;
break;
case 12:
total=334;
break;
case 1:
default:
total=0;
break;
}
total=total+day;
return total;
}
int CompareDate(void)
{
int temp1,temp2;
int day_diff=-1;
if(year1 > DateValue[0])
{
temp1=year1-DateValue[0];
temp2= temp1 * 365;
temp1=temp2+CalMonthDay(month1, date1);
temp2=CalMonthDay(DateValue[1], DateValue[2]);
day_diff=temp1-temp2;
}
else if(year1 == DateValue[0])
{
temp1=CalMonthDay(month1, date1);
temp2=CalMonthDay(DateValue[1], DateValue[2]);
if(temp1>=temp2)
day_diff=temp1-temp2;
}
return day_diff;
}
/*
本程序简单的示范了如何使用ATMEGA16的定时器
AVR定时器的要点介绍
T0工作于CTC模式,输出1KHz/2KHz 50%占空比的方波
T1工作于快速PWM模式兼输入捕捉
T2工作于相位修正PWM模式,输出490Hz的8bit PWM波
出于简化程序考虑,各种数据没有对外输出,学习时建议使用JTAG ICE硬件仿真器
对于定时器,AVRstudio的软件仿真是不准确的。
*/
//#include <avr/io.h>
//#include <avr/signal.h>
//#include <avr/interrupt.h>
//时钟定为8MHz,F_CPU=8000000
//管脚定义
#define ICPKEY 6 //ICP1 PD6 按键模拟ICP输入
#define PWM0 3 //OC0 PB3
#define PWM1A 5 //OC1A PD5
#define PWM1B 4 //OC1B PD4
#define PWM2 7 //OC2 PD7
//宏定义
#define PWM1A_ON() PORTD|= (1<<PWM1A) //输出高电平,灯亮
#define PWM1A_OFF() PORTD&=~(1<<PWM1A) //输出低电平,灯灭
//全局变量
volatile unsigned int ICP_Time; //记录ICP输入捕捉事件的发生时刻
volatile unsigned char T2PWM; //设置T2的PWM值
volatile unsigned char T0OCR; //设置T0的时间值
//仿真时在watch窗口,监控这些变量。
void timer0_init(void) //CTC模式输出1KHz/2KHz方波
{
T2PWM=0x80;
T0OCR=30;
ICP_Time=0x0000;
OCR0 = T0OCR; //设定TOP值
//TOP=8000000/(2*64*1000)-1=61.5 选61 1.008KHz(0.992mS)
//TOP=8000000/(2*64*2000)-1=30.25 选30 2.016KHz(0.496ms)
TCCR0 = (1<<WGM01)|(0<<WGM00)|(0<<COM01)|(1<<COM00)|(0<<CS02)|(1<<CS01)|(1<<CS00);
//64分频,CTC模式,OC0取反输出方波
TIMSK = (1<<TICIE1)|(1<<OCIE1A); //使能T1输入捕捉中断,T1输出比较A匹配中断(作定时用)
}
void timer1_init(void)
{
OCR1A = 39062; //设定TOP值.时间5S(0.2Hz)
//TOP=8000000/(1024*0.2)=39062.5
OCR1B = 15624; //设定OC1B的PWM值 约2秒钟 40%
TCCR1A = (1<<COM1B1)|(0<<COM1B0)|(1<<WGM11)|(1<<WGM10);
TCCR1B = (0<<ICES1)|(1<<WGM13)|(1<<WGM12)|(1<<CS12)|(0<<CS11)|(1<<CS10);
//1024分频,WGM1=15 快速PWM模式,TOP=OCRnA,ICP下降沿触发,OC1B正向PWM输出,OC1A为普通IO
}
SIGNAL(SIG_INPUT_CAPTURE1) //输入捕捉中断
{
ICP_Time=ICR1; //读取ICP输入捕捉事件的发生时刻
}
SIGNAL(SIG_OUTPUT_COMPARE1A)//T1输出比较A匹配中断
{
//在WGM1=15 快速PWM模式下,TOP=39062等同于5S左右的定时中断
T2PWM+=10;
OCR2=T2PWM; //修改T2的PWM值
if (T0OCR==61)
T0OCR=30; //改成1KHz
else
T0OCR=61; //改成2KHz
OCR0=T0OCR; //修改T0的时间值
}
#pragma interrupt_handler tim0_ovf_isr:10
//tim0_ovf_isr:11 ;atmega16 ,TIME0_ovf_vecter
#pragma interrupt_handler tim0_comp_isr:20
//tim0_comp_isr:20 ;atmega16 ,TIME0_comp_vecter
void tim0_ovf_isr(void)
{
}
void tim0_comp_isr(void)
{
}
/*
程序运行效果
引脚OC0(每5秒钟切换)交替输出1KHz和2KHz的50%占空比方波,接到无源蜂鸣器上,能听到不同频率的声音
引脚OC1B输出0.2Hz的40%占空比的PWM波,精度39061级(略大于15bit)
引脚OC2输出490Hz的PWM波,精度8bit,每5秒钟PWM值增大10级,对应的LED亮度将会随之变化)
ICP由引脚ICP1上的按键触发,ICP_Time将会记录下时间发生的时刻(相对于T1定时器的本次计数开始时间),
如果数值大于15624(约2秒),OC1A输出高电平,否则输出低电平(刚好跟OC1B反相)
如果使用AVR-51实验板作本实验,注意输出电平和LED的关系。还有蜂鸣器的声音较大,耳朵比较难受)
*/