我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 357|回复: 10

51单片机加LCD1602显示名字

[复制链接]

该用户从未签到

8

主题

9

回帖

13

积分

一级逆天

积分
13

终身成就奖

发表于 2023-12-20 16:10:21 | 显示全部楼层 |阅读模式
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
#define LCD_DataPort P0
uchar i=0;
uint cnt=0;
void LCD_Delay()        //@12.000MHz  1ms 如果是更快的单片机,这里延时要长一点
{
    unsigned char i, j;
    i = 2;
    j = 239;
    do
    {
        while (--j);
    } while (--i);
}
void LCD_WriteCommand(unsigned char Command);
void LCD_Init(void);
void LCD_SetCursor(unsigned char Line,unsigned char Column);
void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char);
void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char String[]);
int LCD_Pow(int X,int Y);
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void main()
{
    TMOD = 0x01;
    TH0 = (65536-10000)/256;
    TL0 = (65536-10000)%256;
    TR0 = 1;
    ET0=1;
    EA=1;
    LCD_Init();
    LCD_ShowChar(1,1,"d");
//    LCD_ShowNum(1,4,2042810138,10);
    while(1)
    {
        
    }
}

void LED_Screen_Display() interrupt 1
{
     TH0 = (65536-10000)/256;
    TL0 = (65536-10000)%256;
    cnt++;
    if(cnt>=100)
    {
        cnt=0;
    }

}

/**
  * @brief  LCD1602写命令
  * @param  Command 要写入的命令
  * @retval 无
  */
void LCD_WriteCommand(unsigned char Command)
{
    LCD_RS=0;//写指令
    LCD_RW=0;
    LCD_DataPort=Command;
    LCD_E=1;//这里置高又置低,高电平速度太快,反应不过来,因此进行延时
    LCD_Delay();
    LCD_E=0;
    LCD_Delay();
}

/**
  * @brief  LCD1602写数据
  * @param  Data 要写入的数据
  * @retval 无
  */
void LCD_WriteData(unsigned char Data)
{
    LCD_RS=1;//写数据
    LCD_RW=0;
    LCD_DataPort=Data;
    LCD_E=1;//这里置高又置低,高电平速度太快,反应不过来,因此进行延时
    LCD_Delay();
    LCD_E=0;
    LCD_Delay();
   
}

/**
  * @brief  LCD1602初始化函数
  * @param  无
  * @retval 无
  */
void LCD_Init(void)
{
    LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵
    LCD_WriteCommand(0x0C);//显示开,光标关,闪烁关
    LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动
    LCD_WriteCommand(0x01);//清屏

}

/**
  * @brief  LCD1602设置光标位置
  * @param  Line 行位置,范围:1~2
  * @param  Column 列位置,范围:1~16
  * @retval 无
  */
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{
    if(Line==1)
    {
        LCD_WriteCommand(0x80|(Column-1));//0x80是确定光标位置的指令,A0-A6是确定地址
    }
    else
    {
        LCD_WriteCommand(0x80|(Column-1)+0x40);//换行所以要加一个基地址0x40
    }   
}

/**
  * @brief  在LCD1602指定位置上显示一个字符
  * @param  Line 行位置,范围:1~2
  * @param  Column 列位置,范围:1~16
  * @param  Char 要显示的字符
  * @retval 无
  */
void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)
{
  LCD_SetCursor(Line,Column);
    LCD_WriteData(Char);       //char x='A';(等效于char x=0x41;)
}

/**
  * @brief  在LCD1602指定位置开始显示所给字符串
  * @param  Line 起始行位置,范围:1~2
  * @param  Column 起始列位置,范围:1~16
  * @param  String 要显示的字符串
  * @retval 无
  */
void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char String[])
{
    //这里用到指针的作用,String[]指针指向该字符组的第一个地址,依次显示出来,直到'\0'的出现
    unsigned char i;
  LCD_SetCursor(Line,Column);
    for(i=0;String!='\0';i++)
    {
        LCD_WriteData(String);
    }
}

/**
  * @brief  返回值=X的Y次方
  */
int LCD_Pow(int X,int Y)//x的y次方
{
    unsigned char i;
    int Result=1;
    for(i=0;i<Y;i++)
    {
        Result*=X;
    }
    return Result;
}
/**
  * @brief  在LCD1602指定位置开始显示所给数字
  * @param  Line 起始行位置,范围:1~2
  * @param  Column 起始列位置,范围:1~16
  * @param  Number 要显示的数字,范围:0~65535
  * @param  Length 要显示数字的长度,范围:1~5
  * @retval 无
  */
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
    unsigned char i;
  LCD_SetCursor(Line,Column);
    //根据长度确定所要显示的位数,通过计算将Number中从高位到低位依次显示出来,对照ASCII码表0的基地址
    //为0x30,显示几就在这个地址上加几就可以
    for(i=Length;i>0;i--)
    {
        LCD_WriteData(0x30+Number/LCD_Pow(10,i-1)%10);//将数字转化为ASCII码表
    }
}
回复

使用道具 举报

该用户从未签到

1

主题

133

回帖

171

积分

二级逆天

积分
171

终身成就奖原创先锋奖

发表于 2023-12-20 23:03:00 | 显示全部楼层
真好,真可以啊这个。
回复

使用道具 举报

  • TA的每日心情
    开心
    前天 13:10
  • 签到天数: 101 天

    [LV.6]常住居民II

    49

    主题

    1万

    回帖

    7万

    积分

    三级逆天

    积分
    73174

    终身成就奖特殊贡献奖原创先锋奖社区居民忠实会员社区劳模最爱沙发社区明星原创达人优秀斑竹奖宣传大使奖

    QQ
    发表于 2023-12-21 06:17:12 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    9

    主题

    1126

    回帖

    0

    积分

    二级逆天

    积分
    0

    终身成就奖特殊贡献奖原创先锋奖

    发表于 2023-12-21 08:19:58 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    前天 14:19
  • 签到天数: 97 天

    [LV.6]常住居民II

    76

    主题

    3715

    回帖

    6870

    积分

    二级逆天

    积分
    6870

    社区居民忠实会员社区劳模终身成就奖社区明星宣传大使奖优秀斑竹奖特殊贡献奖原创先锋奖

    QQ
    发表于 2023-12-21 08:26:02 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    2

    主题

    150

    回帖

    0

    积分

    二级逆天

    积分
    0

    终身成就奖

    发表于 2023-12-21 08:51:26 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    3100

    回帖

    0

    积分

    二级逆天

    积分
    0

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    发表于 2023-12-21 08:56:12 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 76 天

    [LV.6]常住居民II

    54

    主题

    2865

    回帖

    4334

    积分

    二级逆天

    积分
    4334

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    QQ
    发表于 2023-12-21 08:56:40 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情

    3 天前
  • 签到天数: 22 天

    [LV.4]偶尔看看III

    0

    主题

    465

    回帖

    456

    积分

    二级逆天

    积分
    456

    终身成就奖特殊贡献奖

    发表于 2023-12-21 08:56:46 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 76 天

    [LV.6]常住居民II

    54

    主题

    2865

    回帖

    4334

    积分

    二级逆天

    积分
    4334

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    QQ
    发表于 2023-12-21 08:56:53 | 显示全部楼层
    回复

    使用道具 举报

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

    本版积分规则

    论坛开启做任务可以
    额外奖励金币快速赚
    积分升级了


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    平平安安
    TOP
    快速回复 返回顶部 返回列表