/*免疫荧光前处理仪主控板程序
* 许兴路
* 2013-7-24SUART
* 2013-7-25I2C
*
*/
#include <pic18.h>
#include "config.h" //包含自己的配置头文件
__PROG_CONFIG(1,0xC100); //使能振荡器切换;使能故障保护时钟监控;XT振荡器;
__PROG_CONFIG(2,0x0A16); //看门狗分频1:32;禁用看门狗;欠压复位2.7V;硬件使能欠压复位;使能上电延时定时器;
__PROG_CONFIG(3,0x8100); //使能MCLR引脚;timer1高功耗运行;PORTB<4:0>引脚复位后为数字I/O;CCP2与IO与RC1复用;
__PROG_CONFIG(4,0x0081); //禁止后台调试,RB6、7为通用I/O口;禁止变址寻址;禁止低压编程;堆栈满/下溢导致复位;
__PROG_CONFIG(5,0xC00F); //数据EEPROM无代码保护;引导区无代码保护;程序存储块3-0无代码保护;
__PROG_CONFIG(6,0xE00F); //数据EEPROM无写保护;引导区无写保护;配置寄存器无写保护;程序存储块3-0无写保护;
__PROG_CONFIG(7,0x400F); //引导区无表读保护;程序存储块3-0无表读保护;
uchar cd[4]; //接收字符字符串变量
uchar cdcount; //接收字符计数
bit show=0; //显示开关
uchar num=0; //循环变量
uint mycmd; //指令
//********************函数定义*********************
void delay1ms(uint DelayTime); //延时1毫秒
//串口函数
void init_com(void); //初始化串口
void senddata_uart(uchar cdd); //串口发送一个字符
void senddata_uart_i(uchar cdd); //uart发送数据 中断专用
void sendstring_uart(const uchar *dd); //串口发送字符串
//LCD函数
void init_lcd(void); //初始化LCD
void lcd_write_data(uchar data); //LCD输出函数
void lcd_write_com(uchar com); //LCD指令函数
//内部函数
uint uchartouintcmd(uchar cmd1,uchar cmd2,uchar cmd3);//串口数据转换成指令
//I2C函数
void init_i2c(void);
void ckif(void);
void ckack(void);
void i2c_send(uchar add,uchar data);
uchar i2c_rec(uchar add);
//*************** 主程序 ********************
void main(void)
{
init_com();
cdcount=0;
init_lcd();
init_i2c();
while(1)
{
if(show)
{
init_lcd();
show=0;
lcd_write_data(cd[0]);
delay1ms(5);
lcd_write_data(cd[1]);
delay1ms(5);
lcd_write_data(cd[2]);
delay1ms(5);
mycmd=uchartouintcmd(cd[0],cd[1],cd[2]);
switch(mycmd)
{
case 0:
sendstring_uart("000");
break;
case 1:
sendstring_uart("001");
break;
case 2:
sendstring_uart("002");
break;
case 3:
sendstring_uart("003");
break;
case 4:
sendstring_uart("004");
break;
case 5:
sendstring_uart("005");
break;
default:
sendstring_uart("999");
}
if(mycmd==2)
{
i2c_send(0x02,88);
delay1ms(500);
mycmd=i2c_rec(0x02);
sendstring_uart("slave2");
}
else
{
i2c_send(0x03,88);
delay1ms(500);
mycmd=i2c_rec(0x03);
sendstring_uart("slave3");
}
}
}
}
//串口初始化函数
void init_com(void)
{
SYNC=0; //选择异步通信模式
BRGH=1; //选择高速波特率发生模式
SPBRG=25; //设置波特率为9600bps,4M
SPEN=1; //串行通信端口打开,模块连接引脚TX,RX
TRISC7=1; //RX引脚设置为输入
TRISC6=0; //TX引脚设置为输出
TXEN=1; //允许发送数据
CREN=1; //允许接收数据
GIE=1; //总中断允许
PEIE=1; //外围功能模块中断允许
RCIE=1; //串口接收中断允许
}
//内部函数
uint uchartouintcmd(uchar cmd1,uchar cmd2,uchar cmd3)
{
uint cmd;
cmd=(cmd1-48)*100+(cmd2-48)*10+(cmd3-48);
return cmd;
}
//*********************中断服务程序******************
void interrupt isr(void)
{
if(RCIE&&RCIF) //判断是否为uart接收中断
{
cd[cdcount]=RCREG;
cdcount++;
if(RCREG=='q')
{
senddata_uart('a');
cdcount=0;
return;
}
if(cdcount>3)
{
cdcount=0;
if(RCREG=='z')
{
show=1;
senddata_uart('e');
}
else
{
senddata_uart('c');
}
}
//senddata_uart_i(cd+2); //将接收到的数据+2后送回
}
}
//******************lcd初始化*******************
void init_lcd(void)
{
TRISE=0x00;
TRISD=0x00;
ADCON1=ADCON1|0X82;
PORTE=0;
PORTD=0;
lcd_write_com(0x38);
lcd_write_com(0x0f);
lcd_write_com(0x06);
lcd_write_com(0x01);
lcd_write_com(0x80);
}
void lcd_write_data(uchar data)
{
PORTE=0x01;
PORTD=data;
delay1ms(5);
PORTE=0x05;
delay1ms(5);
PORTE=0x01;
}
void lcd_write_com(uchar com)
{
PORTE=0x00;//避免位操作,会出现读修改写的错误PORTEbits.RE0=0;PORTEbits.RE1=0;
PORTD=com;
delay1ms(5);
PORTE=0x04;
delay1ms(5);
PORTE=0x00;
}
//******************uart发送数据*******************
void senddata_uart(uchar cdd)
{
while(!TRMT); //等待发送移位寄存器空
TXREG=cdd;
}
//*************uart发送数据 中断专用***************
void senddata_uart_i(uchar cdd)
{
while(!TRMT); //等待发送移位寄存器空
TXREG=cdd;
}
//************************发送字符串数据***********************
void sendstring_uart(const uchar *dd)
{
while((*dd)!=0)
{
senddata_uart(*dd);
dd++;
}
}
//*****************延时 n*1ms 12MHz*****************
void delay1ms(uint DelayTime)
{
uint temp;
for(;DelayTime>0;DelayTime--)
{
for(temp=0;temp<270;temp++)
{;}
}
}
void init_i2c(void)
{
TRISC3=1;
TRISC4=1;
SSPCON1=0X28;
SSPCON2=0X00;
SSPSTAT=0X80;
SSPADD=0X09;
}
void i2c_send(uchar add,uchar data)
{
SSPIF=0;
SEN=1;
while(!SSPIF);
SSPIF=0;
SSPBUF=add|0x00; // R/W=0;
while(!SSPIF);
SSPIF=0;
// SSPBUF=reg_add; //从器件寄存器地址
// while(!SSPIF);
// SSPIF=0;
SSPBUF=data; //从器件寄存器地址数据
while(!SSPIF);
SSPIF=0;
SSPBUF=data-1; //从器件寄存器地址数据
while(!SSPIF);
SSPIF=0;
PEN=1;
while(!SSPIF);
SSPIF=0;
}
uchar i2c_rec(uchar add)
{
unsigned char TEMP;//返回值
SSPIF=0;
SEN=1;
while(!SSPIF);
SSPIF=0;
SSPBUF=add|0x00; //寻址,写器件地址,R/W=0,下一步为写入
while(!SSPIF);
SSPIF=0;
// SSPBUF=reg_add; //写DS1307寄存器地址
// while(!SSPIF);
// SSPIF=0;
NOP();
RSEN=1; //改变方向需要重启连接
while(!SSPIF);
SSPIF=0;
SSPBUF=add|0x01; //对寻址器件下达读命令写器件地址,R/W=1,下一步为写入读出
while(!SSPIF);
SSPIF=0;
NOP();NOP();NOP();
RCEN=1; //命令下达结束,改数据传输需要重启连接
while(!SSPIF);
SSPIF=0;
TEMP=SSPBUF; ////读收到的数据////////////////////////////////
ACKDT=1; //应答数据是高或低
ACKEN=1; //产生应答
while(!SSPIF);
SSPIF=0;
PEN=1; //结束通讯
while(!SSPIF);
SSPIF=0;
return TEMP;
}
pic i2c主从通讯源码
5星 · 超过95%的资源 需积分: 12 107 浏览量
2013-08-10
17:56:29
上传
评论
收藏 4KB RAR 举报
hljria
- 粉丝: 2
- 资源: 14
最新资源
- mmqrcode1714153659780.png
- Screenshot_2024-04-27-06-08-58-486_com.baidu.xin.aiqicha.jpg
- 基于Javaweb+Tomcat+MySQL的大学生公寓管理系统+sql文件.zip
- 实训作业基于javaweb的订单管理系统源码+数据库+实训报告.zip
- 多机调度问题贪心算法基于最小堆和贪心算法求解多机调度问题.zip
- 基于同态加密技术的匿名电子投票系统源码.zip
- Pyqt5项目框架-PyQt项目开发实践
- 基于C通过MQTT的智能农业大棚管理系统(本科毕业设计)
- python+CNN的网络入侵检测算法源码.zip
- js 实现记住密码功能 js.cookie.min.js
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