导航:首页 > 操作系统 > 1602液晶52单片机左移程序

1602液晶52单片机左移程序

发布时间:2022-05-18 00:44:16

单片机1602液晶怎样移屏怎样设置光标闪烁谁有没有这样的C程序

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar data a[ ]="xian zai shi ";
sbit key0= P2^0;//功能键,对位进行选择
sbit key1=P2^1;// 加位
sbit key2= P2^2;// 减位
sbit EN= P3^4; //读写段
sbit RS= P3^5; //使能端
uchar miao,fen,shi;
uchar gongleng;//功能键中间变量
uchar g,key0sum;
void xunhuan (uint x)
{
int y,z;
for (y=x;y>0;y--)
for (z=120;z>0;z--);
}

void write_e(uchar e ) //写密命
{
RS=0;
P1=e;
xunhuan(5);
EN=1;//给使能端一个高脉冲, 因为上升源完成指令
xunhuan(5);
EN=0; //芯片停止工作
}
void write_f(uchar f) //写操作
{
RS=1;
P1=f;
xunhuan(5);
EN=1;
xunhuan(5);
EN=0;
}

void write_wei(uchar wei, uchar shu ) //一个显示时间,一个现实在液晶屏那个位置
{
uchar shi,ge;
shi=shu/10; //显示两位数的高位
ge=shu%10; // 显示两位数的高低
write_e(0x80+0x40+wei);
write_f(0x30+shi);
write_f(0x30+ge);
}

void init ()
{
EN=0;//使能端
miao=0;
fen=0;
shi=0;
write_e(0x38);
write_e(0x0c);
write_e(0x06);
write_e(0x01);
//write_e(0x80+0x40);
for (g=0;g<16;g++) //显示现在时间
{
write_f(a[g]);
xunhuan(10);
}

write_e(0x80+0x40+6 ); //将要显示的位置
write_f(':');
xunhuan(5);
write_wei(4,shi);// 时的位置

write_e(0x80+0x40+9 );//将要显示的位置
write_f(':');
xunhuan(5);
write_wei(7,fen);//分的位置

TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
}

void keysan() //按键功能端
{
if(key0==0) //判断功能键的按下
{
xunhuan(20);

if(key0==0)
{
(key0sum)++;
while(!key0) ;

if(key0sum==1)
{
TR0=0 ;//关闭定时器终段位
write_e(0x80+0x40+10 );//移动到秒
write_e(0x0f);//光标闪烁,
}
if(key0sum==2)
{
TR0=0 ;//关闭定时器终段位
write_e(0x80+0x40+7 );//移动到分
write_e(0x0f);//光标闪烁,
}

if(key0sum==3)
{
TR0=0 ;//关闭定时器终段位
write_e(0x80+0x40+4 );//移动到时
write_e(0x0f);//光标闪烁,
}
if(key0sum==4)
{
TR0=1 ;//关闭定时器终段位
key0=0 ;//移动到秒
write_e(0x0c);//取消光标闪烁,
}
}
}

/**************/

if (key0!=0 )//判断功能键是否按下去
{
if(key1==0)
{
xunhuan(20);
if(key1==0) //按键的加位
{
while(!key1);
/*********************///秒
if(key0sum==1) //若功能键按下时一次,说明 光标移到秒
{
miao++;
if(miao==60)

miao=0;
write_wei(10,miao);// 将位和数送到秒
write_e(0x80+0x40+10);
}

/***************************/ //分
if(key0sum==2) //若功能键按下时一次,说明移到分
{
fen++;
if(fen==60)

fen=0;
write_wei(7,fen);// 将位和数送到fen
write_e(0x80+0x40+7);
}

/****************/ //时
if(key0sum==3) //若功能键按下时一次,说明移到分
{
shi++;
if(shi==60)

shi=0;
write_wei(4,shi);// 将位和数送到fen
write_e(0x80+0x40+4);
}
}
}
}
}

void main()
{
uint m;
init();
write_e(0x80);
for(m=0;m<16;m++)
{
write_f(a[m]);
xunhuan(5);
}
while(1)
{

keysan();
}

}

void T0_timer () interrupt 1
{

TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
g++;
if(g==20)
{
g=0;
miao++;

if(miao==60)
{
miao=0;
fen++;

if(fen==60)
{
fen=0;
shi++;

if(shi==24)
{
shi=0;
}
write_wei(4,shi);
}
write_wei(7,fen);
}
write_wei(10,miao);

}

}

❷ 关于单片机LCD1602显示内容左右移动的问题

因为涉及到具体的设计问题,我估计很难有人替你指出问题所在,除非有人和你做过一样的设计、犯过一样的错误。只能给你两点建议了:1,仔细阅读DATASHEET;2,仔细审视你的代码。是不是感觉说和没说一个样?呵呵。其实分析问题的心态很重要,镇定~~镇定~~~。

❸ 关于单片机液晶1602的程序片段问题

应该不是判断忙碌或者不只是判断忙碌,这个语句应该是送了一串命令进去
//HD44780 LCD DRIVER

#include <AT89X52.H>
#include <ctype.h>

//LCD Commands
#define LCD_CLS 1 //Clears entire display and sets DDRAM address 0
#define LCD_HOME 2 //Sets DDRAM address 0 in address counter.
#define LCD_SETMODE 4 //Sets cursor move direction and specifies display shift.
#define LCD_SETVISIBLE 8 //Sets entire display (D) on/off,cursor on/off (C), and blinking of cursor position character (B).
#define LCD_SHIFT 16 //Moves cursor and shifts display without changing DDRAM contents.
#define LCD_SETFUNCTION 32 //Sets interface data length (DL), number of display lines (N), and character font (F).
#define LCD_SETCGADDR 64 //Sets CGRAM address.CGRAM data is sent and received after this setting.
#define LCD_SETDDADDR 128 //Sets DDRAM address. DDRAM data is sent and received after this setting.

#define TURE 1
#define FORSE 0
#define TMH 0xf8 //delay timeh 2ms
#define TML 0xCD //delay timel
//------------------------------------------
#define MAX_DISPLAY_CHAR 2
//-----------------------------------------

unsigned char code text[6]="hellow";
static unsigned char data counter,a;

void wcchar(unsigned char d); //write a command char
void wdchar(unsigned char i); //write a data char
char wtbusy(); //wait busy sign
void clrscr(void); //clear screen
void initime0(void); //initial time0
void delay(unsigned char i); //delay

//-------------------------------
unsigned char crc8(unsigned char *pData,unsigned char count);
unsigned char pData[]={0x33,0x12,0x34,0x56,0x78,0x33,0x12,0x23,0x45,0x56};
unsigned char data crc;
static char outputbuffer[MAX_DISPLAY_CHAR];
char *calc_decascii(char num);
//-------------------------------

void ISR_Timer0(void) interrupt 1
{
TL0=TML;
TH0=TMH;
counter--;
}

void ISR_Int0(void) interrupt 0
{

wdchar(text[a++]); //display "hellow"
if (a>=6)
{a=0;wdchar(' ');}
}

//main program display "hellow"

main(void)
{
unsigned char data k;
initime0();
wcchar(0x38); //initial lcd
wcchar(LCD_SETVISIBLE+6); //set lcd visible
clrscr(); //clear lcd

while(1)
{
crc8(&pData,10);
calc_decascii(crc);
wdchar (outputbuffer[1]);
wdchar (outputbuffer[2]);
wdchar (' ');

for(k=0;k<=6;k++)
{
// wdchar(text[k]); //display "hellow"
P1_2=0;
delay(55); //delay
P1_2=1;
delay(55); //delay
}
}
}

//sub function || display a char
void wdchar(unsigned char i) //write a char
{
unsigned char xdata *j;
P1_0=1;
P1_1=0;
j=0x8000;
*j=i;
while (wtbusy())
{}

}

void wcchar(unsigned char d) //write a command char
{
unsigned char xdata *j;
P1_0=0;
P1_1=0;
j=0x8000;
*j=d;
while (wtbusy())
{}
}

char wtbusy() //wait busy sign
{
unsigned char xdata *j;
P1_0=0;
P1_1=1;
j=0x8000;
if(*j&0x80)
{
return TURE;
}
else
{
return FORSE;
}
}

//clear screen
void clrscr()
{
wcchar(LCD_CLS);
}

//initial time0
void initime0()
{
TL0=TML;
TH0=TMH;
TR0=TURE;
IE=0x93; //Enable T0 and Serial Port.
}

//sub function time delay
void delay(unsigned char i)
{
counter=i;
while (counter)
{}
}

unsigned char crc8(unsigned char *pData,unsigned char count)

{
// unsigned char crc;
crc = 0;

while (count-- > 0)

{
crc ^= *pData++;
}
return crc;

}

char *calc_decascii(char num)
// A rather messy function to convert a floating
// point number into an ASCII string.
{ long data temp = num;
char data *arrayptr = &outputbuffer[MAX_DISPLAY_CHAR];
long data divisor = 10;
long data result;
char data remainder,asciival;
int data i;

// If the result of the calculation is zero
// insert a zero in the buffer and finish.
if (!temp)
{ *arrayptr = 48;
goto done;
}
// Handle Negative Numbers.
if (temp < 0)
{ outputbuffer[0] = '-';
temp -= 2*temp;
}

for (i=0 ; i < sizeof(outputbuffer) ; i++)
{ remainder = temp % divisor;
result = temp / divisor;

// If we run off the end of the number insert a space into
// the buffer.
if ((!remainder) && (!result))
{ *arrayptr = ' ';}

// We're in business - store the digit offsetting
// by 48 decimal to account for the ascii value.
else
{ asciival = remainder + 48;
*arrayptr = asciival;
}

temp /= 10;
// Save a place for a negative sign.
if (arrayptr != &outputbuffer[1]) arrayptr--;
}
done: return outputbuffer;
}

❹ 51单片机1602液晶如何让一行移动 一行不动

直接写数据到1602里,数据按照移动方式改变,例如第一次写“abcd”第二次写“ abcd”

❺ 有关单片机1602液晶显示汉字并且右移的题目,急急急!!!!

这个问题并不难,如果你对单片机有点了解的话,看一下1602的说明书就会明白。

下面我给你一个参考程序

#include<reg52.h>

#include<intrins.h>

#defineucharunsignedchar

#defineuintunsignedint

sbitE=P2^7;//1602使能引脚

sbitRW=P2^6;//1602读写引脚,读为高,写位低

sbitRS=P2^5;//1602数据命令选择引脚,数据为高,指令为低

ucharnum;

//延时函数,延时del*1ms

voiddelay(intdel)

{

intx,y;

for(x=0;x<del;x++)

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

}

//写命令

voidwrite_com(ucharcom)

{

P0=com;

RS=0;

RW=0;

E=0;

delay(5);

E=1;

delay(5);

}

//写数据

voidwrite_data(uchardate)

{

P0=date;

RS=1;

RW=0;

E=0;

delay(5);

E=1;

delay(5);

}

/*********************

1602初始化函数

*********************/

voidinit()

{

write_com(0x01);

write_com(0x38);

write_com(0x0c);

write_com(0x06);

write_com(0x80);

}

/********************************************************************

*名称:L1602_string(ucharhang,ucharlie,uchar*p)

*功能:改变液晶中某位的值,如果要让第一行,第五个字符开始显示"abcdef",调用该函数如下

L1602_string(1,5,"abcdef;")

*输入:行,列,需要输入1602的数据

*输出:无

***********************************************************************/

voidwrite_string(ucharhang,ucharlie,uchar*p)

{

uchara;

if(hang==1)a=0x80+0x10;

if(hang==2)a=0xc0+0x10;

a=a+lie-1;

write_com(a);

while(1)

{

if(*p=='')break;

write_data(*p);

delay(20);

p++;

}

}

/***************

主函数

**************/

voidmain()

{

uinti;

init();

write_string(1,1,"NAME:MIKE");//照此输入你想写的数据,注意不得长于16个字符

write_string(2,1,"NUMBER:023");//照此输入你想写的数据,注意不得长于16个字符

for(i=0;i<16;i++)

{

write_com(0x18);

delay(1000);//移动速度调节

}

while(1);

}

程序中是由右向左逐个显示。1602连线如图。

如果不明白程序的意思,推荐一个视频学习。

http://www.txmcu.com/web/viewdownfile.asp?userid=1070303&lanmuid=7418502&contentID=79659

看第十一讲。

❻ 单片机1602液晶用烧写程序烧入程序后,只显示16个方格,如图所示,怎么处理啊

程序肯定是有问题了,现让液晶显示出来内容,这样就说明1602的驱动是对的,
#include<stc.h>#define uchar unsigned char
#define uint unsigned int
uchar code table[]="SHUZILEIDA"; //让液晶显示这两行字
uchar code table1[]="IIS80.COM!";

sbit lcdrs=P1^5; //数据/命令选择端sbit lcdrw=P1^6;
sbit lcden=P1^7; //液晶使能信号

sbit an=P1^0; // 数码管段控制sbit wei=P1^1; // 数码管位控制
sbit rst=P3^4;//DS1302复位端,低电平关闭 uchar num;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void write_com(uchar com) //命令{
lcdrs=0; //选择写命令
P0=com;
delay(5);
lcden=1; //使能信号
delay(5);
lcden=0; //关闭使能
}

void write_data(uchar date) //数据{
lcdrs=1; //选择写数据
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}

void init(){
lcden=0;
write_com(0x38); //00111000 设置16*2显示,5*7点阵 8为数据接口
write_com(0x0c); //00001100 设置开显示,不显示光标
write_com(0x06); // 00000110 写一个字符后地址指针加 1
write_com(0x01); //00000001 显示清0,数据指针清零 /* */

}

void main(){
P0=0XFF;
wei=0;
P0=0X00;
an=0; //关闭数码管

lcdrw=0; //lcd写操作
init();
write_com(0x80+0x10+0x03); // 数据行位置

for(num=0;num<10;num++) {
write_data(table[num]);
delay(20);

}
write_com(0x80+0x40);// 数据行位置 for(num=0;num<10;num++)
{
write_data(table1[num]);
delay(20);
}
/* for(num=0;num<16;num++) //屏幕左移
{
write_com(0x18);
delay(2000);
} */
while(1);
}

❼ 编写51单片机实现液晶上字的循环显示和移动程序

在1602的第一行 循环显示 welcome to china
//用1602循环右移显示"Welcome to China"
#include<reg52.h> //包含单片机寄存器的头文件
#include<intrins.h> //包含_nop_()函数定义的头文件
sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚
sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚
sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚
sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚
unsigned char code string[ ]={"Welcome to China"};
/*****************************************************
函数功能:延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函数功能:延时若干毫秒
入口参数:n
***************************************************/
void delay(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
/*****************************************************
函数功能:判断液晶模块的忙碌状态
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
unsigned char BusyTest(void)
{
bit result;
RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1; //E=1,才允许读写
_nop_(); //空操作
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
result=BF; //将忙碌标志电平赋给result
E=0;
return result;
}
/*****************************************************
函数功能:将模式设置指令或显示地址写入液晶模块
入口参数:dictate
***************************************************/
void WriteInstruction (unsigned char dictate)
{
while(BusyTest()==1); //如果忙就等待
RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
// 就是让E从0到1发生正跳变,所以应先置"0"
_nop_();
_nop_(); //空操作两个机器周期,给硬件反应时间
P0=dictate; //将数据送入P0口,即写入指令或地址
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:指定字符显示的实际地址
入口参数:x
***************************************************/
void WriteAddress(unsigned char x)
{
WriteInstruction(x+0x80); //显示位置的确定方法规定为"80H+地址码x"
}
/*****************************************************
函数功能:将数据(字符的标准ASCII码)写入液晶模块
入口参数:y(为字符常量)
***************************************************/
void WriteData(unsigned char y)
{
while(BusyTest()==1);
RS=1; //RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
// 就是让E从0到1发生正跳变,所以应先置"0"
P0=y; //将数据送入P0口,即将数据写入液晶模块
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:对LCD的显示模式进行初始化设置
***************************************************/
void LcdInitiate(void)
{
delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间
WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
delay(5); //延时5ms
WriteInstruction(0x0f); //显示模式设置:显示开,有光标,光标闪烁
delay(5);
WriteInstruction(0x06); //显示模式设置:光标右移,字符不移
delay(5);
WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除
delay(5);
}
void main(void) //主函数
{
unsigned char i;
LcdInitiate(); //调用LCD初始化函数
delay(10);
while(1)
{
WriteInstruction(0x01);//清显示:清屏幕指令
WriteAddress(0x00); // 设置显示位置为第一行的第5个字
i = 0;
while(string[i] != '\0')
{ // 显示字符
WriteData(string[i]);
i++;
delay(150);
}
for(i=0;i<4;i++)
delay(250);

}

}

❽ 求你89C52单片机流水灯移动的程序 第一次一个LED左移8次,第二次二个LED

#include<reg52.h>
#include<intrins.h>
typedef unsigned int u16;
typedef unsigned char u8;

sbit led=P2;//这里填你LED连接的端口(引脚),不一定是P2,也有可能是P3、P0

void delay(u16 i)
{
while(i--);
}

void shan1()
{
u8 i;
led=0x01;//我默认led输入高电平1是亮,具体按照你实际情况,低电平亮就0xfe;
for(i=0;i<7;i++)//已经点亮一个了,所以剩7个。
{
led=_crol_(led,1);//左移1位
}
led=0x00;
}

void shan2()
{
u8 i;
led=0xc0;//我默认led输入高电平1是亮,具体按照你实际情况
for(i=0;i<6;i++)已经点亮两个个了,所以剩6个。
{
led=_cror_(led,1);//右移一位
delay(1000);
}
led=0x00;
}
void shan2()
{
u8 i;
led=0xc0;//我默认led输入高电平1是亮,具体按照你实际情况
for(i=0;i<6;i++)
{
led=_cror_(led,1);
delay(1000);
}
led=0x00;
}

void main()
{
while(1)
{
shan1();
delay(1000);
shan2();
}
}

❾ 单片机LCD1602液晶显示的汇编程

也没去理解AC,只知道第一行第1点的地址是80H,第二行第1点是C0H。

下面就是你要的程序,仅供参考

RSBITP1.2;这3位是液晶屏的控制信号,连接方式由具体硬件而定

RWBITP1.1

EBITP1.0

ORG00H

AJMPMAIN

ORG30H

MAIN:

movR0,#24

ACALLINITIAL

ACALLDISPLAY;调用液晶显示子程序

AJMPMAIN

;-------液晶显示---------------------------------------

DISPLAY:

MOVA,#80H ;第一行第1个点

ACALLWR_CMD

MOVDPTR,#LINE1

ACALLPR_STR

ACALLWR_DATA

DISP1:

MOVA,#1CH ;字符左移命令(注:实物中左移命令字为18H)

ACALLWR_CMD

ACALLD05S

DJNZR0,DISP1

RET

;---液晶屏初始化-------------------------------------------------

INITIAL:

MOVA,#01H

ACALLWR_CMD

MOVA,#38H

ACALLWR_CMD

MOVA,#0CH

ACALLWR_CMD

MOVA,#06H

ACALLWR_CMD

RET

;----写液晶指令的子程序------------------------------------------

WR_CMD:

MOVP3,A

CLRRS;写入控制命令

CLRRW

CLRE

ACALLDELAY

SETBE

RET

;----写液晶数据---------------------------------------------

WR_DATA:

MOVP3,A

SETBRS;写入数据

CLRRW

CLRE

ACALLDELAY;判断液晶模块是否忙?

SETBE

RET

;-----写行字符---------------------------------------------------------------

PR_STR:

CLR A

MOVCA,@A+DPTR

JZ END_PR

ACALLWR_DATA

INC DPTR

AJMPPR_STR

END_PR:

RET

;----查看液晶忙碌信号---------------------------------------------------------

DELAY:

MOVP3,#0FFH;判断液晶显示器是否忙的子程序

CLRRS

SETBRW

CLRE

NOP

SETBE

JBP3.7,DELAY;如果P3.7为高电平表示忙就循环等待

RET

;----0.5S延时(按12MHZ算)-----------------------------------------------------------------

D05S:

MOVR6,#25

MOVR5,#100

MOVR4,#100

DJNZR4,$

DJNZR5,$-4

DJNZR6,$-8

RET

;--------------------------------------------------------------------------------------

LINE1:

DB'ZHUNIYISHENGPINGAN',00H

阅读全文

与1602液晶52单片机左移程序相关的资料

热点内容
程序的加密文件是哪个 浏览:398
app首屏图一张图怎么做 浏览:497
如何重启数据库服务器 浏览:658
联通程序员发展怎么样 浏览:706
山东省联想服务器供货商云空间 浏览:145
鸿天神尊小说哪个app可以看 浏览:394
做程序员的没朋友吗 浏览:358
阿里云服务器传奇微端 浏览:924
phplinux时间 浏览:449
云服务器20性能 浏览:986
android强制系统横屏 浏览:280
怎么提前看未播出的电视剧app 浏览:666
cad转pdf图层 浏览:600
程序员接私活初级 浏览:434
全无油润滑压缩机 浏览:186
代码加密常用方法 浏览:954
安卓手机如何解除已禁用 浏览:396
算法的随机性 浏览:487
高中解压体育游戏 浏览:533
androidstudior丢失 浏览:345