3.5元買到一個I2C器件(ds1307+AT24C32),用12864LCD顯示。內有大字字庫,和一個大字,占兩行的顯示程序。
微信圖片_20180409151647.jpg (118.24 KB, 下載次數: 49)
下載附件
2018-4-9 15:20 上傳
微信圖片_20180409152237.jpg (71.94 KB, 下載次數: 46)
下載附件
2018-4-9 15:26 上傳
微信圖片_20180409151703.jpg (98.46 KB, 下載次數: 49)
下載附件
2018-4-9 15:20 上傳
微信圖片_20180409151703.jpg (98.46 KB, 下載次數: 51)
下載附件
2018-4-9 15:21 上傳
微信圖片_20180409151647.jpg (118.24 KB, 下載次數: 50)
下載附件
2018-4-9 15:21 上傳
單片機源程序如下:
- /********************************************************************
- * 文件名 : 串行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)
2018-4-9 15:30 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|