📄 24c16.c
字号:
/**************************************************
* 24c16卡读写操作
*
**************************************************/
#include "includes.h"
#include "TextEdit.h"
#include "24c16.h"
#include "disp.h"
INT8 at24c16_sda_h;
INT8 at24c16_sda_l;
INT8 at24c16_scl_h;
INT8 at24c16_scl_l;
extern LINETAB TextLineTab;
extern INT8U inputstate;
extern TEXT text;
INT8U SDA(void);
extern void DelayMs(unsigned int number);
extern void Edit(TEXT *t, INT16U kv);
extern void DispTime(void);
extern void ClearARow(INT8U row, LINETAB *ltp, INT16U att);
extern void EditGoods(void);
extern void SwitchInput(INT8U type);
extern void InitText(void);
extern void OpenCursor(INT8U crs);
//=======================================
//功能:对24c16卡读写操作
//时间:2004-5-28 17:47
//作者: LEEYC
//======================================
/*-----------------------------------------------
//功能:端口初始化
//
//
//---------------------------------------------*/
void InitPort_IC1(void)
{
at24c16_sda_h = AT24C16_1_SDA_H;
at24c16_sda_l = AT24C16_1_SDA_L;
at24c16_scl_h = AT24C16_1_SCL_H;
at24c16_scl_l = AT24C16_1_SCL_L;
}
void InitPort_IC2(void)
{
at24c16_sda_h = AT24C16_2_SDA_H;
at24c16_sda_l = AT24C16_2_SDA_L;
at24c16_scl_h = AT24C16_2_SCL_H;
at24c16_scl_l = AT24C16_2_SCL_L;
}
/*-----------------------------------------------
调用方式:void start_bit(void)
函数说明:开始位
-----------------------------------------------*/
void start_bit(void)
{
SCL_1;
SDA_1;
SDA_0;
SCL_0;
}
/*-----------------------------------------------
调用方式:void stop_bit(void)
函数说明:停止位
-----------------------------------------------*/
void stop_bit(void)
{
SCL_0;
SDA_0;
SCL_1;
SDA_1;
}
/*-----------------------------------------------
调用方式:void mast_ack(void)
函数说明:主答函数
-----------------------------------------------*/
void mast_ack(void)
{
SCL_0;
SDA_0;
SCL_1;
SCL_0;
SDA_1;
}
/*-----------------------------------------------
调用方式:void ack(void)
函数说明:应答函数
-----------------------------------------------*/
void ack(void)
{
SDA_1;
SCL_0;
SCL_1;
while(SDA()){;}
SCL_0;
}
/*-----------------------------------------------
调用方式:void no_ack(void)
函数说明:无需应答位,在读程序中用到
-----------------------------------------------*/
void no_ack(void)
{
SDA_1;
SCL_1;
while(SDA()){;}
SCL_0;
}
/*-----------------------------------------------
调用方式:write_8bit(uchar ch)
函数说明:写一个字节(8位)数据
-----------------------------------------------*/
void write_8bit(uchar ch)
{
uchar i=8;
SCL_0;
while(i--)
{
if(ch&0x80){
SDA_1;
}
else{
SDA_0;
}
ch<<=1;
SCL_1;
SCL_0;
}
}
/*----------------------------------------------
调用方式:uchar read24c16(uint address)
函数说明:读24c16指定地址数据(字节读)
-----------------------------------------------*/
uchar read24c16(uint address)
{
uchar rdata, block;
uchar i=8;
rdata = 0;
block = highbyte(address);
block &= 7;
block <<= 1;
start_bit();
write_8bit(0xA0|block);
ack();
write_8bit(address);
ack();//伪写
start_bit();
write_8bit(0xA1|block);
ack();
while(i--)
{
rdata<<=1;
SCL_0;
SCL_1;
if(SDA()) rdata|=0x01;
}
no_ack();
stop_bit();
return rdata;
}
/*-----------------------------------------------
调用方式:void write24c16(uint address,uchar ddata)
函数说明:写数据到24c16的指定地址(字节写)
-----------------------------------------------*/
void write24c16(uint address,uchar ddata)
{
uchar block;
block = highbyte(address);
block &= 7;
block <<= 1;
start_bit();
write_8bit(0xA0|block);
ack();
write_8bit(address);
ack();
write_8bit(ddata);
ack();
stop_bit();
DelayMs(5);
}
/*-----------------------------------------------
调用方式:void page_wr(uint firstw_ad,uint counter,uint data *firstr_ad)
函数说明:页面写函数,firstw_ad为写入字节单元的首地址,
*firstr-ad为被写入数据所在首地址指针
counter为写入数据字节数
-----------------------------------------------*/
void page_wr(uint firstw_ad,uint counter,uchar *firstr_ad)
{
uchar *ufirstr_ad, block;
ufirstr_ad=firstr_ad;
block = firstw_ad>>8;
block &= 7;
block <<= 1;
start_bit();
write_8bit(0xA0|block);
ack();
write_8bit(firstw_ad);
ack();
while(counter--)
{
write_8bit(*ufirstr_ad);
ack();
ufirstr_ad++;
}
stop_bit();
DelayMs(10);
}
/*-----------------------------------------------
调用方式:void page_rd(uint firstrd_ad,uint count,uint firstwr_ad)
函数说明:页面读函数,firstrd-ad为所读字节首地址,count为读字节数
*ufirstwr-ad为读出数据存储首地址指针
-----------------------------------------------*/
void page_rd(uint firstrd_ad,uint count,uchar *firstwr_ad)
{
uchar i=8, block;
uchar *ufirstwr_ad;
ufirstwr_ad=firstwr_ad;
block = highbyte(firstrd_ad);
block &= 7;
block <<= 1;
start_bit();
write_8bit(0xA0|block);
ack();
write_8bit(firstrd_ad);
ack();
start_bit();
write_8bit(0xA1|block);
ack();
while(count--){
i = 8;
while(i--){
(*ufirstwr_ad)<<=1;
SCL_0;
SCL_1;
if(SDA()) (*ufirstwr_ad)|=0x01;
}
ufirstwr_ad++;
if(count){
mast_ack();
}
else{
no_ack();
stop_bit();
}
}
}
INT8U SDA(void)
{
INT8U sda;
outportb(AT24C16_PORT, AT24C16_DAT); \
sda = inportb(AT24C16_PORT+1) & at24c16_sda_h;
return sda;
}
void WriteICCard(void)
{
TEXT *t;
INT8U *cp, page;
INT16 i;
SwitchInput(inputstate);
EditGoods();
t = &text;
cp = t->TextBuff[1];
page = 0;
for(i=0;i<12;i++){
page_wr(page*16, 16, cp);
page++;
cp += 16;
}
ClearARow(MAXLINE, &TextLineTab, DISP_REVERSE|DISP_CHARSET);
DispTime();
}
void ReadICCard(void)
{
INT8U page, c[16], maxpage;
INT8U c_flag;
INT16U chcode;
int i, j;
chcode = 0;
c_flag = 0;
InitText();
Edit(&text, 0x0d);
maxpage = (ROW-1)*COL/16;
OpenCursor(0);
for(page=i=0;i<maxpage;i++, page++){
page_rd(page*16, 16, c);
for(j=0;j<16;j++){
if(c_flag){
chcode |= (c[j]<<8);
c_flag = 0;
Edit(&text, chcode);
}
else if(c[j]>0x80){
c_flag = 1;
chcode = c[j];
}
else
Edit(&text, c[j]);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -