按照芯片资料编写的写入函数,能连续写入指定数量数据
读取功能只搞了个读取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;
}