标题:
不懂就问:这个是一个lcd1602的重新请问这个dx和dx是什么东西?
[打印本页]
作者:
延仔kiwi
时间:
2019-9-26 14:42
标题:
不懂就问:这个是一个lcd1602的重新请问这个dx和dx是什么东西?
#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);//保持显示稳定,不要改语句后,程序从头开始执行会间断的显示
}
}
作者:
如痴百感生
时间:
2019-9-26 16:56
段选口还是位选口 和数码管差不多 你看一下
作者:
tyrl800
时间:
2019-9-26 17:47
问题都没说清楚呀,哪有dx?不湿dxLE和wxLE吗?
作者:
csmyldl
时间:
2019-9-26 18:07
wxLE和dxLE是液晶屏的左右半屏选通信号
作者:
杨雪飞
时间:
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);
}*/
作者:
angmall
时间:
2019-9-26 18:52
这种引脚定义,不是固定的标准,每个人写程序都可以随便定义引脚名的,你随便拿两个变量名来问,没有一点意义,那个人就这么定义的,表示什么脚,他自己明白就行。来这问别人没有用。这本来就是随便定义的,没有什么明文规定的。不过,是可以根据程序的前后语句分析出来的。
根据程序的前后语句分析出来,是六位共阴数码管, 由P0连接两个锁存器 wxLE控制位选和dxLE控制段选。
作者:
wulin
时间:
2019-9-26 19:29
由于学习板上的MCU端口都是重复使用的,在使用LCD1602时因与数码管共用P0,所以在程序初始化时把数码管位码wxLE和段码dxLE锁存器全部清0后锁存,以免P0给LCD1602传输信号时数码管乱闪。
作者:
杨雪飞
时间:
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”);
}
建议扔掉你的开发板,用最小系统加模块自己连线找合适的教程学,跟着开发板的教程将让你花费很多不必要的时间和精力,不想诋毁任何录教程的买开发板的,反正跟他们学的一塌糊涂,最后自己从基础的东西开始看才找到门,跟着教程学了八年,越学越糊涂。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1