奇迹飞翔 发表于 2023-12-20 16:10

51单片机加LCD1602显示名字

#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.000MHz1ms 如果是更快的单片机,这里延时要长一点
{
    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;
    }

}

/**
* @briefLCD1602写命令
* @paramCommand 要写入的命令
* @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();
}

/**
* @briefLCD1602写数据
* @paramData 要写入的数据
* @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();
   
}

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

}

/**
* @briefLCD1602设置光标位置
* @paramLine 行位置,范围:1~2
* @paramColumn 列位置,范围: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指定位置上显示一个字符
* @paramLine 行位置,范围:1~2
* @paramColumn 列位置,范围:1~16
* @paramChar 要显示的字符
* @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指定位置开始显示所给字符串
* @paramLine 起始行位置,范围:1~2
* @paramColumn 起始列位置,范围:1~16
* @paramString 要显示的字符串
* @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指定位置开始显示所给数字
* @paramLine 起始行位置,范围:1~2
* @paramColumn 起始列位置,范围:1~16
* @paramNumber 要显示的数字,范围:0~65535
* @paramLength 要显示数字的长度,范围: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码表
    }
}

荒泷帝君 发表于 2023-12-20 23:03

真好,真可以啊这个。

longxuekai 发表于 2023-12-21 06:17

了解一下吧看看吧

wddz 发表于 2023-12-21 08:19

学习

cy_ygs 发表于 2023-12-21 08:26

linyuwen 发表于 2023-12-21 08:51

ww645133040 发表于 2023-12-21 08:56

mester 发表于 2023-12-21 08:56

声声 发表于 2023-12-21 08:56

学习

mester 发表于 2023-12-21 08:56

页: [1] 2
查看完整版本: 51单片机加LCD1602显示名字