基于在stc15w上的显示
LCD12864实验步骤:
1、将12864按照正确方向插到开发板J4上面;
1、MINI USB连接线给开发板通电下载程序,下载软件中内部IRC时钟选择11.0592MHZ;
2、下载程序后,拨动RP1调节显示灰度,LCD12864显示正常(若不行,则LCD12864上的可调电位器也要调节)。
单片机源程序如下:
- /****************************************Copyright (c)息---------------------------------------------------------------------------------
- ** 文件名 : main.c
- **--------------------------------------------------------------------------------------------------------
- ** 作 者: 三棱镜
- ** 创建日期: 2016-4-25
- ** 初始版本: V1.0
- ** 描 述: LCD12864显示实验
- **--------------修改信息-----------------------------------------------------------------------------------
- ** 修改人 :
- ** 修改日期:
- ** 当前版本:
- ** 修改记录:
- **********************************************************************************************************/
- #include <15W4KxxS4.h>
- #include <stdint.h>
- #include "config.h"
- #include "lcd.h"
- #include "hal_delay.h"
-
- /***************************************************************************
- * 描 述 : 主函数
- * 参 数 : 无
- * 返回值 : 无
- **************************************************************************/
- int main()
- {
- /////////////////////////////////////////////////
- //注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为
- // 高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用
- //相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
- // P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
- /////////////////////////////////////////////////
- P0M1 = 0; P0M0 = 0; //设置P0.0~P0.7为准双向口
- P1M1 = 0; P1M0 = 0; //设置P1.0~P1.7为准双向口
- P3M1 = 0; P3M0 = 0; //设置P3.0~P3.7为准双向口
- P4M1 = 0; P4M0 = 0; //设置P4.0~P4.7为准双向口
- P5M1 = 0; P5M0 = 0; //设置P5.0~P5.7为准双向口
- P2M1 = 0; P2M0 = 0;
-
-
- LCD_Init(); //LCD初始化
- delay_ms(10);
- Fill_GDRAM(0x00); //清屏
- delay_ms(10);
- LCD_ShowString(1,2,8,"LCD12864");
- LCD_ShowString(2,2,8,"液晶模块");
-
- while(1);
- }
- /*********************************END FILE********************************************/
复制代码- /****************************************Copyright (c)
- **
- **--------------文件信息---------------------------------------------------------------------------------
- ** 文件名 : lcd.c
- **--------------------------------------------------------------------------------------------------------
- ** 作 者: 三棱镜
- ** 创建日期: 2016-9-10
- ** 初始版本: V1.0
- ** 描 述: LCD12864驱动程序
- **--------------修改信息-----------------------------------------------------------------------------------
- ** 修改人 :
- ** 修改日期:
- ** 当前版本:
- ** 修改记录:
- **********************************************************************************************************/
- #include <15W4KxxS4.h>
- #include <math.h>
- #include "config.h"
- #include "lcd.h"
- #include "hal_delay.h"
- /***************************************************************************
- * 描 述 : LCD12864液晶判忙程序。如LCD为“忙”状态,一直等待直到LCD空闲
- * 参 数 : 无
- * 返回值 : 无
- **************************************************************************/
- void Busy(void)
- {
- uchar busy;
-
- do
- {
- RW = 1; RS = 0; //读
- E = 1; //使能液晶模块.0=关闭使能端,1=打开使能端
- P0M0=0x00;
- P0M1=0x00; //设置P2.0~P2.7为准双向口
- busy=P0; //读取P2状态
- delay_5us(10);
- E = 0; //关闭液晶模块使能端.0=关闭使能端,1=打开使能端
- }while(busy&0x80); //判断BUSY位是否工作:1=内部在工作,0=空闲
- }
- /***************************************************************************
- * 描 述 : LCD12864液晶模块从当前地址读RAM数据
- * 参 数 : 无
- * 返回值 : Dat:读取的数据
- **************************************************************************/
- uchar ReadDat(void)
- {
- uchar Dat;
-
- P0 = 0xff;
- Busy(); //判忙
-
- RW = 1;RS = 1; //读
- E = 1; //使能液晶模块.0=关闭使能端,1=打开使能端
- Dat=P0; //保存读取的数据
- delay_5us(1);
- E = 0; //关闭液晶模块使能端.0=关闭使能端,1=打开使能端
- delay_5us(1);
- return Dat;
- }
- /***************************************************************************
- * 描 述 : LCD12864液晶命令写入程序
- * 参 数 : cmd[in]:写入的命令
- * 返回值 : 无
- **************************************************************************/
- void Write_Cmd(uchar cmd)
- {
- Busy(); //判忙
-
- RW=0; RS=0; //写指令
- P0M1 = 0;
- P0M0 = 0xff; //设置P2.0~P2.7为推挽输出
- P0=cmd; //写入命令
-
- E=1; //使能液晶模块.0=关闭使能端,1=打开使能端
- delay_5us(1);
- E=0; //关闭液晶模块使能端.0=关闭使能端,1=打开使能端
- delay_5us(1);
- }
- /***************************************************************************
- * 描 述 : LCD12864液晶数据写入程序
- * 参 数 : dat[in]:写入的数据
- * 返回值 : 无
- **************************************************************************/
- void Write_Data(uchar dat)
- {
- Busy(); //判忙
- RW=0;RS=1; //写数据
-
- P0M1 = 0;
- P0M0 = 0xff; //设置P2.0~P2.7为推挽输出
- P0=dat; //写入数据
-
- E =1; //使能液晶模块
- delay_5us(3);
- E =0; //关闭液晶模块使能端
- }
- /**************************************************************************
- * 描 述 : 指定位置显示单个字符
- * 参 数 : row[in]:行,范围1~4
- * :column[in]:列,范围0~7
- * :chr[in]:字符编码
- * 返回值 : 无
- **************************************************************************/
- void LCD_ShowChar(uchar row,uchar column,uchar chr)
- {
- uchar Address;
-
- //row判断第几行,column判断第几列,0x80为液晶行初始地址
- if(row == 1)Address=0x80+column;
- if(row == 2){Address=0x90+column;}
- if(row == 3){Address=0x88+column;}
- if(row == 4){Address=0x98+column;}
- Write_Cmd(Address); //写入地址命令到LCD12864
- Write_Data(chr); //写入显示数据到LCD12864
- }
- /***************************************************************************
- * 描 述 : 字符串显示
- * 参 数 : row[in]:行,范围1~4
- * :column[in]:列,范围0~7
- * :num[in]:字符个数,注意一个汉字=2个字符
- * :s[in]:指向待显示的字符串
- * 返回值 : 无
- **************************************************************************/
- void LCD_ShowString(uchar row,uchar column,uchar num,uchar *s)
- {
- uchar Address;
-
- //row判断第几行,column判断第几列,0x80为液晶行初始地址
- if(row == 1)Address=0x80+column;
- if(row == 2){Address=0x90+column;}
- if(row == 3){Address=0x88+column;}
- if(row == 4){Address=0x98+column;}
- Write_Cmd(Address); //写入显示起始地址
- while(num) //写入显示数据的大小
- {
- Write_Data(*(s++)); //写入显示数据到LCD12864
- num--;
- }
- }
- /***************************************************************************
- * 描 述 : 填充,当如数数据为0的时候即可实现清屏
- * 参 数 : dat[in]:填充的数据
- * 返回值 : 无
- **************************************************************************/
- void Fill_GDRAM(uchar dat)
- {
- uchar i,j,k;
- uchar GDRAM_X=0x80;
- uchar GDRAM_Y=0x80;
- for(i=0;i<2;i++)
- {
- for(j=0;j<32;j++)
- {
- for(k=0;k<8;k++)
- {
- Write_Cmd(0x34);
- Write_Cmd(GDRAM_Y+j);
- Write_Cmd(GDRAM_X+k);
- Write_Data(dat);
- Write_Data(dat);
- }
- }
- GDRAM_X=0x88;
- }
- Write_Cmd(DRAM_ON);//开启绘图模式
- Write_Cmd(0x30); //恢复基本指令集,关闭绘图模式
- }
- /***************************************************************************
- * 描 述 : LCD12864液晶初始化程序
- * 参 数 : 无
- * 返回值 : 无
- **************************************************************************/
- void LCD_Init(void)
- {
- E = 0;
- delay_ms(1);
- Write_Cmd(0x30); // 基本指令集
- delay_ms(1);
- Write_Cmd(0x02); // 地址归位
- delay_ms(1);
- Write_Cmd(0x0c); // 整体显示打开,游标关闭
- delay_ms(1);
- Write_Cmd(0x06); // 游标右移
- delay_ms(1);
- Write_Cmd(0x80); // 设定显示的起始地址
- delay_ms(1);
- Write_Cmd(0x01); // 清除显示
- delay_ms(10); // 这个延时必须要有,否则可能会出现花屏
- }
- /*********************************END FILE********************************************/
复制代码
所有资料51hei提供下载:
实验52 - LCD12864显示字符汉字.rar
(90.61 KB, 下载次数: 132)
|