找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5345|回复: 2
收起左侧

在stc15w单片机上的lcd12864显示源程序(并口方式)

[复制链接]
ID:342790 发表于 2018-7-8 09:00 | 显示全部楼层 |阅读模式
基于在stc15w上的显示
LCD12864实验步骤:
1、将12864按照正确方向插到开发板J4上面;
1、MINI USB连接线给开发板通电下载程序,下载软件中内部IRC时钟选择11.0592MHZ;
2、下载程序后,拨动RP1调节显示灰度,LCD12864显示正常(若不行,则LCD12864上的可调电位器也要调节)。
0.jpg

单片机源程序如下:
  1. /****************************************Copyright (c)息---------------------------------------------------------------------------------
  2. ** 文件名  :                main.c                                                         
  3. **--------------------------------------------------------------------------------------------------------
  4. ** 作    者:                三棱镜
  5. ** 创建日期:                2016-4-25
  6. ** 初始版本:                V1.0
  7. ** 描    述:                LCD12864显示实验
  8. **--------------修改信息-----------------------------------------------------------------------------------
  9. ** 修改人  :                       
  10. ** 修改日期:               
  11. ** 当前版本:                               
  12. ** 修改记录:                               
  13. **********************************************************************************************************/
  14. #include <15W4KxxS4.h>
  15. #include <stdint.h>
  16. #include "config.h"
  17. #include "lcd.h"
  18. #include "hal_delay.h"                       

  19. /***************************************************************************
  20. * 描  述 : 主函数
  21. * 参  数 : 无
  22. * 返回值 : 无
  23. **************************************************************************/
  24. int main()
  25. {

  26. /////////////////////////////////////////////////
  27. //注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为
  28. //      高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用
  29. //相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
  30. //        P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
  31. /////////////////////////////////////////////////
  32.         P0M1 = 0;        P0M0 = 0;        //设置P0.0~P0.7为准双向口
  33.         P1M1 = 0;        P1M0 = 0;        //设置P1.0~P1.7为准双向口
  34.         P3M1 = 0;        P3M0 = 0;        //设置P3.0~P3.7为准双向口
  35.         P4M1 = 0;        P4M0 = 0;        //设置P4.0~P4.7为准双向口
  36.         P5M1 = 0;        P5M0 = 0;        //设置P5.0~P5.7为准双向口
  37.         P2M1 = 0; P2M0 = 0;
  38.                
  39.        
  40.         LCD_Init();        //LCD初始化
  41.         delay_ms(10);
  42.         Fill_GDRAM(0x00);  //清屏
  43.         delay_ms(10);

  44.   LCD_ShowString(1,2,8,"LCD12864");
  45.         LCD_ShowString(2,2,8,"液晶模块");

  46.        
  47.         while(1);
  48. }
  49. /*********************************END FILE********************************************/       
复制代码
  1. /****************************************Copyright (c)         
  2. **
  3. **--------------文件信息---------------------------------------------------------------------------------
  4. ** 文件名  :                lcd.c                                                         
  5. **--------------------------------------------------------------------------------------------------------
  6. ** 作    者:                三棱镜
  7. ** 创建日期:                2016-9-10
  8. ** 初始版本:                V1.0
  9. ** 描    述:                LCD12864驱动程序
  10. **--------------修改信息-----------------------------------------------------------------------------------
  11. ** 修改人  :                       
  12. ** 修改日期:               
  13. ** 当前版本:                               
  14. ** 修改记录:                               
  15. **********************************************************************************************************/
  16. #include <15W4KxxS4.h>
  17. #include <math.h>
  18. #include "config.h"
  19. #include "lcd.h"
  20. #include "hal_delay.h"


  21. /***************************************************************************
  22. * 描  述 : LCD12864液晶判忙程序。如LCD为“忙”状态,一直等待直到LCD空闲
  23. * 参  数 : 无
  24. * 返回值 : 无
  25. **************************************************************************/
  26. void Busy(void)   
  27. {   
  28.         uchar busy;
  29.        
  30.         do  
  31.         {         
  32.                 RW = 1; RS = 0;   //读                                          
  33.                 E = 1;            //使能液晶模块.0=关闭使能端,1=打开使能端
  34.                 P0M0=0x00;
  35.                 P0M1=0x00;              //设置P2.0~P2.7为准双向口
  36.                 busy=P0;          //读取P2状态      
  37.                 delay_5us(10);        
  38.                 E = 0;            //关闭液晶模块使能端.0=关闭使能端,1=打开使能端     
  39.         }while(busy&0x80);  //判断BUSY位是否工作:1=内部在工作,0=空闲
  40. }  
  41. /***************************************************************************
  42. * 描  述 : LCD12864液晶模块从当前地址读RAM数据
  43. * 参  数 : 无
  44. * 返回值 : Dat:读取的数据
  45. **************************************************************************/
  46. uchar ReadDat(void)
  47. {
  48.   uchar Dat;
  49.   
  50.         P0 = 0xff;
  51.         Busy();         //判忙
  52.        
  53.         RW = 1;RS = 1;  //读
  54.         E = 1;          //使能液晶模块.0=关闭使能端,1=打开使能端
  55.   Dat=P0;         //保存读取的数据
  56.         delay_5us(1);
  57.   E = 0;          //关闭液晶模块使能端.0=关闭使能端,1=打开使能端      
  58.   delay_5us(1);
  59.   return Dat;
  60. }
  61. /***************************************************************************
  62. * 描  述 : LCD12864液晶命令写入程序
  63. * 参  数 : cmd[in]:写入的命令
  64. * 返回值 : 无
  65. **************************************************************************/
  66. void Write_Cmd(uchar cmd)
  67. {      
  68.         Busy();       //判忙
  69.           
  70.         RW=0; RS=0;   //写指令                     
  71.         P0M1 = 0;          
  72.         P0M0 = 0xff;        //设置P2.0~P2.7为推挽输出
  73.         P0=cmd;       //写入命令
  74.        
  75.         E=1;          //使能液晶模块.0=关闭使能端,1=打开使能端
  76.         delay_5us(1);  
  77.         E=0;          //关闭液晶模块使能端.0=关闭使能端,1=打开使能端  
  78.   delay_5us(1);        
  79. }
  80. /***************************************************************************
  81. * 描  述 : LCD12864液晶数据写入程序
  82. * 参  数 : dat[in]:写入的数据
  83. * 返回值 : 无
  84. **************************************************************************/
  85. void Write_Data(uchar dat)
  86. {   
  87.         Busy();       //判忙                   
  88.         RW=0;RS=1;    //写数据   
  89.                 
  90.         P0M1 = 0;       
  91.         P0M0 = 0xff;        //设置P2.0~P2.7为推挽输出       
  92.         P0=dat;       //写入数据
  93.   
  94.         E =1;         //使能液晶模块
  95.         delay_5us(3);     
  96.         E =0;         //关闭液晶模块使能端
  97. }  

  98. /**************************************************************************
  99. * 描  述 : 指定位置显示单个字符
  100. * 参  数 : row[in]:行,范围1~4
  101. *        :column[in]:列,范围0~7  
  102. *        :chr[in]:字符编码
  103. * 返回值 : 无
  104. **************************************************************************/
  105. void LCD_ShowChar(uchar row,uchar column,uchar chr)
  106. {             
  107.         uchar Address;
  108.        
  109.         //row判断第几行,column判断第几列,0x80为液晶行初始地址   
  110.         if(row == 1)Address=0x80+column;   
  111.         if(row == 2){Address=0x90+column;}        
  112.         if(row == 3){Address=0x88+column;}   
  113.         if(row == 4){Address=0x98+column;}  
  114.         Write_Cmd(Address);  //写入地址命令到LCD12864     
  115.         Write_Data(chr);     //写入显示数据到LCD12864   
  116. }

  117. /***************************************************************************
  118. * 描  述 : 字符串显示
  119. * 参  数 : row[in]:行,范围1~4
  120. *        :column[in]:列,范围0~7  
  121. *        :num[in]:字符个数,注意一个汉字=2个字符
  122. *        :s[in]:指向待显示的字符串
  123. * 返回值 : 无
  124. **************************************************************************/
  125. void LCD_ShowString(uchar row,uchar column,uchar num,uchar *s)   
  126. {     
  127.         uchar Address;   
  128.        
  129.         //row判断第几行,column判断第几列,0x80为液晶行初始地址   
  130.         if(row == 1)Address=0x80+column;   
  131.         if(row == 2){Address=0x90+column;}        
  132.         if(row == 3){Address=0x88+column;}   
  133.         if(row == 4){Address=0x98+column;}   
  134.         Write_Cmd(Address);    //写入显示起始地址
  135.         while(num)             //写入显示数据的大小  
  136.         {   
  137.                 Write_Data(*(s++));  //写入显示数据到LCD12864   
  138.                 num--;         
  139.         }   
  140. }

  141. /***************************************************************************
  142. * 描  述 : 填充,当如数数据为0的时候即可实现清屏
  143. * 参  数 : dat[in]:填充的数据
  144. * 返回值 : 无
  145. **************************************************************************/
  146. void Fill_GDRAM(uchar dat)
  147. {
  148.   uchar i,j,k;

  149.   uchar GDRAM_X=0x80;
  150.   uchar GDRAM_Y=0x80;

  151.   for(i=0;i<2;i++)
  152.   {
  153.     for(j=0;j<32;j++)
  154.     {
  155.       for(k=0;k<8;k++)
  156.       {
  157.         Write_Cmd(0x34);
  158.         Write_Cmd(GDRAM_Y+j);
  159.         Write_Cmd(GDRAM_X+k);
  160.         Write_Data(dat);
  161.         Write_Data(dat);
  162.       }
  163.     }
  164.     GDRAM_X=0x88;
  165.   }

  166.   Write_Cmd(DRAM_ON);//开启绘图模式
  167.   Write_Cmd(0x30);   //恢复基本指令集,关闭绘图模式
  168. }

  169. /***************************************************************************
  170. * 描  述 : LCD12864液晶初始化程序
  171. * 参  数 : 无
  172. * 返回值 : 无
  173. **************************************************************************/
  174. void LCD_Init(void)     
  175. {     
  176.    E = 0;         

  177.          delay_ms(1);                  
  178.          Write_Cmd(0x30);   // 基本指令集     
  179.          delay_ms(1);      
  180.          Write_Cmd(0x02);   // 地址归位     
  181.          delay_ms(1);      
  182.          Write_Cmd(0x0c);   // 整体显示打开,游标关闭     
  183.          delay_ms(1);      
  184.          Write_Cmd(0x06);   // 游标右移     
  185.          delay_ms(1);      
  186.          Write_Cmd(0x80);   // 设定显示的起始地址     
  187.          delay_ms(1);      
  188.          Write_Cmd(0x01);   // 清除显示
  189.          delay_ms(10);      // 这个延时必须要有,否则可能会出现花屏
  190. }

  191. /*********************************END FILE********************************************/
复制代码

所有资料51hei提供下载:

实验52 - LCD12864显示字符汉字.rar (90.61 KB, 下载次数: 132)
回复

使用道具 举报

ID:370415 发表于 2018-7-12 18:28 | 显示全部楼层
感觉好高科技,能不能教我两招?
回复

使用道具 举报

ID:60656 发表于 2018-7-16 09:49 | 显示全部楼层
无法下载,扣了10币
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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