背光闪,应该是你的背光控制脚接错了把。它直接接电源或这由单片机控制。你查一下。

lcd1602闪动_lcd1602闪烁lcd1602闪动_lcd1602闪烁


lcd1602闪动_lcd1602闪烁


lcd1602闪动_lcd1602闪烁


lcd1602闪动_lcd1602闪烁


至于点不亮内容。 排除硬件链接问题,那就是初始化了。

1602启动的时候初始化有讲究的,要延时一下。给你个代码参考下

初始化:

delay_nms(100);

LCD_init();

LCD_write_string(0,0,"TEST 1234");

LCD_write_string(0,1," 5678")

下面的保存成.h文件。

/==========================1602液晶部分============================/

//定义MCU与LCD的接口

#define LCD_EN_PORT PORTB

#define LCD_RS_PORT PORTB

#define LCD_RS_EN_DDR DDRB

#define LCD_DATA_PORT PORTB

#define LCD_DATA_DDR DDRB

#define LCD_DATA_PIN PINB

#define LCD_EN 0x04 //portD7 out

#define LCD_RS 0x01 //portD5 out

#define LCD_DATA 0xf0 //portb4/5/6/7 out

/--------------------------------------------------------------------------------------------------

Public function prototypes

--------------------------------------------------------------------------------------------------/

void LCD_init (void);

void LCD_en_write (void);

void LCD_write_char (unsigned command,unsigned data);

void LCD_set_xy (unsigned char x, unsigned char y);

void LCD_write_string (unsigned char X,unsigned char Y,unsigned char s);

void LCD_init(void) //液晶初始化

{LCD_DATA_DDR |= LCD_DATA;

LCD_RS_EN_DDR |= LCD_RS | LCD_EN;

LCD_EN_PORT &= ~LCD_EN; //EN=0

delay_nms(50);

LCD_write_char(0x28,0); //4位显示

delay_nms(5);

LCD_write_char(0x28,0); //4位显示

delay_nms(5);

LCD_write_char(0x28,0); //4位显示

delay_nms(5);

LCD_write_char(0x28,0); //4位显示

delay_nms(5);

delay_nms(1);

LCD_write_char(0x0c,0); //显示开

delay_nms(1);

LCD_write_char(0x01,0); //清屏

delay_nms(1);

LCD_write_char(0x06,0); //

delay_nms(1);

LCD_write_char(0x0c,0); //

delay_nms(1);

}void LCD_write_string(unsigned char X,unsigned char Y,unsigned char s)

{LCD_set_xy( X, Y ); //写地址

while (s) // 写显示字符

{LCD_write_char( 0, s );

s ++;

}}

void LCD_set_xy( unsigned char x, unsigned char y ) //写地址函数

{unsigned char address;

if (y == 0) address = 0x80 + x;

else

address = 0xc0 + x;

LCD_write_char( address, 0 );

}void LCD_en_write(void) //液晶使能

{LCD_EN_PORT|=LCD_EN;

delay_nus(20);

LCD_EN_PORT&=~LCD_EN;

}void LCD_write_char(unsigned command,unsigned data) // 写数据

{unsigned command_temp,data_temp;

command_temp=command;

data_temp=data;

delay_nus(16);

if(command==0)

{LCD_RS_PORT|=LCD_RS; //RS=1

LCD_DATA_PORT&=0X0f;

LCD_DATA_PORT|=data_temp&0xf0; //写高四位

LCD_en_write();

data_temp=data_temp<<4;

LCD_DATA_PORT&=0X0f;

LCD_DATA_PORT|=data_temp&0xf0; //写低四位

LCD_en_write();

}else

{LCD_RS_PORT&=~LCD_RS; //RS=0

LCD_DATA_PORT&=0X0f;

LCD_DATA_PORT|=command_temp&0xf0; //写高四位

LCD_en_write();

command_temp=command_temp<<4;

LCD_DATA_PORT&=0x0f;

LCD_DATA_PORT|=command_temp&0xf0; //写低四位

LCD_en_write();

}LCD_DATA_PORT&=0X0f;

}void LCD_CLEAR(unsigned char Y)

{unsigned char i;

LCD_set_xy( 0, Y ); //写地址

for(i=0;i<16;i++) // 写显示字符

{LCD_write_char( 0,0x20);

}}

应该是用程序给lcd1602初始化时设置的显示方式问题,可能设置成字符移动和闪烁了!我毕业设计做过这个

首先说下,并不是像zhenjiang2009说的那样,1602只能对光标设置是否闪烁,而不能设置字符是否闪烁的

其次,1602是不用延时的,每次对液晶作只要判断忙标志即可,只要不忙,就可以作

在线等51单片机关于LCD1602光标闪烁的问题

LCD1602时钟程序,带有闪烁指示位置的。

#include

#define uchar unsigned char

#define uint unsigned int

it LCD_EN=P2^2;

it LCD_RW=P2^1;

it LCD_RS=P2^0;

it s1 =P2^5;

it s2 =P2^6;

