📄 uarti2c.c
字号:
//discription:
////0x2a+0x52+'ID' + 'SUB'+'NUMBER'+0X0D
//* + W + ID + SUB + NUMBER + DATA1 +..DATAN +0X0D
//return R command:0x41 0x44 + reg value send ok
//retrun W command:0x41 0x44 send ok
//else status:
//return 0x41 0X4F:not R or W
//return 0x41 0x41 or 0x41 0x42: R/W command length wrong
//return 0x41 0x43: can't find '*'
#include <reg932.H>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
bit sendRQ;
uchar data CommandBufPoint;
uchar idata CommandBuf[20];
uchar currentrecv;
uchar local;
char text[]="error";
uchar VideoSite;
uchar data BoarID;
/*uchar idata pixel[54]={0xFF,0xFF,0xFF,0xFA,0xBE,0xEA,0xF8,0xB8,0xA2,0xF8,0xB8,0xA2,0xE8,0xA8,
0x00,0x80,0x08,0xA2,0x88,0x82,0xE2,0x88,0x8A,0xA2,0x88,0x80,0x00,0x88,0x8A,0x82,0x80,0x0B,0x80,
0xE8,0xAE,0x20,0xF8,0x8A,0x22,0xA8,0x08,0xA2,0x80,
0x82,0xE2,0x8A,0x8B,0xE2,0xEF,0xEF,0xEA,0xFF,0xFF,0xFF
};
/* 定义页宽度屏蔽字(16字节时为0x0F,64字节时为0x3F) */
#define PAGE_SIZE 0x3F
/* 定义FLASH控制命令字 */
#define LOAD 0x00 /* 加载数据 */
#define PROG 0x48 /* 编程 */
#define ERS_PROG 0x68 /* 擦除编程 */
#define ERS_S 0x71 /* 擦除扇区 */
#define ERS_P 0x70 /* 擦除页 */
uchar rompos;
uchar romnum;
uchar attr;
uchar postH;
uchar postL;
uchar savenum;
uchar code *CommandCache;//配置参数写指针
/******************************************************
* MAX7456 register addr (read mode)
*******************************************************/
#define VM0 0x80 //video mode 0
#define CMM 0x88 //character memory mode
#define CAH 0x89 //character address high
#define CAL 0x8a //character address low
#define CDO 0xc0 //character data out
#define CDI 0x8b //character data in
#define DMAH 0x85 //display memory address high
#define DMAL 0x86 //display memory address low
#define DMDI 0x87 //display memory code in
#define STAT 0xA0
#define DMM 0x84 //display memory mode
#define HOS 0x82 //horizontal offset
#define VOS 0x83 //vertical offset
#define DMDO 0xb0
#define OSDM 0x8C
//============================start==========================================
/********************************
定义MCU各管脚
**********************************/
sbit BP_DIR = P0^7;
sbit act =P0^6;
sbit i2c_sda = P1^3;
sbit i2c_scl = P1^2;
//sbit MAX7456_MOSI = P0^6;
//sbit SCK = P2^5;
/*********************************************************************
* 函数名称:WATCHDOG_init
* 功能描述:初始化MCU的看门狗
* 输入参数:无
*********************************************************************/
void WATCHDOG_init()
{
WDL=0XFF;
EA = 0;
WDCON = 0XE5;
WFEED1 = 0xA5;
WFEED2 = 0x5A;
EA = 1;
}
/*********************************************************************
* 函数名称:watchdog
* 功能描述:喂狗操作程序
* 输入参数:无
*********************************************************************/
void watchdog()
{
EA = 0;
WFEED1 = 0xA5;
WFEED2 = 0x5A;
EA = 1;
}
/********************************************************
* 函数名称:Delay_ms
* 功能描述:延时20U秒
*********************************************************/
void delay (void)
{
unsigned long i;
for (i = 0; i <500; i++)
{ /* waste timea and */
/* do notthing */
}
watchdog();
}
/*************************************************************************************
* 函数名称:IO_init
* 功能描述:初始化MCU的I/O口,对I/O进行配置其工作模式
* 输入参数:无
*************************************************************************************/
void IO_init(void)
{
P0M1 = 0x00; // (00001110)push pull except RX
P0M2 = 0x00; // (11000000)
P1M1 = 0x00; //(00101100)push pull except RX
P1M2 = 0x00;
P2M1 = 0x00; // (01011000)push pull 0x58 0x20
P2M2 = 0x00; // (00100000) 0xff 05.10.17//00 /pull_p23
P3M1 = 0x03; // (00000011)push pull 06.06.17
P3M2 = 0x00; // (00000000)06.06.17
EA = 1;
ES = 1; // enable UART interrupt
EWDRT = 0;
}
/***********************************************************************************
* 函数名称:UART_init
* 功能描述:初始化MCU的串口,配置波特率以及串口工作方式
* 输入参数:无
*************************************************************************************/
void UART_init()
{
SCON=0x50; // select BRG as UART Baud Rate Gen
SSTAT=0x00; // separate Rx / Tx interrupts
BRGCON=0x00;
BRGR0=0x70; // setup BRG for 19200 baud @ 7.373(7372800)MHz internal RC oscillator
BRGR1=0x01;
BRGCON = 0x03; // enable BRG
}
/*********************************************************************
* 函数名称:DATA_init
* 功能描述:I/O口初始值、部分变量初始值设置
* 输入参数:无
* 输出参数:无
* 返 回 值:无
* 编写时间:2007-11-20
* 修改时间:无
* 备 注:
*********************************************************************/
void DATA_init()
{
P0 = 0x3f;
P1 = 0xff;
P2 = 0xff;
P3 = 0xff;
}
//*****************************
//* 函数名称:send
//* 功能描述:通过串口发送数据
//* 输入参数:uchar dat
//******************************
void sendtoPC(char* dat,uchar j)
{
uchar i=0;
for(i=0;i<j;i++)
{
TI=0;
SBUF=(*dat); // start sending one byte
while (!TI); // wait until sent
TI=0;
dat++;
}
}
/*****************************************************************************************************************************
* 函数名称:readaddress
* 功能描述:读取设备自身的地址ID
* 输入参数:无
*******************************************************************************************************************************/
void readaddress(void)
{
BoarID = 0;
P2 = P2 | 0xbf;//(10111111)
P0 = P0 | 0x41;//(01000001)
P1 = P1 | 0xd0;//(11010000)
if(P2 & 0x80)BoarID = BoarID | 0x01; //P2.7 = address0 地址ID第0位
if(P2 & 0x01)BoarID = BoarID | 0x80; //P2.0 = address1 地址ID第7位
if(P2 & 0x02)BoarID = BoarID | 0x40; //P2.1 = address2 地址ID第6位
if(P0 & 0x01)BoarID = BoarID | 0x20; //P0.0 = address3 地址ID第5位
if(P1 & 0x80)BoarID = BoarID | 0x10; //P1.7 = address4 地址ID第4位
if(P1 & 0x40)BoarID = BoarID | 0x08; //P1.6 = address5 地址ID第3位
if(P1 & 0x10)BoarID = BoarID | 0x04; //P1.4 = address6 地址ID第2位
if(P2 & 0x04)BoarID = BoarID | 0x02; //P2.2 = address7 地址ID第1位
BoarID = ~BoarID;
BoarID =BoarID & 0x00FF;//0x03ff;
}
//-------------I2c----------------------------
uchar ack;
void DelayIIC(uchar dly)
{ uchar i;
for(i=0; i<dly; i++)
{
_nop_();
}
}
void Start_I2c()
{
i2c_sda = 1; /*发送起始条件的数据信号*/
DelayIIC(3);
i2c_scl = 1;
DelayIIC(3); /*起始条件建立时间大于4.7us,延时*/
i2c_sda = 0; /*发送起始信号*/
DelayIIC(3); /* 起始条件锁定时间大于4μs*/
i2c_scl = 0; /*钳住I2C总线,准备发送或接收数据 */
DelayIIC(3);
}
void Stop_I2c()
{
i2c_sda=0; /*发送结束条件的数据信号*/
DelayIIC(3);
i2c_scl = 1; /*结束条件建立时间大于4μs*/
DelayIIC(3);
i2c_sda = 1; /*发送I2C总线结束信号*/
DelayIIC(3);
}
void Ack_I2c(uchar a)
{
if(a==0)i2c_sda = 0; /*在此发出应答或非应答信号 */
else i2c_sda = 1;
DelayIIC(3);
i2c_scl = 1;;
DelayIIC(3);
i2c_scl = 0; /*清时钟线,钳住I2C总线以便继续接收*/
DelayIIC(3);
}
void I2CSendByte(uchar c)
{
uchar BitCnt;
unsigned int i;
uchar temp[2];
ack = 1;
temp[0] = 'N';
temp[1] = 'A';
i2c_scl = 0;
i2c_sda = 0;//<1
for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
{
if((c << BitCnt) & 0x80)
i2c_sda = 1; /*判断发送位*/
else
i2c_sda = 0;
DelayIIC(3);
i2c_scl = 1; /*置时钟线为高,通知被控器开始接收数据位*/
DelayIIC(3);
i2c_scl = 0;
DelayIIC(3);
}
DelayIIC(3);
// IO0DIR = IO0DIR|SCL;
i2c_sda = 1;
DelayIIC(3);
i2c_scl = 1;;//<1
DelayIIC(3);
i=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -