找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2537|回复: 7
收起左侧

不懂就问:这个是一个lcd1602的重新请问这个dx和dx是什么东西?

[复制链接]
ID:404630 发表于 2019-9-26 14:42 | 显示全部楼层 |阅读模式
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit wxLE=P2^6;
sbit dxLE=P2^7;
sbit RS=P1^3;
sbit RW=P1^4;
sbit EN=P1^5;
uint i;
uchar code table[]="I LOVE YOU !";
uchar code table1[]="1314520 ! ^_^";
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=114;y>0;y--);
}
bit LCD_Check_Busy()
{
        P0=0xff;
        RS=0;
        RW=1;
        EN=0;
        _nop_();
        EN=1;
        return (bit)(P0&0x80);
}
void LCD_Write_Com(uchar com)
{
        while(LCD_Check_Busy());
        RS=0;
        RW=0;
        EN=1;
        P0=com;
        _nop_();
        EN=0;
}
void LCD_Write_Data(uchar Data)
{
        while(LCD_Check_Busy());
        RS=1;
        RW=0;
        EN=1;
        P0=Data;
        _nop_();
        EN=0;
}
void main()
{
        wxLE=1;
        P0=0;
        wxLE=0;
        dxLE=1;
        P0=0;
        dxLE=0;
        LCD_Write_Com(0x38);//显示模式设置
        LCD_Write_Com(0x01);//清屏,地址计数器清零,光标复位,显示缓冲区DDRAM的内容全部写入空格
        LCD_Write_Com(0x0c);//显示开启,不显示光标,光标不闪烁
        LCD_Write_Com(0x06);//读写一个字符过后,地址指针加1,光标加1


        while(1)
        {
                LCD_Write_Com(0x80);
                delay(10);
                for(i=0;i<12;i++)
                {
                        LCD_Write_Data(table[i]);
                        delay(10);
                }
                LCD_Write_Com(0xc0);
                delay(10);
                for(i=0;i<13;i++)
                {
                        LCD_Write_Data(table1[i]);
                        delay(10);
                }
                /*for(i=0;i<16;i++) //循环左移显示,此时不需要加下面的while(1)语句
                {
                        LCD_Write_Com(0x18);
                        delay(300);
                }*/
                while(1);//保持显示稳定,不要改语句后,程序从头开始执行会间断的显示
        }
}


回复

使用道具 举报

ID:586438 发表于 2019-9-26 16:56 | 显示全部楼层
段选口还是位选口  和数码管差不多  你看一下
回复

使用道具 举报

ID:275826 发表于 2019-9-26 17:47 | 显示全部楼层
问题都没说清楚呀,哪有dx?不湿dxLE和wxLE吗?
回复

使用道具 举报

ID:235200 发表于 2019-9-26 18:07 | 显示全部楼层
wxLE和dxLE是液晶屏的左右半屏选通信号
回复

使用道具 举报

ID:97554 发表于 2019-9-26 18:13 | 显示全部楼层
这一定是某个开发板的例程,DX  WX是他们写的段选和位选的首拼。此程序点亮LCD1602这两个玩意儿毫无用处,不参与LCD1602的运行,

while(1)
        {
                LCD_Write_Com(0x80);      这行指定位置第一行第一位
                delay(10);
                for(i=0;i<12;i++)
                {
                        LCD_Write_Data(table[i]);
                        delay(10);
                }    上边这几行是依次在第一位第二位直到第十二位的显示" I LOVE YOU !"

                LCD_Write_Com(0xc0);  第二行第一位0XC0,你可以尝试改成0XC1   0XC2你就知道这是干啥的了
                delay(10);
                for(i=0;i<13;i++)
                {
                        LCD_Write_Data(table1[i]);
                        delay(10);
                }
                /*for(i=0;i<16;i++) //循环左移显示,此时不需要加下面的while(1)语句
                {
                        LCD_Write_Com(0x18);
                        delay(300);
                }*/
回复

使用道具 举报

ID:155507 发表于 2019-9-26 18:52 | 显示全部楼层
这种引脚定义,不是固定的标准,每个人写程序都可以随便定义引脚名的,你随便拿两个变量名来问,没有一点意义,那个人就这么定义的,表示什么脚,他自己明白就行。来这问别人没有用。这本来就是随便定义的,没有什么明文规定的。不过,是可以根据程序的前后语句分析出来的。

根据程序的前后语句分析出来,是六位共阴数码管, 由P0连接两个锁存器 wxLE控制位选和dxLE控制段选。
回复

使用道具 举报

ID:213173 发表于 2019-9-26 19:29 | 显示全部楼层
由于学习板上的MCU端口都是重复使用的,在使用LCD1602时因与数码管共用P0,所以在程序初始化时把数码管位码wxLE和段码dxLE锁存器全部清0后锁存,以免P0给LCD1602传输信号时数码管乱闪。

评分

参与人数 1黑币 +8 收起 理由
杨雪飞 + 8 赞一个!所以开发板误人

查看全部评分

回复

使用道具 举报

ID:97554 发表于 2019-9-26 19:36 | 显示全部楼层
1602的驱动:

第一步、定义驱动引脚:   RW   EN   RS三个引脚,分别定义到单片的IO口(引脚)上,P0   P1  P2  P3自己定,定好了自己在下边的程序里记得保持一致。

第二步、定义初始化函数,你的原来程序中把这部写到主函数里了,一般正经程序不会把这段写进主函数。
  void lcdinit()
{
  LCD_Write_Com(0x38);//显示模式设置
  LCD_Write_Com(0x01);//清屏,地址计数器清零,光标复位,显示缓冲区DDRAM的内容全部写入空格
  LCD_Write_Com(0x0c);//显示开启,不显示光标,光标不闪烁
  LCD_Write_Com(0x06);//读
}

第三步、定义写命令函数

void LCD_Write_Com(uchar com)
{
        while(LCD_Check_Busy());
        RS=0;
        RW=0;
        EN=1;
        P0=com;      看这里的P0 = com;这个就是把单片机P0 IO口的八个脚接在LD1602的八个数据口D0--D7,P0^0 ----P0^7。
        _nop_();
        EN=0;
}

第四步、定义写数据函数

void LCD_Write_Data(uchar Data)
{
        while(LCD_Check_Busy());  判断忙不忙1602很少需要判断,甚至下边那个NOP延时都不需要写,现在的单片机速度够快,不写一般也不会出问题。
        RS=1;
        RW=0;
        EN=1;
        P0=Data;
        _nop_();
        EN=0;
}

第五步、主函数

void main()
{

先初始化LCD

lcdinit();

然后写命令(位置)

然后写数据(显示的内容)先写一个下边这样的主函数试一下,第一行第一位显示“A”
        {
                LCD_Write_Com(0x80);
                        LCD_Write_Data(“A”);
                        
           
}


建议扔掉你的开发板,用最小系统加模块自己连线找合适的教程学,跟着开发板的教程将让你花费很多不必要的时间和精力,不想诋毁任何录教程的买开发板的,反正跟他们学的一塌糊涂,最后自己从基础的东西开始看才找到门,跟着教程学了八年,越学越糊涂。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表