11AA160 存储器仿真

按照芯片资料编写的写入函数,能连续写入指定数量数据

读取功能只搞了个读取1个字节的函数

没有搞连续读取函数,因为时钟同步问题不好解决。

【h文件】

#ifndef __11AA160_H_
#define __11AA160_H_

/**********************************
包含头文件
**********************************/
#include<reg51.h>

//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint 
#define uint unsigned int
#endif

/**********************************
PIN口定义          P1
**********************************/
sbit IO_11xx=P2^0;

/**********************************
函数声明
**********************************/
void xie_11xx(uchar MSB,uchar LSB,uchar *p,uchar n);//写数据
uchar read_11xx(uchar MSB,uchar LSB);//读取一个字节
void init_11xx();//初始化
#endif
【C文件】

#include "11AA160.h"
//延时
void delay_11xx(uchar i)
{
    while(i--);
}
//发送1
void send1_11xx()
{
    IO_11xx=0;
    delay_11xx(20);
    IO_11xx=1;
    delay_11xx(20);
}
//发送0
void send0_11xx()
{
    IO_11xx=1;
    delay_11xx(20);
    IO_11xx=0;
    delay_11xx(20);
}
//发送字节    m数据;state:MAK=1,NoMAK=0
void send8_11xx(uchar m,uchar state)
{
    uchar i;
    for(i=0;i<8;i++)
    {
        if((m & 0x80)>0)
            send1_11xx();
        else
            send0_11xx();
        m<<=1;
    }
    if(state)//MAK
        send1_11xx();
    else
        send0_11xx();
    IO_11xx=1;//SAK
    delay_11xx(20);
    IO_11xx=1;
    delay_11xx(20);
}
//发送命令
void command_11xx(uchar m,uchar state)
{
    IO_11xx=0; //开始
    delay_11xx(50);
    send8_11xx(0x55,1);//引导头
    send8_11xx(0xa0,1);//设备地址
    send8_11xx(m,state);//命令
}
//初始化
void init_11xx()
{
    command_11xx(0x96,0);//写使能
}
//写一串数据,n个  MSB,LSB起始地址
void xie_11xx(uchar MSB,uchar LSB,uchar *p,uchar n)
{
    uchar i;
    command_11xx(0x96,0);//写使能
    delay_11xx(200);
    command_11xx(0x6c,1);
    send8_11xx(MSB,1);
    send8_11xx(LSB,1);
    for(i=0;i<n-1;i++)
    {
        send8_11xx(*p,1);
        p++;
    }
    send8_11xx(*p,0);
}
//读取一个字节
uchar read_11xx(uchar MSB,uchar LSB)
{
    uchar i,j=0,k=0;
    command_11xx(0x96,0);//写使能
    delay_11xx(200);
    command_11xx(0x03,1);
    send8_11xx(MSB,1);
    send8_11xx(LSB,1);

    delay_11xx(5);
    P3=0;
    for(i=0;i<8;i++)//1B
    {
        k<<=1;
        if(IO_11xx)
            k++;
        else
            j++;
        delay_11xx(42);
        j++;
        j++;
        j++;
    }
    send0_11xx();//NoMAK
    return ~k;
}
【主函数】

#include "reg51.h"
#include "11AA160.h"
#define uchar unsigned char
#define uint unsigned int
sbit k1=P1^0;//按钮
sbit k2=P1^1;

//数码管编码
uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code str[]="1234567890";
uchar time=0,mode=0;//系统变量
//延时
void delay(uint i)
{
    while(i--);
}
void main()    //主函数
{
    init_11xx();//初始化11xx
    delay(50000);
    xie_11xx(0,0,smgduan,8);//写入5个数据
    TMOD|=0X01;
    TH0=(65536-50000)/256;//50ms
    TL0=(65536-50000)%256;    
    ET0=1;//打开定时器0中断允许
    EA=1;//打开总中断
    TR0=1;//打开定时器
    while(1)
    {
        if(!k1)
        {
            xie_11xx(0,0,"5263",4);//写入5个数据
            while(!k1);
        }
        if(!k2)
        {
            P0=read_11xx(0,1);
            while(!k2);
        } 
    }
}
//定时器中断
void Timer0() interrupt 1
{
    if(time<10)//0.5s
        time++;
    else
    {
        time=0;
        
    }
    TH0=(65536-50000)/256;//50ms
    TL0=(65536-50000)%256;
}

  • 24
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值