?? main.c
字號:
//===================================================
//
// 模塊: 無線發射模塊
//
// 日期: 2007-08-03
//
// 作者: 施探宇
//
// 說明: Zi2020
//
//
//===================================================
#include "at89s53.h"
//---------------------------------------------------
// 測試串口速率
//---------------------------------------------------
//#define DEBUG_SPEED
// 類型定義
typedef unsigned char BYTE;
typedef unsigned int WORD;
//---------------------------------------------------
// I2C 控制腳定義
//---------------------------------------------------
//sbit P_SDA = P3^7;
//sbit P_SCL = P3^2;
sbit P_SPK = P2^0;
sbit P_SDA = P3^6;
sbit P_SCL = P3^5;
//===================================================
// 串口初始
//===================================================
void ComInit()
{
TR1 = 0; //啟動定時器
SCON = 0x50; //串口方式1,允許接收
TMOD = 0x20; //定時器1定時方式2
TCON = 0x40; //設定時器1開始計數
PCON = 0x80; //波特率加倍控制,SMOD位
// 初始化速率:19200bps.
TH1 = 253;
TL1 = 253;
// 清收發標志
RI = 0;
TI = 0;
// 啟動定時器
TR1 = 1;
}
//===================================================
// 串口輸出字符串(非中斷方式)
//===================================================
void ComOutput(const BYTE Str[])
{
BYTE i = 0;
while(Str[i]) //判斷是否到了字符串的尾部
{
SBUF = Str[i++];
//輸出字符
while(!TI)
;
//空語句判斷字符是否發完
TI = 0;
//清TI
}
}
//===================================================
// 串口接收字符串
//===================================================
void ComInput(BYTE Str[])
{
BYTE c = 0;
BYTE i = 0;
do{
// 空語句判斷字符是否收完
while(!RI);
// 讀取字符
Str[i] = SBUF;
// 保存字符
c = Str[i++];
// 清RI
RI = 0;
// 判斷是否到了字符串的尾部
}while(c && (c != 0x0a) && (c != 0x0d) && (c != '@'));
Str[i] = 0;
}
//===================================================
// I2C延時
//===================================================
void I2cDelay()
{
int j;
for(j = 0; j < 20; j++)
{
;
}
}
//===================================================
// I2c開始
//===================================================
void I2cStart()
{
P_SDA = 1;
I2cDelay();
P_SCL = 1;
I2cDelay();
P_SDA = 0;
I2cDelay();
P_SCL = 0;
I2cDelay();
}
//===================================================
// I2c停止
//===================================================
void I2cStop()
{
P_SDA = 0;
I2cDelay();
P_SCL = 1;
I2cDelay();
P_SDA = 1;
I2cDelay();
}
//===================================================
// I2c讀應答
//===================================================
BYTE I2cGetAck()
{
BYTE iAck = 0;
P_SDA = 1;
I2cDelay();
P_SCL = 1;
I2cDelay();
if(!P_SDA)
iAck = 1;
else
iAck = 0;
I2cDelay();
P_SCL = 0;
I2cDelay();
return iAck;
}
//===================================================
// I2c主應答
//===================================================
void I2cSetAck()
{
P_SDA = 0;
I2cDelay();
P_SCL = 1;
I2cDelay();
I2cDelay();
P_SCL = 0;
I2cDelay();
P_SDA = 1;
}
//===================================================
// I2c寫入一個字節
//===================================================
void I2cWriteByte(BYTE nData)
{
BYTE i;
for(i = 0;i < 8;i ++)
{
if(nData & 0x80)
{
P_SDA = 1;
}
else
{
P_SDA = 0;
}
nData <<= 1;
I2cDelay();
P_SCL = 1;
I2cDelay();
I2cDelay();
P_SCL = 0;
I2cDelay();
}
I2cDelay();
}
//===================================================
// I2c寫入一個字節
//===================================================
void I2cWriteVByte(BYTE nData)
{
char i;
for(i = 0;i < 8;i ++)
{
if(nData & 0x01)
{
P_SDA = 1;
}
else
{
P_SDA = 0;
}
I2cDelay();
nData >>= 1;
P_SCL = 1;
I2cDelay();
I2cDelay();
P_SCL = 0;
I2cDelay();
}
I2cDelay();
}
//===================================================
// I2c讀取一個字節
//===================================================
BYTE I2cReadByte()
{
BYTE nData = 0;
char i;
for(i = 0;i < 8;i ++)
{
nData <<= 1;
I2cDelay();
P_SCL = 1;
I2cDelay();
if(P_SDA)
{
nData |= 1;
}
else
{
nData &= 0xfe;
}
I2cDelay();
P_SCL = 0;
I2cDelay();
}
I2cDelay();
return nData;
}
//===================================================
// I2c讀取一個字節
//===================================================
BYTE I2cReadVByte()
{
BYTE nData = 0;
char i;
for(i = 0;i < 8;i ++)
{
nData >>= 1;
I2cDelay();
P_SCL = 1;
I2cDelay();
if(P_SDA)
{
nData |= 0x80;
}
I2cDelay();
P_SCL = 0;
I2cDelay();
}
I2cDelay();
return nData;
}
//===================================================
// 寫I2C設備
//===================================================
int I2cWrite(BYTE DEV,BYTE ADDR,BYTE DATA)
{
BYTE iAck = 0;
I2cStart();
I2cWriteByte(DEV);
iAck = I2cGetAck();
if(!iAck)
return 0x101;
I2cWriteByte(ADDR);
iAck = I2cGetAck();
if(!iAck)
return 0x102;
I2cWriteByte(DATA);
iAck = I2cGetAck();
if(!iAck)
return 0x103;
I2cStop();
return DATA;
}
//===================================================
// 讀I2C設備
//===================================================
int I2cRead(BYTE DEV,BYTE ADDR)
{
BYTE nData = 0;
BYTE iAck = 0;
I2cStart();
I2cWriteByte(DEV);
iAck = I2cGetAck();
if(!iAck)
return 0x201;
I2cWriteByte(ADDR);
iAck = I2cGetAck();
if(!iAck)
return 0x202;
I2cStart();
I2cWriteByte(DEV | 1);
iAck = I2cGetAck();
if(!iAck)
return 0x203;
nData = I2cReadVByte();
I2cSetAck();
I2cStop();
return nData;
}
//===================================================
// 喇叭
//===================================================
void Beep(BYTE feq,BYTE delay)
{
BYTE i,j;
for(i = 0 ; i < feq; i++)
{
P_SPK = !P_SPK;
for(j = 0; j < delay; j++)
;
}
}
//===================================================
// 起始函數
//===================================================
void main()
{
BYTE dipaly[6];
BYTE i = 0;
// 糾錯數據
BYTE nData = 0x77;
// 讀寫數據
int bRead = 0;
int bWrite = 0;
// 是否正確
bit bOK = 0;
WORD fmData = 0xc370;
int iDelay = 1000;
P_SDA = 1;
P_SCL = 1;
EA = 0;
do{
// Zi2020寫入0x0371
bWrite = I2cWrite(0x6c,0x00,0x71);
bWrite = I2cWrite(0x6c,0x01,0xc3);
bWrite = I2cWrite(0x6c,0x02,0x00);
bWrite = I2cWrite(0x6c,0x13,0x80);
// bRead = I2cRead(0x6c, 0x00);
#if 1
dipaly[5] = (bWrite & 0x0f00) >> 8;
dipaly[4] = (bWrite & 0x00f0) >> 4;
dipaly[3] = (bWrite & 0x000f) >> 0;
#else
dipaly[5] = (bWrite / 100) % 10;
dipaly[4] = (bWrite / 10) % 10;
dipaly[3] = (bWrite / 1) % 10;
#endif
dipaly[2] = (bRead & 0x0f00) >> 8;
dipaly[1] = (bRead & 0x00f0) >> 4;
dipaly[0] = (bRead & 0x000f) >> 0;
for(i = 0; i < 6; i++)
{
P0 = (i << 4) | dipaly[i];
I2cDelay();
I2cDelay();
I2cDelay();
}
// 擦除LED
P0 = 0x60;
}while(1);
return ;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -