找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2214|回复: 4
收起左侧

基于stc15w4单片机的lcd12864显示程序

[复制链接]
ID:983394 发表于 2021-12-8 11:23 | 显示全部楼层 |阅读模式
这是基于iap15w4k61s4 主控 lcd1286的显示

字符串显示

字符串显示

显示汉字

显示汉字

主函数
  1. #include <STC15F2K60S2.H>
  2. #include <stdint.h>
  3. #include <lcd.h>
  4. #include <hal_delay.h>
  5. #include "key.h"



  6. int main()
  7. {
  8.                 LCD_Init();
  9.                 key_Init();
  10.                 delay_ms(100);
  11.                 LCD_ShowString(3,3,4,"CSDN");
  12.                 BUZZER_TEST();
  13.                 while(1)
  14.                 {
  15.                         
  16.                         KEY_Check();
  17.                 }
  18.         
  19. }
复制代码
lcd.c

  1. #include <STC15F2K60S2.H>
  2. #include <math.h>
  3. #include "lcd.h"
  4. #include "hal_delay.h"


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

  82. /**************************************************************************
  83. * 描  述 : 指定位置显示单个字符
  84. * 参  数 : row[in]:行,范围1~4
  85. *        :column[in]:列,范围0~7  
  86. *        :chr[in]:字符编码
  87. * 返回值 : 无
  88. **************************************************************************/
  89. void LCD_ShowChar(uchar row,uchar column,uchar chr)
  90. {              
  91.         uchar Address;
  92.         
  93.         //row判断第几行,column判断第几列,0x80为液晶行初始地址   
  94.         if(row == 1)Address=0x80+column;   
  95.         if(row == 2){Address=0x90+column;}        
  96.         if(row == 3){Address=0x88+column;}   
  97.         if(row == 4){Address=0x98+column;}  
  98.         Write_Cmd(Address);  //写入地址命令到LCD12864     
  99.         Write_Data(chr);     //写入显示数据到LCD12864   
  100. }

  101. /***************************************************************************
  102. * 描  述 : 字符串显示
  103. * 参  数 : row[in]:行,范围1~4
  104. *        :column[in]:列,范围0~7  
  105. *        :num[in]:字符个数,注意一个汉字=2个字符
  106. *        :s[in]:指向待显示的字符串
  107. * 返回值 : 无
  108. **************************************************************************/
  109. void LCD_ShowString(uchar row,uchar column,uchar num,uchar *s)   
  110. {     
  111.         uchar Address;   
  112.         
  113.         //row判断第几行,column判断第几列,0x80为液晶行初始地址   
  114.         if(row == 1)Address=0x80+column;   
  115.         if(row == 2){Address=0x90+column;}        
  116.         if(row == 3){Address=0x88+column;}   
  117.         if(row == 4){Address=0x98+column;}   
  118.         Write_Cmd(Address);    //写入显示起始地址
  119.         while(num)             //写入显示数据的大小  
  120.         {   
  121.                 Write_Data(*(s++));  //写入显示数据到LCD12864   
  122.                 num--;         
  123.         }   
  124. }

  125. /***************************************************************************
  126. * 描  述 : 填充,当如数数据为0的时候即可实现清屏
  127. * 参  数 : dat[in]:填充的数据
  128. * 返回值 : 无
  129. **************************************************************************/
  130. void Fill_GDRAM(uchar dat)
  131. {
  132.   uchar i,j,k;

  133.   uchar GDRAM_X=0x80;
  134.   uchar GDRAM_Y=0x80;

  135.   for(i=0;i<2;i++)
  136.   {
  137.     for(j=0;j<32;j++)
  138.     {
  139.       for(k=0;k<8;k++)
  140.       {
  141.         Write_Cmd(0x34);
  142.         Write_Cmd(GDRAM_Y+j);
  143.         Write_Cmd(GDRAM_X+k);
  144.         Write_Data(dat);
  145.         Write_Data(dat);
  146.       }
  147.     }
  148.     GDRAM_X=0x88;
  149.   }

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

  153. /***************************************************************************
  154. * 描  述 : LCD12864液晶初始化程序
  155. * 参  数 : 无
  156. * 返回值 : 无
  157. **************************************************************************/
  158. void LCD_Init(void)     
  159. {  
  160.                 P7M1 = 0; P7M0 = 0;
  161.                 P4M1 = 0;        P4M0 = 0;        
  162.    E = 0;         
  163.          delay_ms(1);                  
  164.          Write_Cmd(0x30);   // 基本指令集     
  165.          delay_ms(1);      
  166.          Write_Cmd(0x02);   // 地址归位     
  167.          delay_ms(1);      
  168.          Write_Cmd(0x0c);   // 整体显示打开,游标关闭     
  169.          delay_ms(1);      
  170.          Write_Cmd(0x06);   // 游标右移     
  171.          delay_ms(1);      
  172.          Write_Cmd(0x80);   // 设定显示的起始地址     
  173.          delay_ms(1);      
  174.          Write_Cmd(0x01);   // 清除显示
  175.          delay_ms(10);      // 这个延时必须要有,否则可能会出现花屏
  176. }

  177. /*********************************END FILE********************************************/        


复制代码
51hei.png
Keil代码下载: 12864_SHOW.zip (63.44 KB, 下载次数: 35)

评分

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

查看全部评分

回复

使用道具 举报

ID:57657 发表于 2021-12-8 21:56 | 显示全部楼层
你这是什么板子? 上面应该开4个固定屏幕的螺丝孔。
回复

使用道具 举报

ID:16255 发表于 2021-12-8 18:46 | 显示全部楼层
强迫症表示,“I”为什么要用大写?
回复

使用道具 举报

ID:230742 发表于 2021-12-8 18:28 | 显示全部楼层
上个电路图啊,最好在带一个咯嘣文件,不就50分了。
哈哈。
感谢分享。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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