📄 lcd1602a.c
字号:
#include<pic.h>
//定义MCU与LCD的接口
#define EN RA3
#define RW RA2
#define RS RA1
#define LCD_DATA PORTC
/*--------------------------------------------------------------------------------------------------
Public function prototypes
--------------------------------------------------------------------------------------------------*/
void LCD_init (void);
void LCD_en_write (void);
void LCD_write_data (unsigned date);
void LCD_write_cmd (unsigned command);
void LCD_wait_Ready (void);
void LCD_set_xy (unsigned char x, unsigned char y);
void LCD_write_string (unsigned char X,unsigned char Y,unsigned char *s);
void delay_nms (unsigned int n);
void delay_1ms (void);
void delay_1us (void);
void delay_nus (unsigned int n);
const unsigned char dis0[]={"Welcome"};
const unsigned char dis1[]={"www.527dz.com!"};
const unsigned char dis2[]={"pengzhangjun"};
const unsigned char dis3[]={"tel:13795953047"};
/**********************************************************
LCD_init(void) :LCD初始化函数
**********************************************************/
void LCD_init(void)
{
delay_nms(15);
LCD_write_cmd(0x28); //4bit
delay_nus(500);
LCD_write_cmd(0x0f); //显示开
delay_nus(500);
LCD_write_cmd(0x01); //显示清屏
delay_nms(50);
LCD_write_cmd(0x06); //显示光标移动设置
delay_nms(5);
}
void LCD_en_write(void) //EN端产生一个高电平脉冲,写LCD
{
EN = 0;
delay_nms(10);
EN = 1;
}
/*-----------------------------------------------------------------------
LCD_write_cmd : 写命令字函数
输入参数:command :命令字
编写日期 :2007-4-12
最后修改日期 :2004-4-12
-----------------------------------------------------------------------*/
void LCD_write_cmd (unsigned command)
{ unsigned cmd_temp;
cmd_temp = command;
LCD_DATA=LCD_DATA&0x0f;
LCD_DATA=command&0xf0;
RS=0;
RW=0;
LCD_en_write();
command=cmd_temp<<4;
LCD_DATA=LCD_DATA&0x0f;
LCD_DATA=command&0xf0;
RS=0;
RW=0;
LCD_en_write();
}
/*-----------------------------------------------------------------------
LCD_write_data : 英文字符串显示函数
输入参数:data :英文字符串指针;
编写日期 :2007-4-12
最后修改日期 :2007-4-12
-----------------------------------------------------------------------*/
void LCD_write_data(unsigned data)
{
unsigned data_temp;
data_temp=data;
//LCD_wait_Ready();
LCD_DATA=LCD_DATA&0x0f;
LCD_DATA = data&0xf0;
RS=1;
RW=0;
LCD_en_write();
data =data_temp<<4;
LCD_DATA=LCD_DATA&0x0f;
LCD_DATA = data&0xf0;
RS=1;
RW=0;
LCD_en_write();
}
void LCD_wait_Ready(void) //等待LCD空闲
{
TRISC |= 0x80; //PC7 I/O口方向设置为输入
RW=1;
RS=0;
EN=1;
while (!( LCD_DATA&0x80 ) == 0); //RW=1,读PC7,为0表示空闲;
TRISC= 0x00;
}
/*-----------------------------------------------------------------------
LCD_set_xy : 设置LCD显示的起始位置
输入参数:x、y : 显示字符串的位置,X:0-15,Y:0-1
LCD第一行显示寄存器地址:0X80-0X8F
LCD第一行显示寄存器地址:0XC0-0XCF
编写日期 :2004-8-19
最后修改日期 :2004-8-19
-----------------------------------------------------------------------*/
void LCD_set_xy( unsigned char x, unsigned char y )
{
unsigned char address;
if (y == 0) address = 0x80 + x;
else
address = 0xc0 + x;
LCD_write_cmd( address );
}
/*-----------------------------------------------------------------------
LCD_write_string : 英文字符串显示函数
输入参数:*s :英文字符串指针;
X、Y : 显示字符串的位置
编写日期 :2004-8-19
最后修改日期 :2004-8-19
-----------------------------------------------------------------------*/
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
{
LCD_set_xy( X, Y );
while (*s)
{
LCD_write_data( *s );
s ++;
}
}
/*-----------------------------------------------------------------------
main : 主函数
输入参数:*s :英文字符串指针;
X、Y : 显示字符串的位置
编写日期 :2004-8-19
最后修改日期 :2004-8-19
-----------------------------------------------------------------------*/
void main()
{ int i;
delay_nms(10); //调用延时子程序
INTCON=0x00;
ADCON1=0x07; //设置RA口全部为普通数字IO口
TRISA=0x00; //定义RA口为输出
TRISC=0x00; //定义RC口为输出
LCD_init();
while(1)
{
LCD_write_cmd(0x01); //显示清屏
delay_nms(20);
LCD_set_xy(3,0);
i=0;
while(dis0[i] != '\0')
{ // 显示字符dis1
LCD_write_data(dis0[i]);
i++;
}
LCD_set_xy(1,1); // 设置显示位置为第一行的第一个字符
i = 0;
while(dis1[i] != '\0')
{
LCD_write_data(dis1[i]); // 显示字符dis1
i++;
}
delay_nms(1000);
LCD_write_cmd(0x01); //显示清屏
delay_nms(50);
LCD_set_xy(1,0);
i=0;
while(dis2[i] != '\0')
{ // 显示字符dis1
LCD_write_data(dis2[i]);// 显示字符dis2
i++;
}
LCD_set_xy(1,1); // 设置显示位置为第一行的第一个字符
i = 0;
while(dis3[i] != '\0')
{
LCD_write_data(dis3[i]); // 显示字符dis3
i++;
}
delay_nms(1000);
}
}
void delay_1ms(void) //1ms延时函数
{
unsigned int i;
for (i=0;i<1000;i++);
}
void delay_nms(unsigned int n) //N ms延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1ms();
}
void delay_1us(void) //1us延时函数
{
asm("nop");
}
void delay_nus(unsigned int n) //N us延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1us();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -