单片机
返回首页

LCD1602+单片机+普中+江科大自化协

2024-08-08 来源:cnblogs

1 实现现象

LCD1602工作原理

LCD1602显示某字符或字符串只需在C51程序中写入要显示的字符常量或字符串常量,C51程序在编译后会自动生成其标准的ASCII码,然后将该ASCII码送入显示RAM,内部控制电路会自动将该ASCII码对应的字符点阵在LCD1602上显示出来。

 

2 程序设计

2.1 LCD1602控制程序及头文件


#include

#include 'intrins.h'


//引脚配置,硬件原理图,普中A2

sbit LCD1602_RS = P2^6;

sbit LCD1602_RW = P2^5;

sbit LCD1602_E  = P2^7;

#define LCD1602_DATAPORT P0



/**

  * @brief  LCD1602延时函数

  * @param  xms=1, 延时1ms

  * @retval 无

  */

void LCD1602_Delayms(unsigned char xms)        //@11.0592MHz

{

    unsigned char i, j,k;


    for(k=0;k    {

        _nop_();

        i = 2;

        j = 199;

        do

        {

            while (--j);

        } while (--i);

    }


}


/**

  * @brief  LCD1602写命令,时序图

  * @param  Command 要写入的命令

  * @retval 无

  */

void LCD1602_WriteCommand(unsigned char Command)

{

    LCD1602_RS = 0;

    LCD1602_RW = 0;

    LCD1602_DATAPORT  = Command;

    LCD1602_E  = 1;

    LCD1602_Delayms(1);    //延时1ms

    LCD1602_E  = 0;

    LCD1602_Delayms(1);    //延时1ms

}


/**

  * @brief  LCD1602写数据,时序图

  * @param  Data 要写入的数据

  * @retval 无

  */

void LCD1602_WriteData(unsigned char Data)

{

    LCD1602_RS = 1;

    LCD1602_RW = 0;

    LCD1602_DATAPORT  = Data;

    LCD1602_E  = 1;

    LCD1602_Delayms(1);    //延时1ms

    LCD1602_E  = 0;

    LCD1602_Delayms(1);    //延时1ms

}


/**

  * @brief  LCD1602初始化函数

  * @param  无

  * @retval 无

  */

void LCD1602_Init(void)

{

    LCD1602_WriteCommand(0x38);    //0011_1000 功能设置,设置16x2显示,5x7点阵,8位数据接口

    LCD1602_WriteCommand(0x0C);    //0000_1100 显示开关控制,显示开,光标关,闪烁关    

    LCD1602_WriteCommand(0x06);    //0000_0110 输入方式设置,数据写后,AC自动加一,画面不动

    LCD1602_WriteCommand(0x01);    //0000_0001 清屏,数据指针清零、所有显示清零

}

/**

  * @brief  LCD1602设置光标位置

  * @param  Line 行位置,范围:1~2

  * @param  Column 列位置,范围:1~16

  * @retval 无

  */

void LCD1602_SetCursor(unsigned char Line,unsigned char Column)

{

    if(Line == 1)

    {

        LCD1602_WriteCommand(0x80|(Column-1)); //设置要存入数据的DDROM地址,第一行地址

    }

    else

    {

        LCD1602_WriteCommand(0x80|(Column-1)+0x40); //设置要存入数据的DDROM地,第二行地址

    }

}

    


/**

  * @brief  在LCD1602指定位置上显示一个字符

  * @param  Line 行位置,范围:1~2

  * @param  Column 列位置,范围:1~16

  * @param  Char 要显示的字符

  * @retval 无

  */

void LCD1602_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)

{

    LCD1602_SetCursor(Line,Column);

    LCD1602_WriteData(Char);

}


/**

  * @brief  在LCD1602指定位置上显示所给字符串

  * @param  Line 行位置,范围:1~2

  * @param  Column 列位置,范围:1~16

  * @param  Char 要显示的字符串

  * @retval 无

  */

void LCD1602_ShowString(unsigned char Line,unsigned char Column,unsigned char *String)        //指针

{

    unsigned char i;

    LCD1602_SetCursor(Line,Column);

    for(i=0;String[i]!='';i++)    //字符串结束标志''

    {

        LCD1602_WriteData(String[i]);

    }

    

}


/**

  * @brief  返回值=X的Y次方,指数运算

  */

int LCD_Power(int X,int Y)

{

    unsigned char i;

    int result = 1;

    for(i=0;i    {

        result = result * X;

    }

    return result;

}


/**

  * @brief  在LCD1602指定位置开始显示所给数字

  * @param  Line 起始行位置,范围:1~2

  * @param  Column 起始列位置,范围:1~16

  * @param  Number 要显示的数字,范围:0~65535

  * @param  Length 要显示数字的长度,范围:1~5

  * @retval 无

  */

void LCD1602_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)

{

    unsigned char i;

    LCD1602_SetCursor(Line,Column);

    for(i=Length;i>0;i--)

    {

        LCD1602_WriteData('0'+Number/LCD_Power(10,i-1)%10); // '0'=0x30,转换为字符显示;

        

        /** 

          * 789, 789/100%10, 取出百位

          * 789, 789/10%10, 取出十位

          * 789, 789/1%10, 取出个位

         */

    }

}


/**

  * @brief  在LCD1602指定位置开始以有符号十进制显示所给数字

  * @param  Line 起始行位置,范围:1~2

  * @param  Column 起始列位置,范围:1~16

  * @param  Number 要显示的数字,范围:-32768~32767

  * @param  Length 要显示数字的长度,范围:1~5

  * @retval 无

  */

void LCD1602_ShowSignedNum(unsigned char Line,unsigned char Column, int Number,unsigned char Length)

{

    unsigned char i;

    unsigned int Number1; 

    LCD1602_SetCursor(Line,Column);

    if(Number >= 0)

    {

        LCD1602_WriteData('+');

        Number1 = Number;

    }

    else

    {

        LCD1602_WriteData('-');

        Number1 = -Number;     //-32768

    }

    for(i=Length;i>0;i--)

    {

        LCD1602_WriteData('0'+Number1/LCD_Power(10,i-1)%10); 

    }

}


/**

  * @brief  在LCD1602指定位置开始以十六进制显示所给数字

  * @param  Line 起始行位置,范围:1~2

  * @param  Column 起始列位置,范围:1~16

  * @param  Number 要显示的数字,范围:0~0xffff

  * @param  Length 要显示数字的长度,范围:1~4

  * @retval 无

  */

void LCD1602_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)

{

    unsigned char i;

    unsigned char SingleNumber;

    LCD1602_SetCursor(Line,Column);

    for(i=Length;i>0;i--)

    {

        SingleNumber = Number/LCD_Power(16,i-1)%16; //从高位到低位,取出每一个十六进制数字

        if(SingleNumber < 10)

            LCD1602_WriteData('0'+SingleNumber); 

        else

            LCD1602_WriteData('A'+SingleNumber-10); //SingleNumber已含有10+x

    }

}


/**

  * @brief  在LCD1602指定位置开始以二进制显示所给数字

  * @param  Line 起始行位置,范围:1~2

  * @param  Column 起始列位置,范围:1~16

  * @param  Number 要显示的数字,范围:0~1111_1111_1111_1111

  * @param  Length 要显示数字的长度,范围:1~16

  * @retval 无

  */

void LCD1602_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)

{

    unsigned char i;

    LCD1602_SetCursor(Line,Column);

    for(i=Length;i>0;i--)

    {

        LCD1602_WriteData('0'+Number/LCD_Power(2,i-1)%2); //从高位到低位,取出每一个二进制数字

    }

}


#ifndef __LCD1602_H__

#define __LCD1602_H__

    

    void LCD1602_WriteCommand(unsigned char Command);

    void LCD1602_WriteData(unsigned char Data);


    void LCD1602_Init(void);

    void LCD1602_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char);

    void LCD1602_ShowString(unsigned char Line,unsigned char Column,unsigned char *String);

    void LCD1602_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);

    void LCD1602_ShowSignedNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);

    void LCD1602_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);

    void LCD1602_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);

    

#endif


2.2  延时函数及头文件(略)


2.3 主程序


#include

#include 'LCD1602.H'

#include 'DELAYMS.H'


void main()

{

    LCD1602_Init( );                    //初始化

    LCD1602_ShowChar(1,1,'A');            //字符

    LCD1602_ShowString(1,3,'Hello');    //字符串

    LCD1602_ShowNum(1,9,66,2);            //无符号数值

    LCD1602_ShowSignedNum(1,12,-88,2);    //有符号数值

    LCD1602_ShowHexNum(2,1,0xA5,2);        //十六进制数值

    LCD1602_ShowBinNum(2,4,0xA5,8);        //二进制数值

    

    LCD1602_ShowChar(2,13,0xDF);        //特殊符号,摄氏度

    LCD1602_ShowChar(2,14,'C');            //特殊符号,摄氏度

    

//    LCD1602_ShowString(1,16,'Welcome to China!');    //字符串

    

    while(1)

    {

//        LCD1602_WriteCommand(0x18);    //画面向左平移一个字符位,但光标不动,移屏

//        Delayms(500);

    }

}


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • CCD图像传感器在微光电视系统中的应用

  • 光控音效发生器电路

  • 一个简单的警笛电路图

  • 一个简单的立体声平衡指示器电路

  • 使用NE555和磁簧开关的橱柜照明电路

  • 电谐波图形均衡器示意图

    相关电子头条文章