3.5元买到一个I2C器件(ds1307+AT24C32),用12864LCD显示。内有大字字库,和一个大字,占两行的显示程序。
单片机源程序如下:
- /********************************************************************
- * 文件名 : 串行12864显示.c
- * 描述 : 该程序实现了12864以串行的方式进行通信。用DS1307计时
- * 创建人 : 田*
- * 版本号 : 2.0
- ***********************************************************************/
- #include <reg52.h>
- #include <intrins.h>
- #include <stdio.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code pic0[];
- uchar code pic1[];
- uchar code IC_DAT1[12];
- uchar code IC_DAT2[];
- uchar code IC_DAT3[];
- uchar code IC_DAT4[];
- uchar code IC_DAT5[];
- uchar code IC_DAT6[];
- uchar code IC_DAT7[];
- uchar code IC_DAT8[];
- uchar code IC_DAT9[];
- uchar code dazhi [][48];
- uchar code IC_DAT[12]= "0123456789- ";
- uchar x,y,z,n1,n2,y1,y2,r1,r2;
- void DisplayGraphic(uchar code *adder);
- void DisplayGraphic1(uchar code *adder);
- void DisplayGraphic2(uchar code *adder);
-
- sbit CS=P2^0; //片选信号
- sbit SID=P2^1; //数据信号
- sbit SCLK=P2^2; //时钟信号
- sbit RST=P2^4; //复位信号
- sbit CH = P2^3; //并行、串行选择信号
- sbit SQ=P1^1; //一Hz输入端
- sbit DS=P1^2; //温度输入端
- sbit SCL=P1^3; //I2C时钟输出端
- sbit SDA=P1^4; //I2C数据线
- sbit S1 = P3^5;
- /********************************************************************
- * 名称 : I2C模块程序
- * 功能 : 延时,延时时间为 100us * t。这是通过软件延时,有一定误差。
- * 输入 : t
- * 输出 : 无
- ***********************************************************************/
- /********************************************************************
- * 名称 : delay()
- * 功能 : 延时,延时时间为 100us * t。这是通过软件延时,有一定误差。
- * 输入 : t
- * 输出 : 无
- ***********************************************************************/
- void delay(uint time)
- {
- uint i,j;
- for(i=0;i<time;i++)
- for(j=0;j<10;j++);
- }
- void I2c_start()
- {
- SDA=1;
- delay(1);
- SCL=1;
- delay(1);
- SDA=0;
- delay(1);
- SCL=0;
- delay(1);
- }
-
-
- void I2c_stop()
- {
- SDA=0;
- delay(1);
- SCL=1;
- delay(1);
- SDA=1;
- delay(1);
- }
-
- //·¢?íack
- void I2c_sendAck(bit ack)
- {
- SDA = ack;
- SCL = 1;
- delay(1);
- SCL = 0;
- delay(1);
-
- }
-
- //"?è?ack
- bit I2c_getAck(void)
- {
- bit ack;
- SDA = 1;
- SCL = 1;
- delay(1);
- ack = SDA;
- SCL = 0;
- return ack;
- }
-
- uchar I2c_read()
- {
- uchar i,dat=0;
- SDA=1;
- delay(1);
- for(i=0;i<8;i++)
- {
- SCL=1;
- delay(1);
- dat<<=1;
- dat|=SDA;
- delay(1);
- SCL=0;
- }
- return dat;
- }
-
- void I2c_write(uchar dat)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- SDA=dat>>7;
- dat<<=1;
- delay(1);
- SCL=1;
- delay(1);
- SCL=0;
- delay(1);
- } I2c_getAck();
- }
- void I2c_toDevice(uchar deviceAdd,uchar datAdd,uchar dat)
- {
- I2c_start();
- I2c_write(deviceAdd);
- I2c_write(datAdd);
- I2c_write(dat);
- I2c_stop();
- }
- uchar I2c_fromDevice(uchar deviceAdd,uchar datAdd )
- {
- uchar dat;
- I2c_start();
- I2c_write(deviceAdd);
- I2c_write(datAdd);
- I2c_start();
- I2c_write(deviceAdd+1);
- dat=I2c_read();
- I2c_sendAck(1);
- I2c_stop();
- return dat;
- }
- /********************************************************************
- * 名称 : sendbyte()
- * 功能 : 按照液晶的串口通信协议,发送数据
- * 输入 : zdata
- * 输出 : 无
- ***********************************************************************/
- void sendbyte(unsigned char zdata)
- {
- unsigned int i;
- for(i=0; i<8; i++)
- {
- if((zdata << i) & 0x80)
- {
- SID = 1;
- }
- else
- {
- SID = 0;
- }
- SCLK = 0;
- SCLK = 1;
- }
- }
- /********************************************************************
- * 名称 : write_com()
- * 功能 : 写串口指令
- * 输入 : cmdcode
- * 输出 : 无
- ***********************************************************************/
- void write_com(unsigned char cmdcode)
- {
- CS = 1;
- sendbyte(0xf8);
- sendbyte(cmdcode & 0xf0);
- sendbyte((cmdcode << 4) & 0xf0);
- delay(2);
- }
- /********************************************************************
- * 名称 : write_data()
- * 功能 : 写串口指令
- * 输入 : cmdcode
- * 输出 : 无
- ***********************************************************************/
- void write_data(unsigned char Dispdata)
- {
- CS = 1;
- sendbyte(0xfa);
- sendbyte(Dispdata & 0xf0);
- sendbyte((Dispdata << 4) & 0xf0);
- delay(2);
- }
- /********************************************************************
- * 名称 : lcdinit()
- * 功能 : 初始化函数
- * 输入 : cmdcode
- * 输出 : 无
- ***********************************************************************/
- void lcdinit()
- {
- RST = 0;
- delay(100);
- RST = 1;
- delay(20000);
- write_com(0x30);
- delay(50);
-
- write_com(0x0c);
- delay(50);
- }
- /********************************************************************
- * 名称 : lcdinit1()
- * 功能 : 初始化函数
- * 输入 : cmdcode
- * 输出 : 无
- ***********************************************************************/
- void lcdinit1()
- {
- RST = 0;
- delay(100);
- RST = 1;
- delay(20000);
- write_com(0x34);
- delay(50);
- write_com(0x36);
- delay(50);
- }
- /********************************************************************
- * 名称 : hzkdis()
- * 功能 : 显示字符串
- * 输入 : *s
- * 输出 : 无
- ***********************************************************************/
- void hzkdis(unsigned char code *s)
- {
- while(*s > 0)
- {
- write_data(*s);
- s++;
- delay(50);
- }
- }
-
- /********************************************************************
- * 名称 : Test()
- * 功能 : 显示子函数
- * 输入 : 无
- * 输出 : 无
- ***********************************************************************/
- void Test()
- {
- write_com(0x03);
- delay(50);
- write_com(0x88);
- if(I2c_fromDevice(0xd0,0x02) & 0x20 =0x20)
- hzkdis("PM");
- else
- hzkdis("AM");
- delay(50);
- write_com(0x98);
- hzkdis("20");
- delay(20);
- write_data(0x30+n2);
- delay(20);
- write_data(0x30+n1);
- delay(20);
- write_data(0x2d);
- delay(20);
- write_data(0x30+y2);
- delay(20);
- write_data(0x30+y1);
- delay(20);
- write_data(0x2d);
- delay(20);
- write_data(0x30+r2);
- delay(20);
- write_data(0x30+r1);
- delay(20);
- switch (z)
- { case 0: hzkdis(" 周日") ;break;
- case 1: hzkdis(" 周一") ;break;
- case 2: hzkdis(" 周二") ;break;
- case 3: hzkdis(" 周三") ;break;
- case 4: hzkdis(" 周四") ;break;
- case 5: hzkdis(" 周五") ;break;
- case 6: hzkdis(" 周六") ;break; }
- }
-
- /********************************************************************
- * 名称 : Main()
- * 功能 : 主函数
- * 输入 : 无
- * 输出 : 无
- ***********************************************************************/
- void Main()
- {
- while(1)
- //以下从DS1307读数据
- { uchar ii,num,num1,num2,num00,num01,num02 ,num3,num4,num5,num6;
- I2c_toDevice(0xd0,0x00,0x04);
- delay(20);
-
- I2c_toDevice(0xd0,0x07,0x010);
- delay(30);
-
-
- //以下将数据送LCD显示
- CH = 0;
- delay(1);
- lcdinit();
- delay(10);
- write_com(0x01);
- z=I2c_fromDevice(0xd0,0x03);
-
- //
- num4=I2c_fromDevice(0xd0,0x04);
- r1=num4 & 0x0f;
- r2=(num4 >> 4) & 0x0f;
- num5=I2c_fromDevice(0xd0,0x05);
- y1=num5 & 0x0f;
- y2=(num5 >> 4) & 0x0f;
- num6=I2c_fromDevice(0xd0,0x06);
- n1=num6 & 0x0f;
- n2=(num6 >> 4) & 0x0f;
-
-
- Test();
- lcdinit1();
- delay(10);
-
- DisplayGraphic(pic1);
-
- num01=1;
- while (num01+num02>0)
- { num00=I2c_fromDevice(0xd0,0x02);
- num01=num00 & 0x0f;
- num02=(num00 >> 4) & 0x01;
- num1=1;
- while(num1+num2>0)
- {
-
- num=I2c_fromDevice(0xd0,0x01);
- num1=num & 0x0f;
- num2=(num >> 4) & 0x0f;
-
- x=0;
-
- z=13;
- DisplayGraphic1(dazhi); //显示图片(负号)
- x=1;
-
- z=2;
- DisplayGraphic1(dazhi); //显示图片(2)
- x=2;
-
- z=5;
- DisplayGraphic1(dazhi); //显示图片(5)
- x=1;
- if(num02==1)
- z=1;
- else
- z=15;
- DisplayGraphic2(dazhi); //显示图片(1)
- x=2;
-
- z=num01;
- DisplayGraphic2(dazhi); //显示图片2
-
-
- x=4;
-
- z=num2;
- DisplayGraphic2(dazhi); //显示图片2
- x=5;
-
- z=num1;
- DisplayGraphic2(dazhi); //显示图片2
- x=7;
-
- z=14;
- DisplayGraphic2(dazhi); //显示图片2
-
- x=6;
-
- z=6;
- DisplayGraphic1(dazhi); //显示图片2
- x=3;
-
- z=10;
- DisplayGraphic1(dazhi); //显示图片2
- x=5;
-
- z=5;
- DisplayGraphic1(dazhi); //显示图片2
- x=6;
-
- z=6;
- DisplayGraphic1(dazhi); //显示图片2
- x=7;
-
- z=11;
- DisplayGraphic1(dazhi); //显示图片2
-
-
- delay(10);
-
- for (ii=0;ii<29;ii++)
- {
- while(SQ) ;
- while (!SQ) ;
-
- delay (5);
- x=3;
-
- z=12;
- DisplayGraphic2(dazhi); //显示图片2
- while(SQ) ;
-
- while (!SQ) ;
- x=3;
-
- z=15;
- DisplayGraphic2(dazhi); //显示图片2
- if ( S1 == 0 )
- {
- delay (5);
- if ( S1 ==0 )
- { while ( !S1 );
- }
-
- I2c_toDevice(0xd0,0x01,0x045);
- delay(20);
- I2c_toDevice(0xd0,0x02,0x46);
- delay(20);
- I2c_toDevice(0xd0,0x03,0x06);
- delay(20);
- I2c_toDevice(0xd0,0x04,0x07);
- delay(20);
- I2c_toDevice(0xd0,0x05,0x04);
- delay(20);
- I2c_toDevice(0xd0,0x06,0x18);
- delay(20);
-
- }
- }
-
- }
- }
-
- }
-
- }
-
- //*******显示第行的内容设置
- void DisplayGraphic1(unsigned char code *adder)
- {
- int i,j;
-
- adder= adder+48*z;
-
- for(i=0;i<24;i++) //
- {
- write_com(0x80 + i); //SET 垂直地址 VERTICAL ADD
- write_com(0x80+x); //SET 水平地址 HORIZONTAL ADD
- for(j=0;j<2;j++)
- {
- write_data(*adder);
- adder++;
- }
- }
- }
- //显示第二行内容
- void DisplayGraphic2(unsigned char code *adder)
- {
- int i,j;
-
- adder= adder+48*z;
- //*******显示上半屏内容设置
-
- for(i=0;i<8;i++) //
- {
- write_com(0x98 + i); //SET 垂直地址 VERTICAL ADD
- write_com(0x80+x); //SET 水平地址 HORIZONTAL ADD
- for(j=0;j<2;j++)
- {
- write_data(*adder);
- adder++;
- }
- }
-
-
-
- //*******显示下半屏内容设置
- for(i=0;i<16;i++) //
- {
- write_com(0x80 + i); //SET 垂直地址 VERTICAL ADD
- write_com(0x88+x); //SET 水平地址 HORIZONTAL ADD
- for(j=0;j<2;j++)
- {
- write_data(*adder);
- adder++;
- }
- }
- }
- //显示全屏内容
- void DisplayGraphic(unsigned char code *adder)
- {
- int i,j;
-
-
- //*******显示上半屏内容设置
-
- for(i=0;i<32;i++) //
- {
- write_com(0x80 + i); //SET 垂直地址 VERTICAL ADD
- write_com(0x80); //SET 水平地址 HORIZONTAL ADD
- for(j=0;j<16;j++)
- {
- write_data(*adder);
- adder++;
- }
- }
-
-
-
- //*******显示下半屏内容设置
- for(i=0;i<32;i++) //
- {
- write_com(0x80 + i); //SET 垂直地址 VERTICAL ADD
- write_com(0x88); //SET 水平地址 HORIZONTAL ADD
- for(j=0;j<16;j++)
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
DS1307 LCD12864程序.rar
(219.21 KB, 下载次数: 164)
|