標題:
PMS154C 24C02 DOME
[打印本頁]
作者:
tianshizhiren
時間:
2024-11-3 13:52
標題:
PMS154C 24C02 DOME
//********************************************************************************//
// 功能名稱: 24C02模塊(EEPROM)
// 功能編號: 180201
// 適應芯片: 適用于所有芯片
//--------------------------------------------------------------------------------//
//程序說明:
// 封裝引腳圖如下
// ┌─┐
// A0┤ ├VCC
// A1┤ ├WP
// A2┤ ├SCL
// GND┤ ├SDA
// └─┘
// 引腳A0~A2地址輸入引腳,案例全接GND
// WP引腳寫保護,接GND進行正常讀寫,接VCC只讀模式,案例接GND
// 案例為寫入一個地址0數(shù)據(jù)49,然后再讀出該地址的數(shù)據(jù)
// 地址和數(shù)據(jù)可以隨意改動,數(shù)據(jù)的范圍為0~255,
// 超過的范圍請參考連寫或連讀
//注意事項:
// 1.案例為PMS154C,其他芯片原理都相同
// 2.連讀或連寫請參考對應的程序
//********************************************************************************//
#include "extern.h"
#define _5us 5*2
bit SCL : PA.3;//用于產(chǎn)生器件所有數(shù)據(jù)發(fā)送或接收的時鐘
bit SDA : PA.4;//用于器件所有數(shù)據(jù)的發(fā)送或接收
byte Address;
byte data;
byte Read_Data;
byte Write_Data;
void init(void)//初始化函數(shù)
{
SCL = 1;
.delay _5us;
SDA = 1;//控制信號拉高
.delay _5us;
}
void start(void)//啟動信號子函數(shù)//向ROM發(fā)送一個開始的信號
{
SDA = 1;
.delay _5us;
SCL = 1;
.delay _5us;
SDA = 0;
.delay _5us;
}
void stop(void)//停止信號子函數(shù)//向ROM發(fā)送一個停止的信號
{
SDA = 0;
.delay _5us;
SCl = 1;
.delay _5us;
SDA = 1;
.delay _5us;
}
void respons(void)//應答信號子函數(shù)//接收一信號后應答
{
$ SDA in,pull;
.delay 100;
SCL = 1;
.delay _5us;
while(SDA==1)
nop;
SCL = 0;
.delay _5us;
$ SDA out,high;
.delay 100;
}
void write_byte(void)//寫入一個字節(jié)數(shù)據(jù)//向E2PROM寫數(shù)據(jù)
{
byte temp = 0,i = 8;
while(i--)
{
SCL = 0;//數(shù)據(jù)可以改變
.delay _5us;
temp = data & 0x80;//保留最高位
if(temp)//寫一位
SDA = 1;
else
SDA = 0;
.delay _5us;
data <<= 1;//要存的數(shù)據(jù)左移一位
SCL = 1;//數(shù)據(jù)穩(wěn)定不能寫了
.delay _5us;
}
SCL = 0;
.delay _5us;
SDA = 1;//穩(wěn)定數(shù)據(jù)
.delay _5us;
}
void read_byte(void)//讀回一個字節(jié)
{
byte i = 8;
SCL = 0;//數(shù)據(jù)改變
.delay _5us;
SDA = 1;//可讀信號
.delay _5us;
$ SDA in,pull;
.delay 100;
Read_Data = 0;
while(i--)
{
Read_Data = Read_Data << 1;//寫入時從高位寫,讀出時也一樣
SCL = 1;//數(shù)據(jù)穩(wěn)定,可從SDA讀出一位
.delay _5us;
if(SDA)
Read_Data = Read_Data | 0x01;
else
Read_Data = Read_Data & 0xfe;
SCL = 0;//數(shù)據(jù)改變準備下一位
.delay _5us;
}
$ SDA out,high;
.delay 100;
}
void write_add(void)//片內(nèi)隨意地址寫任意數(shù)//根據(jù)起始地址、數(shù)據(jù)個數(shù)及數(shù)據(jù)寫入E2PROM中
{ //Write_Data address變量
start();//起始
data = 0xa0;//E2PROM地址(ATC02為0xa0)//器件地址+寫控制位
write_byte();
respons();//應答
data = address;//寫入數(shù)據(jù)要存放的地址
write_byte();
respons();//應答
data = Write_Data;//寫入數(shù)據(jù)
write_byte();
respons();//應答
stop();//終止
}
void read_add(void)//片內(nèi)隨意地址讀數(shù)據(jù)//根據(jù)起始地址和讀出個數(shù),從E2PROM中讀出一串數(shù)據(jù)
{ //address變量
start();//起始
data = 0xa0;//器件地址+寫控制位
write_byte();
respons();//應答
data = address;//數(shù)據(jù)地址
write_byte();
respons();//應答
start();//起始
data = 0xa1;//器件地址+讀控制位
write_byte();
respons();
read_byte();
.delay 1000;
stop();//停止
}
void FPPA0 (void)
{
.ADJUST_IC SYSCLK=IHRC/8, IHRC=16MHz, VDD=5V;
$ SDA out,high;
$ SCL out,high;
Address = 0;
init();
.delay 100;
while (1)
{
Address = 0;//地址
Write_Data = 49;//數(shù)據(jù)
write_add();//寫入一個數(shù)據(jù)
.delay 5000*2;//延時一下
Address = 0;
read_add();//讀出寫入的數(shù)據(jù)
nop;
}
}
void Interrupt (void)
{
pushaf;
if (Intrq.T16)
{ // T16 Trig
// User can add code
Intrq.T16 = 0;
//...
}
popaf;
}
復制代碼
原理圖: 無
仿真: 無
代碼:
PMS154C 24C02.zip
(11.35 KB, 下載次數(shù): 1)
2024-11-3 13:51 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1