找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6992|回复: 3
收起左侧

STC单片机片内EEPROM的使用-记忆按键的方法

[复制链接]
ID:70941 发表于 2014-12-27 19:45 | 显示全部楼层 |阅读模式
本帖最后由 dagu 于 2014-12-27 19:48 编辑

      STC单片机其中的一个大特点就是片内可观的存储空间,虽然大部分资深的单片机"老鸟"对于宏鑫公司将Flash描述成EEPROM颇为不满,对我来说能够利用好这部分空间就是胜利...
前面已经介绍了我手头上的芯片型号为STC89C52RC,其中的52就是表示它的内部Flash程序存储容量为8K,EEPROM为2K. 不说废话贴程序.........
/*********************************************************
;----P1.7---P1.6---P1.5---P1.4-------
;----03H----02H----01H----00H----P1.0
;----07H----06H----05H----04H----P1.1
;----0BH----0AH----09H----08H----P1.2
;----0FH----0EH----0DH----0CH----P1.3
先将键盘的值存入EEPROM然后再去读取
**********************************************************/

#include <reg51.h>
#include <stdio.h>

sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sfr isp_data  =0xe2;
sfr isp_addrh =0xe3;
sfr isp_addrl =0xe4;
sfr isp_cmd   =0xe5;
sfr isp_trig  =0xe6;
sfr isp_contr =0xe7;

unsigned char eeprom_read(unsigned int addres);    //读EEPROM
void eeprom_write(unsigned int address,unsigned char write_data);//写EEPROM.
void eeprom_eares(unsigned int addres);      //扇区擦除。
void KeyScan();
void delay10ms(unsigned char time);
void Dispaly(unsigned char k);
void Send(unsigned char s);

unsigned char key,temp; //全局变量
unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90, //0~9
    0x88,0x83,0xA7,0xA1,0x86,0x8E}; //A~F 数码管显示数组      

//防抖动延时程序
void delay10ms(unsigned char time)
{
unsigned char a,b,c;

for(a=0;a<time;a++)
for(b=0;b<10;b++)
  for(c=0;c<120;c++)
  ;
}

void Dispaly(unsigned char k) //显示程序
{
P0=table[k];
P2=0x00;
}
/**********************************
   eeprom擦除
***********************************/
void eeprom_eares(unsigned int addres)//扇区擦除。
     {
   unsigned i;
      isp_addrl=addres;     //低位地址
      isp_addrh=addres>>8;  //高位地址
      isp_contr=0x01;
      isp_contr=isp_contr|0x80; //设时间与充ISP操作。
      isp_cmd=0x03;         //扇区命命令
      isp_trig=0x46;        //触发
      isp_trig=0xb9;        //触发启动。
      for(i=0;i<3;i++);
      isp_addrl=0xff;
      isp_addrh=0xff;
      isp_contr=0x00;
      isp_cmd=0x00;
      isp_trig=0x00;
      }
/******************************************
   EEPROM写
*******************************************/
void eeprom_write(unsigned int addres,unsigned char write_data)
     {
   unsigned char i;
      isp_data=write_data;   //要写入的数据。
      isp_addrl=addres;     //低位地址
      isp_addrh=addres>>8;  //高位地址
      isp_contr=0x01;
      isp_contr=isp_contr|0x80; //设时间与充ISP操作。
      isp_cmd=0x02;         //写命令
      isp_trig=0x46;        //触发
      isp_trig=0xb9;        //触发启动。
      for(i=0;i<3;i++);
      isp_addrl=0xff;
      isp_addrh=0xff;
      isp_contr=0x00;
      isp_cmd=0x00;
      isp_trig=0x00;     
       }
/**********************************************
   EEPROM读
***********************************************/
unsigned char eeprom_read(unsigned int addres)
     {
   unsigned char i,z;
      isp_addrl=addres;   
      isp_addrh=addres>>8;  

      isp_contr=0x01;
      isp_contr=isp_contr|0x80;
      isp_cmd=0x01;         
      isp_trig=0x46;        

      isp_trig=0xb9;        
      for(i=0;i<3;i++);
      isp_addrl=0xff;
      isp_addrh=0xff;
      isp_contr=0x00;
      isp_cmd=0x00;
      isp_trig=0x00;
      z=isp_data;
      return(z);
      }

/*****************
    主程序
*****************/
void main() //主程序
{
while(1)
{
KeyScan();
}
}

void KeyScan() //按键扫描子程序
{
P1=0xFF;
P1_3=0;         

temp=P1;
temp&=0xF0;
if(temp !=0xF0)
{
delay10ms(1);
temp=P1;
temp&=0xF0;
if(temp !=0xF0)
{
  temp=P1;
  temp&=0xF0;

  switch(temp)
  {
  case 0x70:
  key=15;
  eeprom_eares(0x2200);
  eeprom_write(0x2200,key);break;
  case 0xB0:
  key=14;
  eeprom_eares(0x2200);
  eeprom_write(0x2200,key);break;
  case 0xD0:
  key=13;
  eeprom_eares(0x2200);
  eeprom_write(0x2200,key);break;
  case 0xe0:
  key=eeprom_read(0x2200);break;
  }
  Dispaly(key);
}
}

P1=0xFF;
P1_2=0;         

temp=P1;
temp&=0xF0;
if(temp !=0xF0)
{
delay10ms(1);
temp=P1;
temp&=0xF0;
if(temp !=0xF0)
{
  temp=P1;
  temp&=0xF0;

  switch(temp)
  {
  case 0x70:
  key=11;break;
  case 0xB0:
  key=10;break;
  case 0xD0:
  key=9;break;
  case 0xe0:
  key=8;break;
  }
  eeprom_eares(0x2200);
  eeprom_write(0x2200,key);
  Dispaly(key);
}
}

P1=0xFF;
P1_1=0;     

temp=P1;
temp&=0xF0;
if(temp !=0xF0)
{
delay10ms(1);
temp=P1;
temp&=0xF0;
if(temp !=0xF0)
{
  temp=P1;
  temp&=0xF0;

  switch(temp)
  {
  case 0x70:
  key=7;break;
  case 0xB0:
  key=6;break;
  case 0xD0:
  key=5;break;
  case 0xe0:
  key=4;break;
  }
  eeprom_eares(0x2200);
  eeprom_write(0x2200,key);
  Dispaly(key);
}
}

P1=0xFF;
P1_0=0;     

temp=P1;
temp&=0xF0;
if(temp !=0xF0)
{
delay10ms(1);
temp=P1;
temp&=0xF0;
if(temp !=0xF0)
{
  temp=P1;
  temp&=0xF0;

  switch(temp)
  {
  case 0x70:
  key=3;break;
  case 0xB0:
  key=2;break;
  case 0xD0:
  key=1;break;
   case 0xe0:
  key=0;break;
  }
  eeprom_eares(0x2200);
  eeprom_write(0x2200,key);
  Dispaly(key);
}
}
}


回复

使用道具 举报

ID:71547 发表于 2015-1-7 19:17 | 显示全部楼层
不错,我不知道的东西
回复

使用道具 举报

ID:242560 发表于 2017-12-19 09:04 | 显示全部楼层
很好的,谢谢!刚好要用到
回复

使用道具 举报

ID:521117 发表于 2019-12-30 20:25 | 显示全部楼层
感谢感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表