此为B站up:江科大自动协课程的12-2程序,学习用
跟着老师敲出来
main.c
#include <REGX52.H>
#include "LCD1602.h"
void main()
{
LCD_Init();
LCD_ShowChar(1,1,'A');
LCD_ShowString(1,5,"ABC");
LCD_ShowNum(1,9,11,2);
LCD_ShowSignedNum(2,1,-22,2);
LCD_ShowHexNum(2,5,0xA5,2);
LCD_ShowBinNum(2,9,0x03,2);
while(1)
{
}
}
LCD1602.h
#ifndef __LCD1602_H__
#define __LCD1602_H__
void LCD_Init(void);
void LCD_ShowChar(unsigned char Line,unsigned char Colum,unsigned char Char); //ÏÔʾ×Ö·û
void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char String[]); //ÏÔʾ×Ö·û´®
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Num,unsigned char Length); //ÏÔʾÎÞ·ûºÅÊý×Ö
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int SignedNum,unsigned char Length); //ÏÔʾÓзûºÅÊý×Ö
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Num,unsigned char Length); //ÏÔʾʮÁù½øÖÆÊý
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Num,unsigned char Length); //ÏÔʾ¶þ½øÖÆÊý
#endif
LCD1602.c
#include <REGX52.H>
sbit LCD_RW=P2^5;
sbit LCD_RS=P2^6;
sbit LCD_E=P2^7;
#define LCD_DataPort P0
void LCD_Delay() //@12.000MHz 1ms
{
unsigned char i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
int LCD_Pow(int X,int Y)
{
unsigned char i;
int Result=1;
for(i=1;i<Y;i++)
{
Result*=X;
}
return Result;
}
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();
}
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();
}
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{
if(Line==1)
{
LCD_WriteCommand(0x80|(Column-1));
}
else
{
LCD_WriteCommand(0x80|(Column-1)+0x40);
}
}
void LCD_Init(void)
{
LCD_WriteCommand(0x38);
LCD_WriteCommand(0x0C);
LCD_WriteCommand(0x06);
LCD_WriteCommand(0x01);
}
void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)
{
LCD_SetCursor(Line,Column);
LCD_WriteData(Char);
}
void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char String[])
{
unsigned char i;
LCD_SetCursor(Line,Column);
for(i=0;String[i]!='\0';i++)
{
LCD_WriteData(String[i]);
}
}
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Num,unsigned char Length)
{
unsigned char i;
LCD_SetCursor(Line,Column);
for(i=Length;i>0;i--)
{
LCD_WriteData('0'+Num/LCD_Pow(10,i-1)%10); //Num³ýÓÚ10µÄ£¨i-1£©´Î·½ÔÙ¶Ô10È¡Óà,½«×Ö·ûת»»³ÉÊý×Ö
}
}
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int SignedNum,unsigned char Length)
{
unsigned char i;
unsigned int Num_Cover;
LCD_SetCursor(Line,Column);
if(SignedNum>=0)
{
LCD_WriteData('+');
}
else
{
LCD_WriteData('-');
Num_Cover=-SignedNum;
}
for(i=Length;i>0;i--)
{
LCD_WriteData('0'+Num_Cover/LCD_Pow(10,i-1)%10); //Num³ýÓÚ10µÄ£¨i-1£©´Î·½ÔÙ¶Ô10È¡Óà,½«×Ö·ûת»»³ÉÊý×Ö
}
}
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Num,unsigned char Length)
{
unsigned char i;
unsigned char Num_Cover;
LCD_SetCursor(Line,Column);
for(i=Length;i>0;i--)
{
Num_Cover=Num/LCD_Pow(16,i)%16;
if(Num_Cover<10)
{
LCD_WriteData('0'+Num_Cover);
}
else
{
LCD_WriteData('A'+Num_Cover-10);
}
}
}
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Num,unsigned char Length)
{
unsigned char i;
LCD_SetCursor(Line,Column);
for(i=Length;i>0;i--)
{
LCD_WriteData('0'+Num/LCD_Pow(2,i-1)%2);
}
}