找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8551|回复: 5
收起左侧

ST75256 240X160 LCD32级(红白双色)灰度液晶屏做的DS3231时钟含源代码引脚说明

  [复制链接]
ID:358930 发表于 2018-12-3 00:50 | 显示全部楼层 |阅读模式
TB此屏程序来之不易,240X160显示,驱动兼容ST75256但并不确定只是能用,三个点完成一个像数显示,32级灰度可调节,红白双色背光,我只是用初始化代码完成一个整套DS3231时间和温度显示。但提供完整工程源代码,这点难得,谢谢。

制作出来的实物图如下:
20181203_002208.jpg 20181203_002221.jpg 20181203_002231.jpg 20181203_002236.jpg

单片机源程序如下:
  1. #include <reg52.H>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit lcd_reset=P1^0; //RST
  6. sbit lcd_wr=P1^1; //WR
  7. sbit lcd_en=P1^2; //RD
  8. sbit lcd_rs=P1^3; // AO
  9. sbit lcd_cs1=P1^4; //CS
  10. #define DataPort P0   //DataBUS
  11. #include "8x16.h"

  12. #define ulong  unsigned long

  13. /*****************************************************************************************************
  14. *******************************************DS3231变量定义*********************************************
  15. *****************************************************************************************************/
  16. sbit DS3231_IIC_SDA=P3^6;
  17. sbit DS3231_IIC_SCL=P3^7;
  18. uchar RTC_Data[8];
  19. uchar RTC_Data1[8];
  20. uchar RTC_Set_ID;
  21. code uchar rtc_address[8]={0x00,0x01,0x02,0x04,0x05,0x03,0x06,0x11};//秒分时日月周年 最低位读写位
  22. uchar display_buff[16];                                                         //时间显示数组                                                                                  
  23. /*****************************************************************************************************
  24. *********************************************变量定义*************************************************
  25. *****************************************************************************************************/
  26. bit T0_Flag;                                                                         //定时器T01ms标志位
  27. bit laba_flag;                                                                         //蜂鸣器标志位
  28. bit Open_Flag;                                                                         //蜂鸣器标志位
  29. bit RTC_Save_Flag;                                                                   //设置时间标志位
  30. bit shezhi_display_flag;
  31. void delayms(uint x);                                                         //延时函数
  32. void Time_Fun();                                                                 //时基、走时函数
  33. void DS3231_Read_time();                                                 //读取时间
  34. void DS3231_write_time();                                                 //写入时间
  35. void DS3231_Init();                                                                 //时间模块初始化         
  36. /********************************************初始化时间************************************************/
  37. void Ram_init()
  38. {
  39.         DS3231_Read_time();                                //读取 秒分时日月周年
  40.         if((!RTC_Data[6])&&(!RTC_Data[5])&&(!RTC_Data[4])&&(!RTC_Data[3])&&(!RTC_Data[2])&&(!RTC_Data[1])&&(!RTC_Data[0]))
  41.         {
  42.                 RTC_Data[0]=0;       //秒                              //秒分时日月周年 最低位读写位
  43.                 RTC_Data[1]=0;                 //分
  44.                 RTC_Data[2]=12;                 //时
  45.                 RTC_Data[3]=3;                 //日
  46.                 RTC_Data[4]=11;                 //月
  47.                 RTC_Data[5]=2;                 //周
  48.                 RTC_Data[6]=15;                 //年
  49.                 DS3231_write_time();                    //写入 秒分时日月周年
  50.         }
  51.         RTC_Set_ID=0;       
  52. }
  53. void Time_Fun()// 时基、走时函数
  54. {
  55.         static        uchar T10Ms_Cnt=0,T200Ms_Cnt=0;
  56.         static uchar Buzz_On_Cnt=0,RTC_Save_Cnt=0;       
  57.        
  58.         T10Ms_Cnt++;       
  59.         if(T10Ms_Cnt>=5)
  60.         {
  61.                 T10Ms_Cnt=0;
  62.                 KeyDataProcess();
  63.                 if(laba_flag)
  64.                 {
  65.                         Buzz_On_Cnt++;
  66.                         if(Buzz_On_Cnt>=10)
  67.                         {
  68.                                 laba_flag=0;
  69.                                 Buzz_On_Cnt=0;
  70.                         }
  71.                 }       
  72.                 if(RTC_Save_Flag)
  73.                 {
  74.                         RTC_Save_Cnt++;
  75.                         if(RTC_Save_Cnt>=50)
  76.                         {
  77.                                 RTC_Save_Cnt=0;
  78.                                 RTC_Save_Flag=0;
  79.                                 RTC_Set_ID=0;
  80.                                 DS3231_write_time();
  81.                         }
  82.                 }
  83.         }
  84.         T200Ms_Cnt++;
  85.         if(T200Ms_Cnt>=100&&shezhi_display_flag==0)
  86.         {
  87.                 T200Ms_Cnt=0;               
  88.                 if(!RTC_Set_ID)
  89.                         DS3231_Read_time();
  90.          
  91.         }
  92. }

  93. void delayms(uint x)
  94. {
  95.         uint i,j;
  96.         for(i=x;i<0;i--)
  97.                 for(j=110;j<0;j--);
  98. }
  99. /**********************************************DS3231函数**********************************************/
  100. void DS3231_IIC_delay()//IIC延时函数。延时4个机器周期。   
  101. {
  102.         _nop_();_nop_();_nop_();_nop_();
  103. }

  104. void DS3231_IIC_start()//起始信号
  105. {   
  106.      DS3231_IIC_SDA=1;
  107.      DS3231_IIC_SCL=1;
  108.      DS3231_IIC_delay();
  109.      DS3231_IIC_SDA=0;
  110.      DS3231_IIC_delay();
  111.      DS3231_IIC_SCL=0;
  112. }

  113. void DS3231_IIC_stop()//停止信号
  114. {
  115.     DS3231_IIC_SDA=0;
  116.     DS3231_IIC_delay();
  117.     DS3231_IIC_SCL=1;
  118.     DS3231_IIC_delay();
  119.     DS3231_IIC_SDA=1;
  120.     DS3231_IIC_delay();
  121. }

  122. bit DS3231_IIC_Tack()//接收应答
  123. {
  124.     bit ack;
  125.     DS3231_IIC_SDA=1;
  126.     DS3231_IIC_delay();
  127.     DS3231_IIC_SCL=1;
  128.     DS3231_IIC_delay();
  129.     ack=DS3231_IIC_SDA;
  130.     DS3231_IIC_delay();
  131.     DS3231_IIC_SCL=0;
  132.     DS3231_IIC_delay();
  133.     return ack;
  134. }

  135. void DS3231_IIC_write_byte(uchar Data)//写入数据函数
  136. {
  137.         uchar i;
  138.         for(i=0;i<8;i++)
  139.         {
  140.                 if(Data&0x80)
  141.                 DS3231_IIC_SDA=1;
  142.                 else
  143.                 DS3231_IIC_SDA = 0;
  144.                 DS3231_IIC_delay();
  145.                 DS3231_IIC_SCL=1;
  146.                 DS3231_IIC_delay();
  147.                 DS3231_IIC_SCL=0;
  148.                 DS3231_IIC_delay();
  149.                 Data=Data<<1;
  150.         }
  151. }

  152. uchar DS3231_IIC_read_byte()//读取数据函数
  153. {
  154.     uchar i;
  155.     uchar Data;      
  156.     for(i=0;i<8;i++)
  157.     {
  158.         DS3231_IIC_SCL=1;
  159.         DS3231_IIC_delay();
  160.         Data=Data<<1;
  161.         DS3231_IIC_delay();
  162.       
  163.         if(DS3231_IIC_SDA)
  164.         Data=Data|0x01;
  165.         DS3231_IIC_SCL=0;
  166.         DS3231_IIC_delay();
  167.     }
  168.     return Data;
  169. }

  170. void DS3231_IIC_single_byte_write(uchar Waddr,uchar Data)//写入数据函数
  171. {
  172.     DS3231_IIC_start();
  173.     DS3231_IIC_write_byte(0xd0);
  174.     DS3231_IIC_Tack();
  175.     DS3231_IIC_write_byte(Waddr);
  176.     DS3231_IIC_Tack();
  177.     DS3231_IIC_write_byte(Data);
  178.     DS3231_IIC_Tack();
  179.     DS3231_IIC_stop();
  180. }

  181. uchar DS3231_IIC_single_byte_read(uchar Waddr)//读取数据函数
  182. {
  183.     uchar Data;
  184.     DS3231_IIC_start();
  185.     DS3231_IIC_write_byte(0xd0);
  186.     DS3231_IIC_Tack();
  187.     DS3231_IIC_write_byte(Waddr);
  188.     DS3231_IIC_Tack();
  189.     DS3231_IIC_stop();
  190.     DS3231_IIC_start();
  191.     DS3231_IIC_write_byte(0xd1);
  192.     DS3231_IIC_Tack();
  193.     Data=DS3231_IIC_read_byte();
  194.     DS3231_IIC_delay();
  195.     DS3231_IIC_stop();
  196.     return Data;
  197. }

  198. void DS3231_Read_time()//读取时间
  199. {
  200.     uchar i,tmp,tmp1,tmp2;         
  201.     for(i=0;i<8;i++)
  202.     {
  203.             tmp = DS3231_IIC_single_byte_read(rtc_address[i]);
  204.             tmp1 = tmp/16;
  205.             tmp2 = tmp%16;
  206.                 RTC_Data[i]=tmp1*10+tmp2;
  207.     }   
  208. }

  209. void DS3231_write_time()//写入时间
  210. {
  211.     uchar i,tmp;
  212.     for(i=0;i<7;i++)
  213.     {      
  214.         tmp=RTC_Data[i]/10;//BCD处理
  215.         RTC_Data1[i]=RTC_Data[i]%10;
  216.         RTC_Data1[i]=RTC_Data1[i]+tmp*16;
  217.     }
  218.     for(i=0;i<7;i++)
  219.     {
  220.         DS3231_IIC_single_byte_write(rtc_address[i],RTC_Data1[i]);
  221.     }
  222.     DS3231_IIC_single_byte_write(0x0e,0x0c);
  223. }

  224. void DS3231_Init()
  225. {
  226.     DS3231_IIC_SDA=1;
  227.     DS3231_IIC_SCL=1;
  228.     DS3231_IIC_single_byte_write(0x0e,0x0c);
  229. }



  230. /*延时:1 毫秒的i 倍*/
  231. void delay(int i)
  232. {
  233. int j,k;
  234. for(j=0;j<i;j++)
  235. for(k=0;k<110;k++);
  236. }
  237. /*延时:1us 的i 倍*/
  238. void delay_us(int i)
  239. {
  240. int j,k;
  241. for(j=0;j<i;j++)
  242. for(k=0;k<2;k++);
  243. }

  244. //并口方式
  245. //写指令到LCD 模块
  246. void transfer_command_lcd(int data1)
  247. {
  248. lcd_rs=0;
  249. lcd_en=1;
  250. P0=data1;
  251. lcd_en=0;
  252. }

  253. //写数据到LCD 模块
  254. void transfer_data_lcd(int data1)
  255. {
  256. lcd_rs=1;
  257. lcd_en=1;
  258. P0=data1;
  259. lcd_en=0;
  260. }


  261. void initial_lcd()
  262. {
  263. lcd_wr=0;   //0 写  1读
  264. lcd_cs1=0;  //cs 0有效
  265. lcd_reset=0; //rst
  266. delay(50);
  267. lcd_reset=1;
  268. delay(50);


  269. transfer_command_lcd(0x30); //EXT=0
  270. transfer_command_lcd(0x94); //Sleep out
  271. transfer_command_lcd(0x31); //EXT=1
  272. transfer_command_lcd(0xD7); //Autoread disable
  273. transfer_data_lcd(0X9F); //
  274. transfer_command_lcd(0x32); //Analog SET
  275. transfer_data_lcd(0x00); //OSC Frequency adjustment
  276. transfer_data_lcd(0x01); //Frequency on booster capacitors->6KHz
  277. transfer_data_lcd(0x03); //Bias=1/13
  278. transfer_command_lcd(0x20); //灰度设置
  279. transfer_data_lcd(0x01);
  280. transfer_data_lcd(0x03);
  281. transfer_data_lcd(0x05);
  282. transfer_data_lcd(0x07);
  283. transfer_data_lcd(0x09);
  284. transfer_data_lcd(0x0b);
  285. transfer_data_lcd(0x0d);
  286. transfer_data_lcd(0x10);
  287. transfer_data_lcd(0x11);
  288. transfer_data_lcd(0x13);
  289. transfer_data_lcd(0x15);
  290. transfer_data_lcd(0x17);
  291. transfer_data_lcd(0x19);
  292. transfer_data_lcd(0x1b);
  293. transfer_data_lcd(0x1d);
  294. transfer_data_lcd(0x1f);
  295. transfer_command_lcd(0x30); //EXT1=0,EXT0=0,表示选择了“扩展指令表 1”
  296. transfer_command_lcd(0x75); //页地址设置
  297. transfer_data_lcd(0X00); //起始页地址:YS=0X00
  298. transfer_data_lcd(0X14); //结束页地址:YE=0x1F每 4 行为一页,第 0~3 行为第 0 页,第 124~127 行为第 31 页(31=0x1f)
  299. transfer_command_lcd(0x15); //列地址设置
  300. transfer_data_lcd(0X00); //起始列地址:XS=0
  301. transfer_data_lcd(0Xef); //结束列地址:XE=240(0xef)
  302. transfer_command_lcd(0xbc); //行列扫描方向
  303. transfer_data_lcd(0x02); //MX.MY=Normal
  304. // transfer_command_lcd(0x0c); //数据格式选择,0x0C 是低位在前 D0-D7,0x08 是高位在前 D7-D0
  305. transfer_command_lcd(0xCA); //显示控制
  306. transfer_data_lcd(0X00); //设置 CL 驱动频率:CLD=0
  307. transfer_data_lcd(0X9F); //占空比:Duty=160
  308. transfer_data_lcd(0X20); //N 行反显:Nline=off
  309. transfer_command_lcd(0xF0); //显示模式
  310. transfer_data_lcd(159); //如果设为 0x11:表示选择 4 灰度级模式,如果设为 0x10:表示选择黑白模式
  311. transfer_command_lcd(0x81); //设置对比度,“0x81”不可改动,紧跟着的 2 个数据是可改的,但“先微调后粗调”这
  312. transfer_data_lcd(0xB0);  //微调对比度,可调范围 0x00~0x3f,共 64 级 0
  313. transfer_data_lcd(0x03); //粗调对比度,可调范围 0x00~0x07,共 8 级
  314. transfer_command_lcd(0x20); //电源控制
  315. transfer_data_lcd(0x0B); //D0=regulator ; D1=follower ; D3=booste, on:1 off:0
  316. delay_us(100);
  317. transfer_command_lcd(0xAF); //打开显示
  318. }

  319. #define STC90C
  320. #include "uart2017.c"

  321. void printf_num(unsigned char x) //写数据
  322. {
  323. Com_SendByte(0x30+x/100);
  324. Com_SendByte(0x30+x%100/10);
  325. Com_SendByte(0x30+x%10);
  326. Com_SendByte(' ');
  327. }


  328. void locate(unsigned char x, unsigned char y) //写地址
  329. {
  330. x+=24;
  331. y=159-y;
  332. transfer_command_lcd(x&0x0f);
  333. transfer_command_lcd(0x10|(x>>4));
  334. transfer_command_lcd(0x60+(y&0x0f));
  335. transfer_command_lcd(0x70+(y>>4));
  336. }

  337. void cls(unsigned int c)
  338. {
  339. unsigned char y,j;
  340. for(y=0;y<160;y++)
  341. {
  342.   locate(0,y);
  343.   for(j=0;j<80;j++)
  344.    {
  345.     transfer_data_lcd(c>>8);
  346.     transfer_data_lcd(c);
  347.    }
  348. }
  349. }
  350. void printf_c(unsigned char x, unsigned char y,unsigned char c)
  351. {
  352. unsigned char i,j;
  353. unsigned char temp;

  354. for(i=0;i<16;i++)
  355. {
  356.   locate(x,y+i);
  357.   temp=Font8x16[c][i];
  358.   printf_num(temp);
  359.   for(j=0;j<8;j++)
  360.    {
  361.     if(temp & 0x80)
  362.      {
  363.       transfer_data_lcd(0xff);
  364.       transfer_data_lcd(0xff);
  365.      }
  366.      else
  367.      {
  368.       transfer_data_lcd(0x00);
  369.       transfer_data_lcd(0x00);
  370.      }
  371.     temp<<=1;
  372.    }
  373.   
  374. }

  375. }

  376. void printf(unsigned char x, unsigned char y, unsigned char *s)
  377. {
  378. while(*s)
  379. {
  380.   printf_c(x,y,*s);
  381.   s++;
  382.   x+=8;
  383. }
  384. }
  385. /************************显示1时间************************************/
  386. void display1(void)
  387. {
  388.           char sy=10;//设置时间显示 列位置
  389.     char sx=66;//设置时间显示  行位置
  390.        
  391.    printf_c(sy+6,sx,(RTC_Data[2]/10)+0x30);//列、行、变量+0x30(显)、颜色
  392.    printf_c(sy+12,sx,(RTC_Data[2]%10)+0x30);//列、行、变量+0x30(显)、颜色
  393.        
  394.    printf(sy+18,sx,":");//列、行、字符串、颜色       
  395.        
  396.          printf_c(sy+24,sx,(RTC_Data[1]/10)+0x30);//列、行、变量+0x30(显)、颜色
  397.    printf_c(sy+30,sx,(RTC_Data[1]%10)+0x30);//列、行、变量+0x30(显)、颜色
  398.        
  399.          printf(sy+36,sx,":");//列、行、字符串、颜色       
  400.        
  401.    printf_c(sy+42,sx,(RTC_Data[0]/10)+0x30);//列、行、变量+0x30(显)、颜色
  402.    printf_c(sy+48,sx,(RTC_Data[0]%10)+0x30);//列、行、变量+0x30(显)、颜色   
  403. }
  404. /************************显示2日期************************************/
  405. void display2(void)
  406. {
  407.           char sy=0;//设置日期显示 列位置
  408.     char sx=50;//设置日期显示  行位置
  409.          printf_c(sy+0,sx,(20/10)+0x30);//列、行、变量+0x30(显)、颜色
  410.    printf_c(sy+6,sx,(20%10)+0x30);//列、行、变量+0x30(显)、颜色
  411.        
  412.    printf_c(sy+12,sx,(RTC_Data[6]/10)+0x30);//列、行、变量+0x30(显)、颜色
  413.    printf_c(sy+18,sx,(RTC_Data[6]%10)+0x30);//列、行、变量+0x30(显)、颜色
  414.        
  415.    printf(sy+24,sx,"-");//列、行、字符串、颜色       
  416.        
  417.          printf_c(sy+30,sx,(RTC_Data[4]/10)+0x30);//列、行、变量+0x30(显)、颜色
  418.    printf_c(sy+36,sx,(RTC_Data[4]%10)+0x30);//列、行、变量+0x30(显)、颜色
  419.        
  420.          printf(sy+42,sx,"-");//列、行、字符串、颜色       
  421.        
  422.    printf_c(sy+48,sx,(RTC_Data[3]/10)+0x30);//列、行、变量+0x30(显)、颜色
  423.    printf_c(sy+54,sx,(RTC_Data[3]%10)+0x30);//列、行、变量+0x30(显)、颜色

  424.    printf(sy+65,sx,"/");//列、行、字符串、颜色
  425.    printf_c(sy+71,sx,(RTC_Data[5]%10)+0x30);//列、行、变量+0x30(显)、颜色


  426. }
  427. /************************显示3温度************************************/
  428. void display3(void)
  429. {
  430.           char sy=18;//设置温度显示 列位置
  431.     char sx=85;//设置温度显示  行位置
  432.          printf(sy+0,sx,"WD:");//列、行、字符串
  433.    printf_c(sy+25,sx,(RTC_Data[7]/10)+0x30);//列、行、变量+0x30(显)、颜色
  434.    printf_c(sy+31,sx,(RTC_Data[7]%10)+0x30);//列、行、变量+0x30(显)、颜色       
  435.    printf(sy+40,sx,"C");//列、行、字符串
  436. }

  437. void main()
  438. {
  439. delay(100);
  440. Ram_init();                                        //初始化时间
  441.         DS3231_Init();                                //模块初始化       
  442.        
  443. InitUART();
  444. SendStr("\r\n\r\nLCD TEST.\r\n\r\n");
  445. initial_lcd(); //对液晶模块进行初始化设置
  446. …………
  447. …………
  448. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

全部资料51hei下载地址:
ST75256显STC89DS3231时间大字符OK1.rar (72.1 KB, 下载次数: 136)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:316832 发表于 2018-12-3 08:12 | 显示全部楼层
谢谢分享精采资料
回复

使用道具 举报

ID:568680 发表于 2019-10-24 17:37 | 显示全部楼层
谢谢分享精采资料
回复

使用道具 举报

ID:163605 发表于 2020-3-10 12:24 | 显示全部楼层
谢谢分享宝贵资料
回复

使用道具 举报

ID:163605 发表于 2020-3-10 12:26 | 显示全部楼层
st75256应该是4级灰度吧?楼主怎么说是32级灰度呢?
回复

使用道具 举报

ID:973741 发表于 2021-12-29 21:54 来自手机 | 显示全部楼层
楼主能分享一下该屏的引脚定义吗,万分感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表