#define SYSCLK 22118400
#define DF_CHIP_NOSELECT P5 |= 0x8; // P53 DataFlash chip select port pin (P23)
#define RAM_CHIP_SELECT_BANK0 ES0=1;P4 = 0xF4;
#define RAM_CHIP_SELECT_BANK1 P4 = 0xF5;
#define BUFFER_1 0x00 // buffer 1
#define BUFFER_2 0x01 // buffer 2
#define BUFFER_1_WRITE 0x84 // buffer 1 write
#define BUFFER_2_WRITE 0x87 // buffer 2 write
#define BUFFER_1_READ 0x54 // buffer 1 read (change to 0xD4 for SPI mode 0,3)
#define BUFFER_2_READ 0x56 // buffer 2 read (change to 0xD6 for SPI mode 0,3)
#define B1_TO_PAGE_WITH_ERASE 0x83 // buffer 1 to main memory page program with built-in erase
#define B2_TO_PAGE_WITH_ERASE 0x86 // buffer 2 to main memory page program with built-in erase
#define B1_TO_PAGE_WITHOUT_ERASE 0x88 // buffer 1 to main memory page program without built-in erase
#define B2_TO_PAGE_WITHOUT_ERASE 0x89 // buffer 2 to main memory page program without built-in erase
#define PAGE_PROG_THROUGH_B1 0x82 // main memory page program through buffer 1
#define PAGE_PROG_THROUGH_B2 0x85 // main memory page program through buffer 2
#define AUTO_PAGE_REWRITE_THROUGH_B1 0x58 // auto page rewrite through buffer 1
#define AUTO_PAGE_REWRITE_THROUGH_B2 0x59 // auto page rewrite through buffer 2
#define PAGE_TO_B1_COMP 0x60 // main memory page compare to buffer 1
#define PAGE_TO_B2_COMP 0x61 // main memory page compare to buffer 2
#define PAGE_TO_B1_XFER 0x53 // main memory page to buffer 1 transfer
#define PAGE_TO_B2_XFER 0x55 // main memory page to buffer 2 transfer
#define STATUS_REGISTER 0x57
#define MAIN_MEMORY_PAGE_READ 0x52 // main memory page read (change to 0xD2 for SPI mode 0,3)
#define PAGE_ERASE 0x81 // erase a 528 byte page
#define BLOCK_ERASE 0x50 // erase 512 pages
//=======================================================
#pragma NOAREGS // 如果MCS51使用键盘中断功能,那么建议加入此编译选项
#define DELAY_1US {_nop_();_nop_();} // MCS51<=30MHz
/* 4线接口的连接*/
sbit CH452_DCLK=P2^5; // 串行数据时钟上升延激活
sbit CH452_DIN=P2^7; // 串行数据输出,接CH452的数据输入
sbit CH452_LOAD=P1^5; // 串行命令加载,上升延激活
sbit CH452_DOUT=P3^3; // INT1,键盘中断和键值数据输入,接CH452的数据输出
/* 2线接口的位操作,与单片机有关 */
#define CH452_SCL_SET {CH452_SCL=1;}
#define CH452_SCL_CLR {CH452_SCL=0;}
#define CH452_SCL_D_OUT {} // 设置SCL为输出方向,对于双向I/O需切换为输出
#define CH452_SDA_SET {CH452_SDA=1;}
#define CH452_SDA_CLR {CH452_SDA=0;}
#define CH452_SDA_IN (CH452_SDA)
#define CH452_SDA_D_OUT {} // 设置SDA为输出方向,对于双向I/O需切换为输出
#define CH452_SDA_D_IN {CH452_SDA=1;} // 设置SDA为输入方向,对于双向I/O需切换为输入
/* 4线接口的位操作,与单片机有关 */
#define CH452_DCLK_SET {CH452_DCLK=1;}
#define CH452_DCLK_CLR {CH452_DCLK=0;}
#define CH452_DCLK_D_OUT {} // 设置DCLK为输出方向,对于双向I/O需切换为输出
#define CH452_DIN_SET {CH452_DIN=1;}
#define CH452_DIN_CLR {CH452_DIN=0;}
#define CH452_DIN_D_OUT {} // 设置DIN为输出方向,对于双向I/O需切换为输出
#define CH452_LOAD_SET {CH452_LOAD=1;}
#define CH452_LOAD_CLR {CH452_LOAD=0;}
#define CH452_LOAD_D_OUT {} // 设置LOAD为输出方向,对于双向I/O需切换为输出
#define CH452_DOUT_D_IN {CH452_DOUT=1;} // 设置DOUT为输入方向,对于双向I/O需切换为输入
/* 与单片机有关,与中断连接方式有关 */
//#define USE_CH452_KEY 1 // 使用了CH452的按键中断
#ifdef USE_CH452_KEY
#define DISABLE_KEY_INTERRUPT {EX1=0;}
#define ENABLE_KEY_INTERRUPT {EX1=1;}
#define CLEAR_KEY_INTER_FLAG {IE1=0;}
#else
#define DISABLE_KEY_INTERRUPT {}
#define ENABLE_KEY_INTERRUPT {}
#define CLEAR_KEY_INTER_FLAG {}
#endif
//=======================================================
/* 常量定义 */
/* CH451和CH452的常用命令码 */
#define CH452_NOP 0x0000 // 空操作
#define CH452_RESET 0x0201 // 复位
#define CH452_LEVEL 0x0100 // 加载光柱值,需另加7位数据
#define CH452_CLR_BIT 0x0180 // 段位清0,需另加6位数据
#define CH452_SET_BIT 0x01C0 // 段位置1,需另加6位数据
#define CH452_SLEEP 0x0202 // 进入睡眠状态
#define CH452_LEFTMOV 0x0300 // 设置移动方式-左移
#define CH452_LEFTCYC 0x0301 // 设置移动方式-左循环
#define CH452_RIGHTMOV 0x0302 // 设置移动方式-右移
#define CH452_RIGHTCYC 0x0303 // 设置移动方式-右循环
#define CH452_SELF_BCD 0x0380 // 自定义BCD码,需另加7位数据
#define CH452_SYSOFF 0x0400 // 关闭显示、关闭键盘
#define CH452_SYSON1 0x0401 // 开启显示
#define CH452_SYSON2 0x0403 // 开启显示、键盘
#define CH452_SYSON2W 0x0423 // 开启显示、键盘, 真正2线接口
#define CH452_NO_BCD 0x0500 // 设置默认显示方式,可另加3位扫描极限
#define CH452_BCD 0x0580 // 设置BCD译码方式,可另加3位扫描极限
#define CH452_TWINKLE 0x0600 // 设置闪烁控制,需另加8位数据
#define CH452_GET_KEY 0x0700 // 获取按键,返回按键代码
#define CH452_DIG0 0x0800 // 数码管位0显示,需另加8位数据
#define CH452_DIG1 0x0900 // 数码管位1显示,需另加8位数据
#define CH452_DIG2 0x0a00 // 数码管位2显示,需另加8位数据
#define CH452_DIG3 0x0b00 // 数码管位3显示,需另加8位数据
#define CH452_DIG4 0x0c00 // 数码管位4显示,需另加8位数据
#define CH452_DIG5 0x0d00 // 数码管位5显示,需另加8位数据
#define CH452_DIG6 0x0e00 // 数码管位6显示,需另加8位数据
#define CH452_DIG7 0x0f00 // 数码管位7显示,需另加8位数据
// BCD译码方式下的特殊字符
#define CH452_BCD_SPACE 0x10
#define CH452_BCD_PLUS 0x11
#define CH452_BCD_MINUS 0x12
#define CH452_BCD_EQU 0x13
#define CH452_BCD_LEFT 0x14
#define CH452_BCD_RIGHT 0x15
#define CH452_BCD_UNDER 0x16
#define CH452_BCD_CH_H 0x17
#define CH452_BCD_CH_L 0x18
#define CH452_BCD_CH_P 0x19
#define CH452_BCD_DOT 0x1A
#define CH452_BCD_SELF 0x1E
#define CH452_BCD_TEST 0x88
#define CH452_BCD_DOT_X 0x80
// 有效按键代码
#define CH452_KEY_MIN 0x40
#define CH452_KEY_MAX 0x7F
// 2线接口的CH452定义
#define CH452_I2C_ADDR0 0x40 // CH452的ADDR=0时的地址
#define CH452_I2C_ADDR1 0x60 // CH452的ADDR=1时的地址,默认值
#define CH452_I2C_MASK 0x3E // CH452的2线接口高字节命令掩码
// 对外子程序
extern unsigned char CH452_Read(void); // 从CH452读取按键代码
extern void CH452_Write(unsigned short cmd); // 向CH452发出操作命令
//=======================================================================
typedef unsigned char uchar;
typedef unsigned int uint ;
uchar tplsb,tpmsb;
uchar Count1ms;
sbit DQ =P2^1;
sbit SDA =P0^6;
sbit SCL =P0^7;
sbit I2CRST =P3^2;
sbit DF_RESET = P3^0;
sbit DF_RDY_BUSY = P3^1;
sbit DF_CHIP_SELECT =P2^2;
sbit SPI_CLK = P0^2;
sbit SPI_MISO = P0^3;
sbit SPI_MOSI = P0^4;
sbit FWP = P2^3;
sbit ACC7 =ACC^7;
uint AT450XXPageAddr;
unsigned char tem_ten,tem_one,tem_zero,hum_ten,hum_one,hum_zero,year_thou,year_hun,year_ten,year_one,display_pos,position1,position2,position3,position4,position5,position6;
unsigned char mon_ten,mon_one,day_ten,day_one,time_thou,time_hun,time_ten,time_one,confirm_num;
sbit SCK = P2^5;
sbit SCLR =P2^4;
sbit SER =P2^7;
sbit SER1 =P3^3;
sbit RCLK =P2^6;
data YWJS=0x08;
bit tem=0;fun_key=0;enterflag=0;
uchar Dis_buf[6]={0,1,2,3,4,5};
uchar W_buf[]={1,2,4,8,16,32};
uint digital_erray[]={0x0800,0x0900,0x0A00,0x0b00,0x0c00,0x0d00,0x0e00,0x0f00};