📄 28f040.h
字号:
void Set_28F040_Page(BYTE page)
{
EA=0;
D373_1&=0xF0; D373_1|=page;
P0=D373_1;
B_373_1=1; B_373_1=0;
EA=1;
}// Pass
void Unprotect_28F040(void)
{
BYTE i;
Set_28F040_Page(0);
i=Flash[0x1823];
i=Flash[0x1820];
i=Flash[0x1822];
i=Flash[0x0418];
i=Flash[0x041B];
i=Flash[0x0419];
i=Flash[0x041A];
}// Pass
void Protect_28F040(void)
{
BYTE i;
Set_28F040_Page(0);
i=Flash[0x1823];
i=Flash[0x1820];
i=Flash[0x1822];
i=Flash[0x0418];
i=Flash[0x041B];
i=Flash[0x0419];
i=Flash[0x040A];
}// Pass
void Write_28F040(WORD p, BYTE c)
{
BYTE i;
Flash[p]=0x10; Flash[p]=c;
for(i=20; i>0; i--){}
}// Pass
void Erase_28F040(BYTE c) // Must set Flash_p first
{
BYTE i, j;
Set_28F040_Page(c);
Flash[Flash_p]=0x20; Flash[Flash_p]=0xd0;
for(i=10; i>0; i--) // Delay 2ms
for(j=100; j>0; j--){}
}// Pass
bit Find_User(void)
{
BYTE i;
WORD w;
if(Total_User==0)
return 0;
Set_28F040_Page(8);
w=Total_User*17;
for(Flash_p=0; Flash_p<w; Flash_p+=17){
for(i=0; i<7; i++){
if(ID_Card_no[i]!=Flash[Flash_p+i])
goto Not_Found;
}
return 1;
Not_Found:{}
}
return 0;
}
bit Find_User_id(BYTE low, BYTE high)
{
WORD w;
if(Total_User==0)
return 0;
Set_28F040_Page(8);
w=Total_User*17;
for(Flash_p=0; Flash_p<w; Flash_p+=17){
if((Flash[Flash_p+15]==low)&&(Flash[Flash_p+16]==high))
return 1;
}
return 0;
}
void Flash_adduser(BYTE low, BYTE high)
{
BYTE i,j;
Set_28F040_Page(8);
Flash_p=Total_User*17;
for(i=0; i<7; i++){
Flash[Flash_p+i]=0x10; Flash[Flash_p+i]=ID_Card_no[i];
for(j=20; j>0; j--){}
}
Flash[Flash_p+15]=0x10; Flash[Flash_p+15]=low;
for(j=20; j>0; j--){}
Flash[Flash_p+16]=0x10; Flash[Flash_p+16]=high;
for(j=20; j>0; j--){}
Total_User++;
}
void Flash_deluser(void)
{
BYTE i,j;
Set_28F040_Page(8);
for(i=0; i<17; i++){
Flash[Flash_p+i]=0x10; Flash[Flash_p+i]=0;
for(j=20; j>0; j--){}
}
}
void Write_Record(void)
{
extern void mystrcpy(BYTE *str);
extern void LCD_writeline(BYTE line);
BYTE i,j,fail;
while(Total_Record<38000){
Set_28F040_Page(9+Total_Record/5461);
Flash_p=(Total_Record%5461)*6;
fail=0;
for(i=0; i<6; i++){ // 检查FLASH是否为空
if(Flash[Flash_p+i]!=0xFF){
fail=1;
break;
}
}
if(fail==1){ // 若FLASH非空则直接跳往下一条记录
Total_Record++;
continue;
}
for(i=0; i<6; i++){ // 写入考勤记录
Flash[Flash_p+i]=0x10; Flash[Flash_p+i]=Send_buf[12+i];
for(j=20; j>0; j--){}
}
Total_Record++;
fail=0;
for(i=0; i<6; i++){ // 检查FLASH是否写入正确
if(Flash[Flash_p+i]!=Send_buf[12+i]){
fail=1;
break;
}
}
if(fail==0){ // 若FLASH写入正确则返回
return;
}else{ // 否则将它全部置0
for(i=0; i<6; i++){
Flash[Flash_p+i]=0x10; Flash[Flash_p+i]=0;
for(j=20; j>0; j--){}
}
Total_Record++;
}
}
#ifdef CHINESE
mystrcpy(" 考勤记录已满 ");
#else
mystrcpy(" Record is Full ");
#endif
LCD_writeline(4);
BELL_ON
EA=0;
while(1){} // 死机
}
void Calc_Total_User(void)
{
BYTE i;
WORD p;
Set_28F040_Page(8);
Total_User=0;
for(p=0; p<32759; p+=17){ // 32742-32758为最后一个用户
for(i=0; i<7; i++){
if(Flash[p+i]!=0xFF)
goto Calc_User_1;
}
return;
Calc_User_1:
Total_User++;
}
}// Pass
void Calc_Total_Record(void)
{
BYTE i;
WORD p;
Total_Record=0;
for(i=9; i<16; i++){
Set_28F040_Page(i);
for(p=0; p<32763; p+=6){ // 32760-32765为最后一条记录
if((Flash[p]==0xFF)&&(Flash[p+1]==0xFF))
return;
Total_Record++;
}
}
}// Pass
void newVOC_Play(BYTE i)
{
Set_28F040_Page(1);
VOC_buf[0]=Flash[0x2310+i];
VOC_buf[1]=Flash[0x2311+i];
if(VOC_buf[0]!=0xFF){
EA=0;
if((VOC_delay_counter==0)&&(D373_3&VOC_PLAY_MASK)){ // not playing voice
VOC_play(); // auto set EA=1
}else{ // playing voice now
P0=0; B_373_2=1; B_373_2=0; VOC_counter=0;
VOC_delay_counter=3; // Delay 40-60 ms
D373_3|=VOC_PLAY_MASK; // VOC_PLAY=1(stop playing)
OUT_373_3
EA=1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -