⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1307-ok-1.c

📁 这是8051单片机模拟IIC总线
💻 C
📖 第 1 页 / 共 2 页
字号:
/********************************************************************
                       VIIC_C51.C
  此程序是I2C操作平台(主方式的软件平台)的底层的C子程序,如发送数据
及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,它很方便的
与用户程序连接并扩展.....  
  
    注意:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 
一定的修改....(本例是1us机器周期,即晶振频率要小于12MHZ)

********************************************************************/
  
// adress-8bits
              
//#include <reg764.h>   
#include <SST89x5x4.H>       /*头文件的包含*/

#include <intrins.h>
#include <math.h>

//#include <SST89x5x4.H>

#define uchar unsigned  char
#define uint unsigned int
#define lcd_clr 0x01
#define you_on	0x0f

#define BIT0 	0X01
#define BIT1	0X02
#define BIT2	0X04
#define BIT3	0X08
#define BIT4	0X10
#define BIT5	0X20
#define BIT6	0X40
#define BIT7	0X80
#define  _Nop()  _nop_()        /*定义空指令*/


/*
keyboard	data
0		12
1		8
2		4
3		0
4		1
5		2
6		3
7		5
8		6
9		7
10-ok	9
11		10
12-wrong11
13		13
14		14
15		15
*/	
	
//全局变量定义
sbit rs = P1^7;
sbit rw  = P1^6;
sbit e = P2^1;
sbit lcd_deng = P2^3;


//函数申明
void lcd_ini(void);	
void lcd_wrc(uchar com);
void lcd_wrd(uchar dat);
void lcd_checkbusy();
void delay(uchar n);
void lcd_on();
void lcd_off();
uchar lcd_read_ac();
void lcd_dis_num(uint dat);
void lcd_dis_ch(uchar h,uchar l);
void lcd_add(uchar h,uchar l);

uchar key_data(void);


 //i2c相关函数
void Start_I2c();		//起动总线函数
void Stop_I2c();		//结束总线函数
void  SendByte(uchar c);		//字节数据传送函数send
uchar  RcvByte();		//字节数据传送函数 receive
void Ack_I2c(bit a);		//主控器进行应答信号
bit ISendStr_8(uchar add,uchar son_add,uchar dat);		//向子地址为8位的器件发送多字节数据函数 
bit ISendStr_16(uchar add,uint son_add,uchar dat);		//向子地址为16位的器件发送多字节数据函数 
uchar IRcvStr_8(uchar add,uchar son_add);		//向子地址为8位的器件读取多字节数据函数
uchar IRcvStr_16(uchar add,uint son_add);		//向子地址为16位的器件读取多字节数据函数


void lcd_dis_time(void);		//时钟显示函数
void set_time(uchar sec, uchar min, uchar hr, uchar dy, uchar dt,uchar mn,uchar yr);		//时钟设置sec, min, hr, dy, dt, mn, yr



/* 常,变量定义区 */
 
/*端口位定义*/
sbit SDA = P3^3;            /*模拟I2C数据传送位*/
sbit SCL = P1^4;            /*模拟I2C时钟控制位*/
sbit WP = P1^3;	
/*状态标志*/

bit ack;	         /*应答标志位*/
uchar s;

void main()
{
	uchar i = 0;
	uchar v;
	uchar mydata = 0;
	uchar keydata = 0;
//	uint pot_i;
//	pot_i = &i;
	uchar max=58;
	uchar *s;
	s = &max;

	lcd_off();
	lcd_on();
	lcd_ini();
//	lcd_add(2,1);
//	lcd_dis_ch(0xb4,0xa1);


//	I2C
	WP = 0;

//  write to rom
/*
	lcd_add(2,1);

	i = ISendStr_16(0xa0,0x0000,19);
	lcd_wrd(0x30+i);
*/
/*
	lcd_add(3,1);
	for(v=0x0000;v<8;v++)
	{
		i = 0;
		while(i == 0)
		{
			i = ISendStr_16(0xa0,v,250+2*v+1);
		}
		lcd_wrd(0x30+(uchar)i);	
	}
*/

// read rom   set address
/*
	for(v=0x0000;v<8;v++)
	{
		i = IRcvStr_16(0xa0,v);
		lcd_wrc(0x88+2*v);
		lcd_dis_num(i);
	}

/*
*/


//	while(1);
	
//	set_time(30,6,2,2,30,1,7);		//时钟设置sec, min, hr, dy, dt, mn, yr


	while(1)
	{
		lcd_dis_time();		//时钟显示函数


		keydata = key_data();
		lcd_add(4,6);
		switch(keydata)
		{
			case 0:
			{
				v = 3;
				lcd_dis_num(v);
				break;
			}
			case 1:
			{
				v = 4;
				lcd_dis_num(v);
				break;
			}
			case 2:
			{
				v = 5;
				lcd_dis_num(v);
				break;
			}
			case 3:
			{
				v = 6;
				lcd_dis_num(v);
				break;
			}
			case 4:
			{
				v = 2;
				lcd_dis_num(v);
				break;
			}
			case 5:
			{
				v = 7;
				lcd_dis_num(v);
				break;
			}
			case 6:
			{
				v = 8;
				lcd_dis_num(v);
				break;
			}
			case 7:
			{
				v = 9;
				lcd_dis_num(v);
				break;
			}
			case 8:
			{
				v = 1;
				lcd_dis_num(v);
				break;
			}
			case 9:
			{
				v = 10;
				lcd_dis_num(v);
				break;
			}
			case 10:
			{
				v = 11;
				lcd_dis_num(v);
				break;
			}
			case 11:
			{
				v = 12;
				lcd_dis_num(v);
				break;
			}
			case 12:
			{
				v = 0;
				lcd_dis_num(v);
				break;
			}
			case 13:
			{
				v = 13;
				lcd_dis_num(v);
				break;
			}
			case 14:
			{
				v = 14;
				lcd_dis_num(v);
				break;
			}
			case 15:
			{
				v = 15;
				lcd_dis_num(v);
				break;
			}
			default:
//			case 16:
			{
				v = 16;
				lcd_dis_num(v);
				break;
			}
		}


	}
}


void lcd_ini()
{
	delay(100);
	lcd_wrc(0x34);
	lcd_wrc(0x30);
	lcd_wrc(0x01);
	lcd_wrc(0x06);
	lcd_wrc(0x0c);
	delay(100);
}	
void lcd_wrc(uchar com)
{
	lcd_checkbusy();
	rs = 0;
	rw = 0;
	e = 1;
	P0 = com;	
	P0 = com;
	delay(10);
	e = 0;
}

void lcd_wrd(uchar dat)
{
	lcd_checkbusy();
	rs = 1;
	rw = 0;
	e = 1;
	P0 = dat;
	P0 = dat;
	delay(5);
	e = 0;
}
void lcd_checkbusy()
{
	uchar busy;
	P0 = 0XFF;
	busy = P0;
	if(busy>0x7f)
	{
		rs = 0;
		rw = 1;
		e = 1;
		busy = P0;
		e = 0;
		delay(10);
	}
}
uchar lcd_rdd();
void delay(uchar n)
{
	while(n--);
}
void lcd_on()
{
	lcd_deng = 0;
}
void lcd_off()
{
	lcd_deng = 1;
}
uchar lcd_read_ac()
{
	uchar dat;
//	P0 = 0X00;
	rs = 0;
	rw = 1;
	e = 1;
	dat = P0;
	dat = P0;
	e = 0;
	return(dat&0x7f);
}
void lcd_dis_num(uint dat)
{
    uint a=0;
    dat =dat%10000;
    a =dat/1000;
    lcd_wrd(0x30+a);
    dat =dat%1000;
    a =dat/100;
    lcd_wrd(0x30+a);
    dat =dat%100;
    a=dat/10;
    lcd_wrd(0x30+a);
    dat =dat%10;
    lcd_wrd(0x30+dat);
}
void lcd_dis_ch(uchar h,uchar l)
{
    lcd_wrd(h);
    lcd_wrd(l);
}

void lcd_add(uchar h,uchar l)       //定位地址
{
  l--;
  switch(h)
  {
    case 1:
    {
      lcd_wrc(0x80+l);
      break;
    }
    case 2:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -