单片机 ----LCD----3

//***************************************************************************
// LCD1602_Ser.h
//***************************************************************************
#ifndef LCD1602_Ser //如果其他文件已经做了这个记号,那么不执行#define.
#define LCD1602_Ser //如果其他文件没有这个标记,那么就需要新做一个记号(唯一的)

sbit Lcd1602_RS=P4^5; //1602数据/命令选择
sbit Lcd1602_E=P4^6;

extern void LCD1602_Init(); //1602初始化
extern void LCD1602_Display_Ser();//1602显示刷新
extern u8 xdata LCD1602_Write_Buffer1[16]; //1602上行数据
extern u8 xdata LCD1602_Write_Buffer2[16]; //1602下行数据
extern u8 xdata LCD1602_Write_Cursor_Add; //光标地址,闪烁的位置

#endif

//***************************************************************************
// LCD1602_Ser.c
//***************************************************************************
#include"all.h"

u8 code LCD1602_5x8[8]={0x08,0x00,0x07,0x08,0x08,0x08,0x08,0x07}; //温度符号
u8 xdata LCD1602_Write_Buffer1[16]; //1602上行数据
u8 xdata LCD1602_Write_Buffer2[16]; //1602下行数据
u8 xdata LCD1602_Write_Cursor_Add=1; //光标地址

//***************************************************************************
// 1602短暂延迟
//***************************************************************************
void LCD1602_Delay(u8 len) //不同的板子速度不同,要求的延迟也不同,i的值根据不同的板子适当修改。
{
u8 idata i;
while(len–)
{
i=15;
while(i–);
}

}
//***************************************************************************
// 写入到1602数据RAM存储
//***************************************************************************
void LCD1602_Write_Data(u8 Dat) //1602写入数据
{
Lcd1602_RS=1; //高电平数据
Lcd1602_E=0;
LCD1602_Delay(3);
Lcd1602_E=1; //使能拉高

HC595_Write_Buffer[0]=Dat;  //给595芯片准备数据,中间三个可以忽略,595芯片将数据发送给管脚
HC595_Write_Buffer[1]=0;
HC595_Write_Data_Drive();

Lcd1602_E=0;        //下降沿触发1602接收

}

//***************************************************************************
// 写入到1602数据命令地址
//***************************************************************************
void LCD1602_Write_Add(u8 Add) //1602写入指令
{
Lcd1602_RS=0; //高电平数据
Lcd1602_E=0;
LCD1602_Delay(3);
Lcd1602_E=1; //使能拉高

HC595_Write_Buffer[0]=Add;  //给595芯片准备数据,中间三个可以忽略,595芯片将数据发送给管脚
HC595_Write_Buffer[1]=0;    //关闭数码管
HC595_Write_Data_Drive();

Lcd1602_E=0;        //下降沿触发1602接收

}
//***************************************************************************
// 初始化1602寄存器
//***************************************************************************
void LCD1602_Init()
{
u8 xdata i;
P4M0&=0x9F;
P4M1&=0x9F;//按位于0x0f=1100 1111 常规初始化输入输出口 P4.6 P4.5 准双向口模式
LCD1602_Write_Add(0x38); //8位总线,双行显示.初始化要先写!!
LCD1602_Delay(250);
LCD1602_Write_Add(0x01); //清除显示
LCD1602_Delay(250); //时间延迟写的多一些,写的太快不好。
LCD1602_Write_Add(0x02); //光标复位
LCD1602_Delay(250);
LCD1602_Write_Add(0x06); //光标移动方向
LCD1602_Delay(250);
LCD1602_Write_Add(0x0c); //整体显示开,无光标
LCD1602_Delay(250);
LCD1602_Write_Add(0x14); //光标随着字右移
LCD1602_Delay(250);
LCD1602_Write_Add(0x40); //我们自己定义的的CGRAM地址,保存的是温度符号
for(i=0;i<8;i++)
{
LCD1602_Write_Data(LCD1602_5x8[i]); //写入自己取模的数据到CGRAM地址,第一行内容。不知道为什么显示不了自定义的温度符号???
}

}
//***************************************************************************
// 显示内容发送到1602数据RAM
//***************************************************************************
void LCD1602_Display_Ser() //1602显示刷新
{
u8 idata i;
LCD1602_Write_Add(0x80); //上行显示,从最左边开始
for(i=0;i<16;i++)
{
LCD1602_Write_Data(LCD1602_Write_Buffer1[i]); //发送要显示的内容,第一行
}
LCD1602_Write_Add(0xc0);//下行显示,从最左边开始
for(i=0;i<16;i++)
{
LCD1602_Write_Data(LCD1602_Write_Buffer2[i]); //发送要显示的内容,第二行
}

switch(LCD1602_Write_Cursor_Add)    //光标控制,闪烁位置控制
{
    case 0: LCD1602_Write_Add(0x0c);break;  //不显示也不闪烁光标
    case 1: LCD1602_Write_Add(0x0f);LCD1602_Write_Add(0xcd);break;   //不显示也不闪烁光标
    
}

}

//***************************************************************************
// main.c
//***************************************************************************
void LCD1602_Allot()
{
static xdata kkk=10;
static xdata u16 count;
count++;
if(count>1000)
{
count=0;
LCD1602_Write_Buffer1[0]=‘L’;
LCD1602_Write_Buffer1[1]=‘I’;
LCD1602_Write_Buffer1[2]=‘D’;
LCD1602_Write_Buffer1[3]=‘O’;
LCD1602_Write_Buffer1[4]=‘N’;
LCD1602_Write_Buffer1[5]=‘G’;
LCD1602_Write_Buffer1[6]=‘K’;
LCD1602_Write_Buffer1[7]=‘F’;
LCD1602_Write_Buffer1[8]=‘B’;
LCD1602_Write_Buffer1[9]=’ ‘;
LCD1602_Write_Buffer1[10]=’ ‘;
LCD1602_Write_Buffer1[11]=’ ‘;
LCD1602_Write_Buffer1[12]=’ ‘;
LCD1602_Write_Buffer1[13]=’ ‘;
LCD1602_Write_Buffer1[14]=’ ';
LCD1602_Write_Buffer1[15]=0; //指定位置写0,会显示温度符号!!ASCII码0x00 对应地址0x40–0x47,比如自定义温度符号。还有ASCII码:0x01–0x07各对应自定义图案.任何字符都在ASCII码中,只不过地址不同。

	LCD1602_Write_Buffer2[0]=0x30;	//显示的是ASK码的值 ,如果kkk是10,显示的是1
	LCD1602_Write_Buffer2[1]=0x30;	//显示的是数字,显示的是0.一个数码管显示1,一个数码管显示0.
	LCD1602_Write_Buffer2[2]=' ';
	LCD1602_Write_Buffer2[3]=' ';
	LCD1602_Write_Buffer2[4]=' ';
	LCD1602_Write_Buffer2[5]=' ';
	LCD1602_Write_Buffer2[6]=' ';
	LCD1602_Write_Buffer2[7]=' ';
	LCD1602_Write_Buffer2[8]=' ';
	LCD1602_Write_Buffer2[9]=' ';
	LCD1602_Write_Buffer2[10]=' ';
	LCD1602_Write_Buffer2[11]=' ';
	LCD1602_Write_Buffer2[12]=' ';
	LCD1602_Write_Buffer2[13]=' ';
	LCD1602_Write_Buffer2[14]=' ';
	LCD1602_Write_Buffer2[15]=' ';

	LCD1602_Write_Cursor_Add=1; 	//光标闪烁位置
	LCD1602_Display_Ser();

}

}
void main()
{
u16 xdata count=0;

HC595_Init();	//数码管驱动芯片为HC595,数码管若要显示,HC595芯片要先初始化
LCD1602_Init();

while(1)
{

   SMG_Allot();
   LCD1602_Allot(); 
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_49327613

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值