TB此屏程序来之不易,240X160显示,驱动兼容ST75256但并不确定只是能用,三个点完成一个像数显示,32级灰度可调节,红白双色背光,我只是用初始化代码完成一个整套DS3231时间和温度显示。但提供完整工程源代码,这点难得,谢谢。
制作出来的实物图如下:
单片机源程序如下:
- #include <reg52.H>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit lcd_reset=P1^0; //RST
- sbit lcd_wr=P1^1; //WR
- sbit lcd_en=P1^2; //RD
- sbit lcd_rs=P1^3; // AO
- sbit lcd_cs1=P1^4; //CS
- #define DataPort P0 //DataBUS
- #include "8x16.h"
- #define ulong unsigned long
- /*****************************************************************************************************
- *******************************************DS3231变量定义*********************************************
- *****************************************************************************************************/
- sbit DS3231_IIC_SDA=P3^6;
- sbit DS3231_IIC_SCL=P3^7;
- uchar RTC_Data[8];
- uchar RTC_Data1[8];
- uchar RTC_Set_ID;
- code uchar rtc_address[8]={0x00,0x01,0x02,0x04,0x05,0x03,0x06,0x11};//秒分时日月周年 最低位读写位
- uchar display_buff[16]; //时间显示数组
- /*****************************************************************************************************
- *********************************************变量定义*************************************************
- *****************************************************************************************************/
- bit T0_Flag; //定时器T01ms标志位
- bit laba_flag; //蜂鸣器标志位
- bit Open_Flag; //蜂鸣器标志位
- bit RTC_Save_Flag; //设置时间标志位
- bit shezhi_display_flag;
- void delayms(uint x); //延时函数
- void Time_Fun(); //时基、走时函数
- void DS3231_Read_time(); //读取时间
- void DS3231_write_time(); //写入时间
- void DS3231_Init(); //时间模块初始化
- /********************************************初始化时间************************************************/
- void Ram_init()
- {
- DS3231_Read_time(); //读取 秒分时日月周年
- if((!RTC_Data[6])&&(!RTC_Data[5])&&(!RTC_Data[4])&&(!RTC_Data[3])&&(!RTC_Data[2])&&(!RTC_Data[1])&&(!RTC_Data[0]))
- {
- RTC_Data[0]=0; //秒 //秒分时日月周年 最低位读写位
- RTC_Data[1]=0; //分
- RTC_Data[2]=12; //时
- RTC_Data[3]=3; //日
- RTC_Data[4]=11; //月
- RTC_Data[5]=2; //周
- RTC_Data[6]=15; //年
- DS3231_write_time(); //写入 秒分时日月周年
- }
- RTC_Set_ID=0;
- }
- void Time_Fun()// 时基、走时函数
- {
- static uchar T10Ms_Cnt=0,T200Ms_Cnt=0;
- static uchar Buzz_On_Cnt=0,RTC_Save_Cnt=0;
-
- T10Ms_Cnt++;
- if(T10Ms_Cnt>=5)
- {
- T10Ms_Cnt=0;
- KeyDataProcess();
- if(laba_flag)
- {
- Buzz_On_Cnt++;
- if(Buzz_On_Cnt>=10)
- {
- laba_flag=0;
- Buzz_On_Cnt=0;
- }
- }
- if(RTC_Save_Flag)
- {
- RTC_Save_Cnt++;
- if(RTC_Save_Cnt>=50)
- {
- RTC_Save_Cnt=0;
- RTC_Save_Flag=0;
- RTC_Set_ID=0;
- DS3231_write_time();
- }
- }
- }
- T200Ms_Cnt++;
- if(T200Ms_Cnt>=100&&shezhi_display_flag==0)
- {
- T200Ms_Cnt=0;
- if(!RTC_Set_ID)
- DS3231_Read_time();
-
- }
- }
-
- void delayms(uint x)
- {
- uint i,j;
- for(i=x;i<0;i--)
- for(j=110;j<0;j--);
- }
- /**********************************************DS3231函数**********************************************/
- void DS3231_IIC_delay()//IIC延时函数。延时4个机器周期。
- {
- _nop_();_nop_();_nop_();_nop_();
- }
- void DS3231_IIC_start()//起始信号
- {
- DS3231_IIC_SDA=1;
- DS3231_IIC_SCL=1;
- DS3231_IIC_delay();
- DS3231_IIC_SDA=0;
- DS3231_IIC_delay();
- DS3231_IIC_SCL=0;
- }
- void DS3231_IIC_stop()//停止信号
- {
- DS3231_IIC_SDA=0;
- DS3231_IIC_delay();
- DS3231_IIC_SCL=1;
- DS3231_IIC_delay();
- DS3231_IIC_SDA=1;
- DS3231_IIC_delay();
- }
- bit DS3231_IIC_Tack()//接收应答
- {
- bit ack;
- DS3231_IIC_SDA=1;
- DS3231_IIC_delay();
- DS3231_IIC_SCL=1;
- DS3231_IIC_delay();
- ack=DS3231_IIC_SDA;
- DS3231_IIC_delay();
- DS3231_IIC_SCL=0;
- DS3231_IIC_delay();
- return ack;
- }
- void DS3231_IIC_write_byte(uchar Data)//写入数据函数
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- if(Data&0x80)
- DS3231_IIC_SDA=1;
- else
- DS3231_IIC_SDA = 0;
- DS3231_IIC_delay();
- DS3231_IIC_SCL=1;
- DS3231_IIC_delay();
- DS3231_IIC_SCL=0;
- DS3231_IIC_delay();
- Data=Data<<1;
- }
- }
- uchar DS3231_IIC_read_byte()//读取数据函数
- {
- uchar i;
- uchar Data;
- for(i=0;i<8;i++)
- {
- DS3231_IIC_SCL=1;
- DS3231_IIC_delay();
- Data=Data<<1;
- DS3231_IIC_delay();
-
- if(DS3231_IIC_SDA)
- Data=Data|0x01;
- DS3231_IIC_SCL=0;
- DS3231_IIC_delay();
- }
- return Data;
- }
- void DS3231_IIC_single_byte_write(uchar Waddr,uchar Data)//写入数据函数
- {
- DS3231_IIC_start();
- DS3231_IIC_write_byte(0xd0);
- DS3231_IIC_Tack();
- DS3231_IIC_write_byte(Waddr);
- DS3231_IIC_Tack();
- DS3231_IIC_write_byte(Data);
- DS3231_IIC_Tack();
- DS3231_IIC_stop();
- }
- uchar DS3231_IIC_single_byte_read(uchar Waddr)//读取数据函数
- {
- uchar Data;
- DS3231_IIC_start();
- DS3231_IIC_write_byte(0xd0);
- DS3231_IIC_Tack();
- DS3231_IIC_write_byte(Waddr);
- DS3231_IIC_Tack();
- DS3231_IIC_stop();
- DS3231_IIC_start();
- DS3231_IIC_write_byte(0xd1);
- DS3231_IIC_Tack();
- Data=DS3231_IIC_read_byte();
- DS3231_IIC_delay();
- DS3231_IIC_stop();
- return Data;
- }
- void DS3231_Read_time()//读取时间
- {
- uchar i,tmp,tmp1,tmp2;
- for(i=0;i<8;i++)
- {
- tmp = DS3231_IIC_single_byte_read(rtc_address[i]);
- tmp1 = tmp/16;
- tmp2 = tmp%16;
- RTC_Data[i]=tmp1*10+tmp2;
- }
- }
- void DS3231_write_time()//写入时间
- {
- uchar i,tmp;
- for(i=0;i<7;i++)
- {
- tmp=RTC_Data[i]/10;//BCD处理
- RTC_Data1[i]=RTC_Data[i]%10;
- RTC_Data1[i]=RTC_Data1[i]+tmp*16;
- }
- for(i=0;i<7;i++)
- {
- DS3231_IIC_single_byte_write(rtc_address[i],RTC_Data1[i]);
- }
- DS3231_IIC_single_byte_write(0x0e,0x0c);
- }
- void DS3231_Init()
- {
- DS3231_IIC_SDA=1;
- DS3231_IIC_SCL=1;
- DS3231_IIC_single_byte_write(0x0e,0x0c);
- }
- /*延时:1 毫秒的i 倍*/
- void delay(int i)
- {
- int j,k;
- for(j=0;j<i;j++)
- for(k=0;k<110;k++);
- }
- /*延时:1us 的i 倍*/
- void delay_us(int i)
- {
- int j,k;
- for(j=0;j<i;j++)
- for(k=0;k<2;k++);
- }
- //并口方式
- //写指令到LCD 模块
- void transfer_command_lcd(int data1)
- {
- lcd_rs=0;
- lcd_en=1;
- P0=data1;
- lcd_en=0;
- }
- //写数据到LCD 模块
- void transfer_data_lcd(int data1)
- {
- lcd_rs=1;
- lcd_en=1;
- P0=data1;
- lcd_en=0;
- }
- void initial_lcd()
- {
- lcd_wr=0; //0 写 1读
- lcd_cs1=0; //cs 0有效
- lcd_reset=0; //rst
- delay(50);
- lcd_reset=1;
- delay(50);
-
- transfer_command_lcd(0x30); //EXT=0
- transfer_command_lcd(0x94); //Sleep out
- transfer_command_lcd(0x31); //EXT=1
- transfer_command_lcd(0xD7); //Autoread disable
- transfer_data_lcd(0X9F); //
- transfer_command_lcd(0x32); //Analog SET
- transfer_data_lcd(0x00); //OSC Frequency adjustment
- transfer_data_lcd(0x01); //Frequency on booster capacitors->6KHz
- transfer_data_lcd(0x03); //Bias=1/13
- transfer_command_lcd(0x20); //灰度设置
- transfer_data_lcd(0x01);
- transfer_data_lcd(0x03);
- transfer_data_lcd(0x05);
- transfer_data_lcd(0x07);
- transfer_data_lcd(0x09);
- transfer_data_lcd(0x0b);
- transfer_data_lcd(0x0d);
- transfer_data_lcd(0x10);
- transfer_data_lcd(0x11);
- transfer_data_lcd(0x13);
- transfer_data_lcd(0x15);
- transfer_data_lcd(0x17);
- transfer_data_lcd(0x19);
- transfer_data_lcd(0x1b);
- transfer_data_lcd(0x1d);
- transfer_data_lcd(0x1f);
- transfer_command_lcd(0x30); //EXT1=0,EXT0=0,表示选择了“扩展指令表 1”
- transfer_command_lcd(0x75); //页地址设置
- transfer_data_lcd(0X00); //起始页地址:YS=0X00
- transfer_data_lcd(0X14); //结束页地址:YE=0x1F每 4 行为一页,第 0~3 行为第 0 页,第 124~127 行为第 31 页(31=0x1f)
- transfer_command_lcd(0x15); //列地址设置
- transfer_data_lcd(0X00); //起始列地址:XS=0
- transfer_data_lcd(0Xef); //结束列地址:XE=240(0xef)
- transfer_command_lcd(0xbc); //行列扫描方向
- transfer_data_lcd(0x02); //MX.MY=Normal
- // transfer_command_lcd(0x0c); //数据格式选择,0x0C 是低位在前 D0-D7,0x08 是高位在前 D7-D0
- transfer_command_lcd(0xCA); //显示控制
- transfer_data_lcd(0X00); //设置 CL 驱动频率:CLD=0
- transfer_data_lcd(0X9F); //占空比:Duty=160
- transfer_data_lcd(0X20); //N 行反显:Nline=off
- transfer_command_lcd(0xF0); //显示模式
- transfer_data_lcd(159); //如果设为 0x11:表示选择 4 灰度级模式,如果设为 0x10:表示选择黑白模式
- transfer_command_lcd(0x81); //设置对比度,“0x81”不可改动,紧跟着的 2 个数据是可改的,但“先微调后粗调”这
- transfer_data_lcd(0xB0); //微调对比度,可调范围 0x00~0x3f,共 64 级 0
- transfer_data_lcd(0x03); //粗调对比度,可调范围 0x00~0x07,共 8 级
- transfer_command_lcd(0x20); //电源控制
- transfer_data_lcd(0x0B); //D0=regulator ; D1=follower ; D3=booste, on:1 off:0
- delay_us(100);
- transfer_command_lcd(0xAF); //打开显示
- }
- #define STC90C
- #include "uart2017.c"
- void printf_num(unsigned char x) //写数据
- {
- Com_SendByte(0x30+x/100);
- Com_SendByte(0x30+x%100/10);
- Com_SendByte(0x30+x%10);
- Com_SendByte(' ');
- }
- void locate(unsigned char x, unsigned char y) //写地址
- {
- x+=24;
- y=159-y;
- transfer_command_lcd(x&0x0f);
- transfer_command_lcd(0x10|(x>>4));
- transfer_command_lcd(0x60+(y&0x0f));
- transfer_command_lcd(0x70+(y>>4));
- }
- void cls(unsigned int c)
- {
- unsigned char y,j;
- for(y=0;y<160;y++)
- {
- locate(0,y);
- for(j=0;j<80;j++)
- {
- transfer_data_lcd(c>>8);
- transfer_data_lcd(c);
- }
- }
- }
- void printf_c(unsigned char x, unsigned char y,unsigned char c)
- {
- unsigned char i,j;
- unsigned char temp;
- for(i=0;i<16;i++)
- {
- locate(x,y+i);
- temp=Font8x16[c][i];
- printf_num(temp);
- for(j=0;j<8;j++)
- {
- if(temp & 0x80)
- {
- transfer_data_lcd(0xff);
- transfer_data_lcd(0xff);
- }
- else
- {
- transfer_data_lcd(0x00);
- transfer_data_lcd(0x00);
- }
- temp<<=1;
- }
-
- }
- }
- void printf(unsigned char x, unsigned char y, unsigned char *s)
- {
- while(*s)
- {
- printf_c(x,y,*s);
- s++;
- x+=8;
- }
- }
- /************************显示1时间************************************/
- void display1(void)
- {
- char sy=10;//设置时间显示 列位置
- char sx=66;//设置时间显示 行位置
-
- printf_c(sy+6,sx,(RTC_Data[2]/10)+0x30);//列、行、变量+0x30(显)、颜色
- printf_c(sy+12,sx,(RTC_Data[2]%10)+0x30);//列、行、变量+0x30(显)、颜色
-
- printf(sy+18,sx,":");//列、行、字符串、颜色
-
- printf_c(sy+24,sx,(RTC_Data[1]/10)+0x30);//列、行、变量+0x30(显)、颜色
- printf_c(sy+30,sx,(RTC_Data[1]%10)+0x30);//列、行、变量+0x30(显)、颜色
-
- printf(sy+36,sx,":");//列、行、字符串、颜色
-
- printf_c(sy+42,sx,(RTC_Data[0]/10)+0x30);//列、行、变量+0x30(显)、颜色
- printf_c(sy+48,sx,(RTC_Data[0]%10)+0x30);//列、行、变量+0x30(显)、颜色
- }
- /************************显示2日期************************************/
- void display2(void)
- {
- char sy=0;//设置日期显示 列位置
- char sx=50;//设置日期显示 行位置
- printf_c(sy+0,sx,(20/10)+0x30);//列、行、变量+0x30(显)、颜色
- printf_c(sy+6,sx,(20%10)+0x30);//列、行、变量+0x30(显)、颜色
-
- printf_c(sy+12,sx,(RTC_Data[6]/10)+0x30);//列、行、变量+0x30(显)、颜色
- printf_c(sy+18,sx,(RTC_Data[6]%10)+0x30);//列、行、变量+0x30(显)、颜色
-
- printf(sy+24,sx,"-");//列、行、字符串、颜色
-
- printf_c(sy+30,sx,(RTC_Data[4]/10)+0x30);//列、行、变量+0x30(显)、颜色
- printf_c(sy+36,sx,(RTC_Data[4]%10)+0x30);//列、行、变量+0x30(显)、颜色
-
- printf(sy+42,sx,"-");//列、行、字符串、颜色
-
- printf_c(sy+48,sx,(RTC_Data[3]/10)+0x30);//列、行、变量+0x30(显)、颜色
- printf_c(sy+54,sx,(RTC_Data[3]%10)+0x30);//列、行、变量+0x30(显)、颜色
- printf(sy+65,sx,"/");//列、行、字符串、颜色
- printf_c(sy+71,sx,(RTC_Data[5]%10)+0x30);//列、行、变量+0x30(显)、颜色
- }
- /************************显示3温度************************************/
- void display3(void)
- {
- char sy=18;//设置温度显示 列位置
- char sx=85;//设置温度显示 行位置
- printf(sy+0,sx,"WD:");//列、行、字符串
- printf_c(sy+25,sx,(RTC_Data[7]/10)+0x30);//列、行、变量+0x30(显)、颜色
- printf_c(sy+31,sx,(RTC_Data[7]%10)+0x30);//列、行、变量+0x30(显)、颜色
- printf(sy+40,sx,"C");//列、行、字符串
- }
-
- void main()
- {
- delay(100);
- Ram_init(); //初始化时间
- DS3231_Init(); //模块初始化
-
- InitUART();
- SendStr("\r\n\r\nLCD TEST.\r\n\r\n");
- initial_lcd(); //对液晶模块进行初始化设置
- …………
- …………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
全部资料51hei下载地址:
ST75256显STC89DS3231时间大字符OK1.rar
(72.1 KB, 下载次数: 136)
|