📄 51
字号:
#include <reg51.h>
#include<stdio.h>
#include<intrins.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define sint signed int
#define disp_off 0x3e //显示关
#define disp_on 0x3f //显示开
#define disp_x 0xb8 //页地址为0页
#define disp_z 0xc0 //行地址为0行
#define disp_y 0x40 //列地址为0列
#define comm 0 //命令标志位
#define dat1 1 //数据标志位
#define data_ora P0 //液晶12864的数据端与单片机的P0相连
sbit di =P2^0; //数据命令选择短,H:写数据,L:写指令
sbit rw =P2^1; //读写端,H:read,L:write
sbit e =P2^4; //读写使能
sbit cs1=P2^2; //cs1=H,选择左半屏
sbit cs2=P2^3; //cs2=H,选择右半屏
sbit clk=P1^0; //8563 clk
sbit dat=P1^1; //8563 data
sbit SDA=P2^6; //2416的数据端
sbit SCL=P2^5; //2416的时钟端
#define adin XBYTE[0x7ff8+chnn] //AD转换地址
uchar chnn; //水压力数据路号0~7
uint Vi[8];
uchar fen=0x42,miao=0x38,shi=0x17,riqi=0x02,//设置时间用
yuefen=0x08,xingqi=0x18,nian=0x09,zhongduan;//设置时间用
uchar code tabma[10][16]=
//阴码点阵格式、取模方式为列行式、逆向取模(低位在前),
//十六进制输出,中文16*16,英文8*16 宋体
{
//0(0) 1(1) 2(2) 3(3) 4(4) 5(5) 6(6) 7(7) 8(8) 9(9)
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00}, /*"0",0*/
{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00}, /*"1",1*/
{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,
0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00}, /*"2",2*/
{0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,
0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00}, /*"3",3*/
{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,
0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00}, /*"4",4*/
{0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,
0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00}, /*"5",5*/
{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,
0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00}, /*"6",6*/
{0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,
0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00}, /*"7",7*/
{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,
0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00}, /*"8",8*/
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00}, /*"9",9*/
};
uchar code tab2ma[7][32]=
// 日(0) 一(1) 二(2) 三(3) 四(4) 五(5) 六(6)
{
{0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,
0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,
0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00}, /*"日",0*/
{0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
0x80,0x80,0x80,0x80,0x80,0xC0,0x80,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, /*"一",1*/
{0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,
0x04,0x04,0x04,0x06,0x04,0x00,0x00,0x00,
0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
0x10,0x10,0x10,0x10,0x10,0x18,0x10,0x00}, /*"二",2*/
{0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,
0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,
0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00}, /*"三",3*/
{0x00,0xFE,0x02,0x02,0x02,0xFE,0x02,0x02,
0xFE,0x02,0x02,0x02,0x02,0xFE,0x00,0x00,
0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,
0x21,0x22,0x22,0x22,0x22,0x7F,0x00,0x00}, /*"四",4*/
{0x00,0x02,0x82,0x82,0x82,0x82,0xFE,0x82,
0x82,0x82,0xC2,0x82,0x02,0x00,0x00,0x00,
0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,
0x20,0x20,0x3F,0x20,0x20,0x30,0x20,0x00}, /*"五",5*/
{0x10,0x10,0x10,0x10,0x10,0x91,0x12,0x1E,
0x94,0x10,0x10,0x10,0x10,0x10,0x10,0x00,
0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x00,
0x00,0x01,0x02,0x0C,0x78,0x30,0x00,0x00}, /*"六",6*/
};
uchar code nianma[]=
//年(0) 月(1) 日(2) 星(3) 期(4)
{0x40,0x20,0x10,0x0C,0xE3,0x22,0x22,0x22,
0xFE,0x22,0x22,0x22,0x22,0x02,0x00,0x00,
0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x04,
0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00}; /*"年",0*/
uchar code yuema[]=
{0x00,0x00,0x00,0x00,0x00,0xFF,0x11,0x11,
0x11,0x11,0x11,0xFF,0x00,0x00,0x00,0x00,
0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x01,
0x01,0x21,0x41,0x3F,0x00,0x00,0x00,0x00}; /*"月",1*/
uchar code rima[]=
{0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,
0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,
0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00}; /*"日",2*/
uchar code xingqima[]=
{0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,
0x2A,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,
0x00,0x48,0x46,0x41,0x49,0x49,0x49,0x7F,
0x49,0x49,0x49,0x49,0x49,0x41,0x40,0x00, /*"星",3*/
0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,
0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,
0x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,
0x18,0x07,0x02,0x22,0x42,0x3F,0x00,0x00}; /*"期",4*/
//时(0) 分(1) 秒(2)
uchar code shima[]=
{0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,
0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,
0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,
0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00}; /*"时",0*/
uchar code fenma[]=
{0x80,0x40,0x20,0x98,0x87,0x82,0x80,0x80,
0x83,0x84,0x98,0x30,0x60,0xC0,0x40,0x00,
0x00,0x80,0x40,0x20,0x10,0x0F,0x00,0x00,
0x20,0x40,0x3F,0x00,0x00,0x00,0x00,0x00}; /*"分",1*/
uchar code miaoma[]=
{0x12,0x12,0xD2,0xFE,0x91,0x11,0xC0,0x38,
0x10,0x00,0xFF,0x00,0x08,0x10,0x60,0x00,
0x04,0x03,0x00,0xFF,0x00,0x83,0x80,0x40,
0x40,0x20,0x23,0x10,0x08,0x04,0x03,0x00}; /*"秒",2*/
void delay(sint n); //延时程序
void start_bit(void); //IIC开始条件
void stop_bit(void); //IIC停止条件
void mast_ack(void); //IIC应答
bit write_8bit(uchar ch); //IIC写8位数据
uchar read24c16(uint address,uchar *shu); //IIC读字节数据
uchar write24c16(uint address,uchar ddata); //IIC写字节数据
uchar page_wr(uint firstw_ad,uint counter,uchar *firstr_ad);//IIC页写
uchar page_rd(uint firstrd_ad,uint count,uchar *firstwr_ad);//IIC页读
void xie_start(); //开始条件
void xie_stop(); //停止条件
bit xie1(uchar shu); //向8563中写入1个字
uchar du1(); //从8563中读出1个字
uchar du(); //从8563中读出时间和日期
uchar xie(); //向8563中设置时间和日期
void delay1 (uint ms); //延时
void wr_lcd (uchar dat_comm,uchar content); //向12864中写命令
void chk_busy (); //忙闲检测
void lat_disp (uchar data1,uchar data2); //写点阵
void chn_disp (uchar x,uchar y,uchar xl,uchar yl,uchar row_xl,uchar row_yl,uchar code *chn);
//显示汉字
void init_lcd (); //12864初始化
void disp(); //时间显示程序
void ad0to7(); //8路转换 且转换为压力
uchar ad_action(uchar chn); //1路AD转换
void dispVi(); //显示压力
//-------------主函数--------------------
void main()
{
uchar m=0,k=0;
init_lcd (); //LCD初始化
lat_disp(0x00,0x00);
xie(); //预设时间用,设置好时间后可以屏蔽
du(); //读8563的时间
m=miao; //暂存秒
for (;;)
{
du(); //读8563的时间
if(m!=miao) //1秒时间到
{
m=miao; //暂存秒
if (miao%5==0) //每五秒读一次压力 并显示
{
ad0to7(); //8路转换 且转换为压力
lat_disp(0x00,0x00); //清屏
dispVi(); //显示压力
if((fen%6==0)&(miao==0)) //每六分钟存储一次
{
page_wr(8*k,8,&Vi[0]==0);//存储压力数据 2416共2048个字节 10*24=240次数据
k++;
if(k==240) //1天后数据清零
{
page_wr(0,240,0);
k=0;
}
}
}
else
{
lat_disp(0x00,0x00); //清屏
disp(); //显示时间
}
}
}
}
uchar ad_action(uchar chn) //1路AD转换
{
uchar read_data;
chnn=chn; //把输入路号给变址CHNN
adin=chn; //写 启动转换
delay(15); //延时
read_data=adin; //读AD转换结果
return read_data; //返回AD转换数据
}
void ad0to7() //8路转换 且转换为压力
{
uchar i;
for(i=0;i<8;i++)
Vi[i]=(ad_action(i)/255)*500; //转换为压力0~500Kpa 单位为Kpa
}
/*-----------------------------------------------
调用方式:void start_bit(void)
函数说明:2416开始位
-----------------------------------------------*/
void start_bit(void)
{
SCL=1;_nop_();
SDA=1;_nop_();
SDA=0;_nop_();
SCL=0;_nop_();
}
/*-----------------------------------------------
调用方式:void stop_bit(void)
函数说明:2416停止位
-----------------------------------------------*/
void stop_bit(void)
{
SDA=0;_nop_();
SCL=1;_nop_();
SDA=1;_nop_();
}
/*-----------------------------------------------
调用方式:void mast_ack(void)
函数说明:2416主答函数
-----------------------------------------------*/
void mast_ack(void)
{
SCL=0;_nop_();
SDA=0;_nop_();
SCL=1;_nop_();
SCL=0;_nop_();
SDA=1;_nop_();
}
/*-----------------------------------------------
调用方式:write_8bit(uchar ch)
函数说明:2416写一个字节(8位)数据
-----------------------------------------------*/
bit write_8bit(uchar ch)
{
uchar i=8;
bit fan_w;
SCL=0;_nop_();
while(i--)
{
SDA=(bit)(ch&0x80); //取字节的最高位
_nop_();
ch<<=1; //字节左移一位
SCL=1;_nop_(); //上升沿锁存数据
SCL=0;_nop_();
}
SDA=1;_nop_();
SCL=1;_nop_();
fan_w=SDA; //读应答信号
SCL=0;_nop_();
return(fan_w); //返回应答信号
}
/*----------------------------------------------
调用方式:uchar read24c16(uint address,uchar *shu)
函数说明:读24c16指定地址数据(字节读)
-----------------------------------------------*/
uchar read24c16(uint address,uchar *shu)
{
uchar data rdata;
uchar i=8;
EA=0; //避免与中断冲突
start_bit(); //起始条件
if (write_8bit(0xA0)!=0) //写操作
{
stop_bit();EA=1;return(0); //不成功时 停止 返回0
}
if (write_8bit(address)!=0) //写地址操作
{
stop_bit();EA=1;return(0); //不成功时 停止 返回0
}
start_bit();
if (write_8bit(0xA1)!=0) //读操作
{
stop_bit();EA=1;return(0); //不成功时 停止 返回0
}
while (i--) //8位数据
{
rdata<<=1; //左移 先读高位
SCL=1;_nop_(); //上升沿读数据
if (SDA) rdata|=0x01; //读入数据
SCL=0;_nop_(); //时钟拉低
}
stop_bit(); //停止条件
EA=1;
*shu=rdata; //存读入数据
return (1); //成功 返回1
}
/*-----------------------------------------------
调用方式:void write24c16(uint address,uchar ddata)
函数说明:写数据到24c16的指定地址(字节写)
-----------------------------------------------*/
uchar write24c16(uint address,uchar ddata)
{
EA=0; //避免与中断冲突
start_bit(); //起始条件
if (write_8bit(0xA0)!=0) //写
{
stop_bit();EA=1;return(0); //不成功时 停止 返回0
}
if (write_8bit(address)!=0) //写地址
{
stop_bit();EA=1;return(0); //不成功时 停止 返回0
}
if (write_8bit(ddata)!=0) //写数据
{
stop_bit();EA=1;return(0); //不成功时 停止 返回0
}
stop_bit(); //停止条件
EA=1;
return(1); //成功 返回1
}
/*-----------------------------------------------
调用方式:void page_wr(uint firstw_ad,uint counter,uint data *firstr_ad)
函数说明:2416页面写函数,firstw_ad为写入字节单元的首地址,
*firstr-ad为被写入数据所在首地址指针
counter为写入数据字节数
-----------------------------------------------*/
uchar page_wr(uint firstw_ad,uint counter,uchar *firstr_ad)
{
uchar data *ufirstr_ad;
ufirstr_ad=firstr_ad;
start_bit(); //写开始位
if(write_8bit(0xA0)!=0){stop_bit();return(0);} //写命令
if(write_8bit(firstw_ad)!=0){stop_bit();return(0);} //写首地址
while(counter--) //写字节数减1
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -