本帖最后由 515229319 于 2018-7-24 10:52 编辑
实现1602基本动态显示:
(附详细解析)
实现
#include<reg52.h> //52系列单片机头文件
#define uchar unsigned char //宏定义
#define uint unsigned int //宏定义
uchar code table[]="51 dan pian ji";
uchar code table1[]="conscientious";
uchar num;
sbit lcden=P3^5; //液晶使能端
sbit lcdrw=P3^6;
sbit lcdrs=P3^7; //液晶数据命令选择端
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com) //子函数
{
lcden=0; //选择写命令模式
lcdrw=0;
P0=com; //将要写的命令字送到数据总线上
delay(10); //稍做延时以待数据稳定
lcden=1; //使能端给一高脉冲,因为初始化函数中已经将lcden置位0
delay(10); //稍做延时
lcden=0; //将使能端置0以完成高脉冲
}
void write_date(uchar date)
{
lcden=0;
lcdrs=1; //选择写命令模式
lcdrw=0;
P0=date; //将要写的命令字送到数据总线上
delay(10); //稍做延时以待数据稳定
lcden=1; //使能端给一高脉冲,因为初始化函数中已经将lcden置位0
delay(10); //稍做延时
lcden=0; //将使能端置0以完成高脉冲
}
void init()
{
lcden=0;
lcdrw=0;
write_com(0x38); //00111000 设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c); //00001100 设置开显示,不显示光标 改为0x0f则带闪烁光标(00001111)
write_com(0x06); //00000110 写一个字符后地址指针加1
write_com(0x01); //00000001 显示清0,数据指针清0
}
void main()
{
init();
write_com(0x80+0x10);
for(num=0;num<14;num++)
{
write_date(table[num]);
delay(10);
}
write_com(0x80+0x50);
for(num=0;num<13;num++)
{
write_date(table1[num]);
delay(10);
}
for(num=0;num<16;num++)
{
write_com(0x18); //左移指令
delay(200); //控制进入速度
}
while(1);
}
|