{:4_188:}
FLASH擦写
利用ISP/IAP技术将Flash当做EEPROM可写10万次以上。
注意:EEPROM的写操作只能将字节中的1写为0,当需要将字节中的0写为1,则必须执行扇区擦除操作。EEPROM的读/写操作是以1字节为单位进行,而EEPROM擦除操作是以1扇区(512字节)为单位进行,在执行擦除操作时,如果目标扇区中有需要保留的数据,则必须预先将这些数据读取到RAM中暂存。
写或读寄存器IAP_ADDRE 最高位地址IAP_ADDRH高位地址IAP_ADDRL低位地址
命令寄存器1为读2为写3为清空先写0x5a后写0xa5才开始触发IAPEN开启CMD_FAIL判断位
第四节USB不停电下载,方便烧录,下载函数,复制代码,了解代码
建议还是先学8位的51
{:ciya:}
看完14集IO中断,还需要再学习回顾一下
那个时候可以领实验箱呢
打卡学习
{:4_165:}
打卡交作业,第七课 定时器中断 P32 控制功德状态 ,打印状态 ,P33 加功德(1 或者 2)打印功德数,并控制LED1 亮一秒 或两秒
//按键P3.2控制功德状态
if(P32 == 0)
{
Delay20ms();
if(P32 == 0)
{
State = !State; //功德状态 0:单倍功德1:双倍功德
if(State == 1)
{
printf("双倍功德时间\r\n");
}
else
{
printf("单倍功德时间\r\n");
}
while(P32 == 0);
}
}
//按键P3.3据功德状态 完成加功德
if(P33 == 0)
{
Delay20ms();
if(P33 == 0)
{
if(State == 1) //双倍功德状态功德数+2
{
Num1 += 2;
printf("功德+2 当前功德:%d\r\n",Num1);
P00 = 0;
Timer0_Init();//启动定时器0
}
else //单倍功德状态功德数+1
{
Num2 += 1;
printf("功德+1 当前功德:%d\r\n",Num2);
P00 = 0;
Timer0_Init(); //启动定时器0
}
while(P33 == 0);
}
}
}
}
void Timer0_Isr(void) interrupt 1
{
if(State == 1)
{
Num3++;
if(Num3 == 2) //灯亮两秒 关灯 关定时器0
{
Num3 = 0;
P00 = 1;
TR0 = 0;
}
}
else
{
P00 = 1;//灯亮一秒 关灯 关定时器0
TR0 = 0;
}
}
void Timer0_Init(void) //1秒@24.000MHz
{
TM0PS = 0x1E; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xFC; //设置定时初始值
TH0 = 0x03; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}