1602LCD字符液晶静态-动态显示(指定位置)

  • 格式:txt
  • 大小:5.64 KB
  • 文档页数:3


/**************************************************
1602LCD字符液晶静态-动态显示(指定位置)

STA0-----STA6为:当前数据地址指针的数值
STA7为:读/写操作使能。STA7=0【允许】;STA7=1【禁止】
理论上每次对1602_LCD读/写操作之前,都要进行读/写检测
以确保STA7=0,否则无法知道LCD是否处于忙碌状态,但使用
足够长时间延时函数,加在每条读/写操作后,就确保LCD能有
充分时间完成其相应操作
**************************************************/
#include
#define uint unsigned int
#define uchar unsigned char
#define lcd_dat P0 //LCD数据输入/输出端D7------D0,8位并行口
sbit lcd_RS=P2^5; //数据/命令选择引脚(H/L)
sbit lcd_RW=P2^6; //读/写引脚(H/L)
sbit lcd_E=P2^7; //使能引脚

uchar CGRAM_ADDRESS0[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};//字模地址//地址代码0x00
uchar CGRAM_ADDRESS1[]={0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};//字模地址//地址代码0x01
uchar CGRAM_ADDRESS2[]={0};//字模地址//地址代码0x02
uchar CGRAM_ADDRESS3[]={0};//字模地址//地址代码0x03
uchar CGRAM_ADDRESS4[]={0};//字模地址//地址代码0x04
uchar CGRAM_ADDRESS5[]={0};//字模地址//地址代码0x05
uchar CGRAM_ADDRESS6[]={0};//字模地址//地址代码0x06
uchar CGRAM_ADDRESS7[]={0};//字模地址//地址代码0x07
uchar CGRAM_DATA0[]={0x02,0x05,0x05,0x02,0x00,0x00,0x00,0x00};//字模数据
uchar CGRAM_DATA1[]={0x00,0x0a,0x15,0x11,0x11,0x0a,0x04,0x00};//字模数据
uchar CGRAM_DATA2[]={0};//字模数据
uchar CGRAM_DATA3[]={0};//字模数据
uchar CGRAM_DATA4[]={0};//字模数据
uchar CGRAM_DATA5[]={0};//字模数据
uchar CGRAM_DATA6[]={0};//字模数据
uchar CGRAM_DATA7[]={0};//字模数据


void delay_ms(uint ms) // ms精确延时函数 (C51@11.0592MHz)
{
uint i;
uchar j;
for(i=0;i{
for(j=0;j<200;j++);
for(j=0;j<102;j++);
}
}

void delay(uint i) //us精确延时函数(C51@11.0592MHz)
{
while(i--);
}

void lcd_write_command(uchar command_dat)//写指令函数
{
lcd_RS=0; //低电平表示写入的是指令
lcd_RW=0; //低电平表示写操作
lcd_dat=command_dat; //把要写的指令送到lcd数据输入端,即P0口
lcd_E=1; //E置高电平,使能允许
lcd_E=0; //E置低电平,使能端E从高电平1跳变到低电平0,执行写操作
delay(4); //延时56us,等待写指令操作完成【写指令操作时间为40us】
}

void lcd_write_data(uchar data_dat)//写数据函数
{
lcd_RS=1; //低电平表示写入的是数据
lcd_RW=0; //低电平表示写操作
lcd_dat=data_dat; //把要写的数据送到lcd数据输入端,即P0口
lcd_E=1; //E置高电平,使能允许
lcd_E=0; //E置低电平,使能端E从高电平1跳变到低电平0,执行写操作
delay(4); //延时56us,等待写指令操作完成【写指

令操作时间为40us】
}

void lcd_init() //lcd初始化函数
{
lcd_write_command(0x38);//lcd显示模式设置,16*2显示,5*8点阵,8位数据接口
lcd_write_command(0x0c);//显示状态设置,,开显示,关光标,光标no闪烁
lcd_write_command(0x06);//输入方式设置,光标右移,整屏NO移动,【N=1,即读/写一个字符后,地址指针AC自动+1,光标指针+1】
lcd_write_command(0x01);//清除屏幕显示
delay_ms(2); //延时2ms,完成清屏操作【执行清屏指令需要1.64ms】
}


/*【hang是指第1、2行lie是指第1-16列,dat是要显示的字符内容】*/

void lcd_display_onechar(uchar hang,uint lie,uchar dat)//lcd显示一个字符函数
{
uchar shuzu[]="ERROR!";
uchar address; //定义一个lcd当前要显示的字符的地址变量
uchar i;
if((hang==1)&&(1<=lie)&&(lie<=16))
{
address=0x80; //如果是第一行要显示字符,那么就用当前地址计数器AC+0x80【AC=0X00-0X27】
address=address+lie-1; //lie=1~16
}
else if((hang==2)&&(1<=lie)&&(lie<=16))
{
address=0xc0; //如果是第二行要显示字符,那么就用当前地址计数器AC+0xc0【AC=0X40-0X67】
address=address+lie-1; //lie=1~16
}
else
address=0x80+5; //否则在第一行正中间显示出错ERROR!
if(((hang==1)||(hang==2))&&(1<=lie)&&(lie<=16))
{
lcd_write_command(address); //向lcd中写当前要显示字符的地址【属于指令】
lcd_write_data(dat); //向lcd中写当前要显示字符的内容【属于数据】
}
else //否则执行出错ERROR!
{
while(1)
{
lcd_init(); //清屏
delay_ms(500); //0.5S间隔闪烁
lcd_write_command(address); //向lcd中写当前要显示字符的地址【属于指令】
for(i=0;i<6;i++)
lcd_write_data(shuzu[i]);
delay_ms(500); //0.5s间隔闪烁
}
}
}

void main()
{
uchar i,j,K;
lcd_init();
for(i=0;i<8;i++)
{
lcd_write_command(0x40+CGRAM_ADDRESS0[i]);//写地址
lcd_write_data(CGRAM_DATA0[i]); //写字模
}
for(j=0;j<8;j++)
{
lcd_write_command(0x40+CGRAM_ADDRESS1[j]);//写地址
lcd_write_data(CGRAM_DATA1[j]); //写字模
}
while(1)
{
lcd_init(); //液晶初始化
delay_ms(200); //延时200ms
lcd_display_onechar(1,7,0x00); //在第1行第7列显示字符"。"
delay_ms(200); //延时200ms
lcd_display_onechar(1,8,'C'); //在第1行第8列显示字符"C"
delay_ms(200);
lcd_display_onechar(1,9,0x00); //在第1行第9列显示字符
delay_ms(200);
lcd_display_onechar(1,10,'C'); //在第1行第10列显示字符
delay_ms(200);
lcd_display_onechar(2,7,0x01); //在第2行第7列显示字符
delay_ms(200);
lcd_display_onechar(2,8,0x01); //在第2行第8列显示字符
delay_ms(200);
lcd_display_onechar(2,9,0x01); //在第2行第9列显示字符

delay_ms(200);
lcd_display_onechar(2,10,0x01); //在第2行第10列显示字符
delay_ms(3000); //所有字符显示2S
for(K=0;K<3;K++) //所有字符闪烁显示3次
{
lcd_init();
delay_ms(500); //清屏0.5S
lcd_display_onechar(1,7,0x00);
lcd_display_onechar(1,8,'C');
lcd_display_onechar(1,9,0x00);
lcd_display_onechar(1,10,'C');
lcd_display_onechar(2,7,0x01);
lcd_display_onechar(2,8,0x01);
lcd_display_onechar(2,9,0x01);
lcd_display_onechar(2,10,0x01);
delay_ms(500); //间隔0.5S
}
delay_ms(2000); //所有字符显示2S
}

}

下载文档原格式

  / 3
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。