it s3 =P2^7;

uchar t0n; //定时器T0中断计数,定时50ms,中断20次为1秒

uchar hour,minute,second; //声明小时,分,秒变量

void delay()

{uint y;

for(y=0;y<100;y++);

}void write_com(uchar cmd)

{LCD_RS=0;

LCD_RW=0;

P0=cmd;

delay();

LCD_EN=1;

LCD_EN=0;

}void write_dat(uchar dat)

{LCD_RS=1;

LCD_RW=0;

P0=dat;

delay();

LCD_EN=1;

LCD_EN=0;

}//初始化先不开闪烁

void init_1602(void)

{LCD_RW=0;

LCD_RS=0;

LCD_EN=0;

write_com(0x38);

write_com(0x0c);

write_com(0x06);

write_com(0x01);

write_com(0x80);

delay();

}//显示时间子程序

void write_time(uchar x,uchar time)

{write_com(0xc0+x);

write_dat(time/10+48);

write_dat(time%10+48);

write_com(0xc0+x+1);//恢复闪烁位置在个位

}//显示字符串子程序

void write_str(uchar code sp)

{while(sp!=0)

{write_dat(sp);

sp++;

}}

void main()

{uchar work; //计时标志位,0:计时,1:调小时,2:调分,3:调秒

hour=10,minute=50;

init_1602();

write_com(0x80+2);

write_str("2018-05-19");

write_com(0xc0+4);

write_str("10:50:00");

TMOD=0x01;

TH0 =0x3C; //单片机晶振频率=12M,定时50ms,时间常数=3CB0

TL0 =0xB0;

IE =0x82; //开中断

TR0 =1; //启动定时器T0

while(1)

{if(work==0&&t0n>=20) //计时状态

{t0n=0; //中断20次,1秒到

second++; //秒加1

if(second==60) //到60秒

{second=0;

minute++; //分加1

if(minute==60) //到60分

{minute=0;

hour++; //小时加1

if(hour==24)

hour=0;

}}

write_time(4,hour);

write_time(7,minute);

write_time(10,second);

}if(s1==0)

{work++;

if(work>3)

{work=0;

TR0=1;

t0n=0;

write_com(0x0c);//恢复计时,关光标,关闪烁

}else

{TR0=0;

write_com(0x0d); //关光标,开闪烁

write_com(0xc0+2+work3);//指定闪烁位置

}while(s1==0);

}else if(work==1)

{if(s2==0)

{hour++;

if(hour>23)

hour=0;

write_time(4,hour);//按键后才显示,闪烁就不会漂移,以下同

while(s2==0);

}if(s3==0)

{hour--;

if(hour==0xff)

hour=23;

write_time(4,hour);

while(s3==0);

}}

else if(work==2)

{if(s2==0)

{minute++;

if(minute>59)

minute=0;

write_time(7,minute);

while(s2==0);

}if(s3==0)

{minute--;

if(minute==0xff)

minute=59;

write_time(7,minute);

while(s3==0);

}}

else if(work==3)

{if(s2==0)

{second++;

if(second>59)

second=0;

write_time(10,second);

while(s2==0);

}if(s3==0)

{second--;

if(second==0xff)

second=59;

write_time(10,second);

while(s3==0);

}}

}}

//定时器T0中断服务子程序

void T0_isr() interrupt 1

{TH0=0x3C; //重写时间常数

TL0=0xB0;

t0n++; //中断次加1

}仿真图如下,闪烁效果。

PWM直流电机调速 LCD1602一闪一闪的 电机有哒哒哒的响声 但就是不转为什么

您好,方案一:双极性工作制。双极性工作制是在一个脉冲周期内,单片机两控制口各输出一个控制信号,两信号高低电平相反,两信号的高电平时决定电动机的转向和转速。

方案二:单极性工作制。单极性工作制是单片机控制口一端置低电平,另一端输出PWM信号,两口的输出切换和对PWM的占空比调节决定电动机的转向和转速。

由于单极性工作制电压波开中的交流成分比双极性工作制的小,其电流的波动也比双极性工作制的小,所以我们采用了单极性工作制。 (3) PWM调脉宽方式

调脉宽的方式有三种:定频调宽、定宽调频和调宽调频。我们采用了定频调宽方式,因为采用这种方式,电动机在运转时比较稳定;并且在采用单片机产生PWM脉冲的软件实现上比较方便。 (4) PWM软件实现方式

方案一:采用定时器做为脉宽控制的定时方式,这一方式产生的脉冲宽度极其,误只在几个us。

方案二:采用软件延时方式,这一方式在精度上不及方案一,特别是在引入中断后,将有一定的误。故采用方案一。

飞思卡尔?智能车?

其实就是一个简单的菜单程序,你可以很简单啊, 你按一下设置 键,则其标志位加1,然后判断是否进入参数设置,如果进入了参数设置,就首先一个光标到指定地点,其光标就是255-正常显示值。出现跳动的光标,具体查看LCD1602也是知道的。