登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] stc12c5a60s2单片机的LCD1602液晶屏的学习

[复制链接]
发表于 2019-1-31 22:01:23 | 显示全部楼层 |阅读模式
学习笔记
学习科目: stc12c5a60s2单片机的LCD1602液晶屏的学习
学习安排: 上午学习理论知识,及听单片机网课,
下午进行在开发板上实验,写程序并不断调试
最后进行今天的总结
开始时间: 2019-01-31
结束时间: 2019-01-31
QQ图片20190122195331.png 20190131213040.png 20190131213139.png 20190131213159.png 20190131214344.png 20190131213239.png 老习惯,先看开发板的原理图,再看一下LCD1602的数据手册。这里要用到RS,RW,E三个引脚,分别对应单片机上的P20,P21,P12,引脚定义好后,下面主要就是1602液晶的指令了

与单片机寄存器的用法类似,1602液晶在使用时,首先要进行初始的功能配置。以下要清楚:
1.显示模式设置,写指令0x38,就是设置16*2显示,5*7点阵,8位数据接口。
2.显示开/关以及光标设置指令。这里有2条指令,对应最后一张图。我这里用了0x0c和0x06,请游客自行设置。
3.清屏指令.建议选用0x01
4.RAM地址设置指令。该指令的最高位为1,低七位为RAM的地址,RAM的地址与液晶上字符的关系就是倒数第二张图片所示。
以下是我写的一个例子,在显示屏上显示 Welcome to HPU     HPU   EDD
#include <STC12C5A60S2.H>

sbit                RS = P2^0;                                         
sbit           RW = P2^1;                                         
sbit            E = P1^2;                                         
#define                Data P0        //宏定义                                 

void LCD_init();//液晶屏初始化函数
void LCD_Display(unsigned char x,unsigned char y, unsigned char *p);//液晶屏显示函数

void main()//主函数
{
        unsigned char str[]="Welcome to HPU";//数组
        LCD_init();
        LCD_Display(1,0,str);
        LCD_Display(4,1,"HPU EDD");
    while(1);
}

void delay_us(unsigned int n)//微秒级延时函数
{
    extern void _nop_(void);
    register unsigned char i = n, j = (n>>8);
    _nop_(); _nop_(); _nop_();
    if ((--i) | j)
    {
        do
        {
            _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
            if (0xFF == (i--)) j--; else {_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();};
        } while (i | j);
    }
}

void delay_ms(unsigned int n)//毫秒级延时函数
{
while (n--) delay_us(1000);
}

void LCD_Write_Cmd(unsigned char cmd)Lcd1602液晶写入指令函数,cmd为待写入指令
{
    RS = 0;
    RW = 0;
    Data = cmd;
    delay_us(1);
    E = 1;
    delay_us(1);
    E = 0;
    delay_ms(2);
}

void LCD_Write_Data(unsigned char dat)//Lcd1602液晶写入数据函数,dat为待写入数据值
{
    RS = 1;
    RW = 0;
    Data = dat;
    delay_us(1);
    E = 1;
    delay_us(1);
    E = 0;
    delay_ms(2);
}
void LcdSetCursor(x,y)//设置显示RAM起始地址,就是光标的位置,(x,y)为屏幕上的字符坐标
{
        unsigned char addr;

        if(y==0)//由输入的屏幕坐标计算显示RAM的地址
                addr = 0x00+x;//第一行字符地址从0x00起始
  else
                addr = 0x40+x;//第二行字符地址从0x40起始
        LCD_Write_Cmd(addr|0x80);//设置RAM地址
}
void LCD_Display(unsigned char x,unsigned char y, unsigned char *p)//在液晶屏上显示字符串,(x,y)为对应屏幕上的起始坐标,str为字符串指针
{
     LcdSetCursor(x,y);//设置起始地址
     while (*p)//连续写入字符串数据,知道检测到结束符
     {
         LCD_Write_Data(*p++);//先取str指向的数据,然后str自加1
     }
}
void LCD_init()//初始化1602液晶屏
{
    delay_ms(40);
    LCD_Write_Cmd(0x38);
    delay_ms(5);
    LCD_Write_Cmd(0x38);
    delay_ms(1);
    LCD_Write_Cmd(0x38);
    LCD_Write_Cmd(0x38);
    LCD_Write_Cmd(0x01);
    LCD_Write_Cmd(0x06);
    LCD_Write_Cmd(0x0c);
}
注意编程的模块化思想,有利于程序的维护与修改,初次接触,难免有不足的地方
还请各位斧正。谢谢!

好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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