導航:首頁 > 操作系統 > 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單片機左移程序相關的資料

熱點內容
貴州雲伺服器屬於哪個上市公司 瀏覽:58
編程聯動教程 瀏覽:480
小天才app怎麼升級v242 瀏覽:544
簡單手工解壓玩具製作大全 瀏覽:927
免費編程電子書 瀏覽:869
想玩游戲什麼app最合適 瀏覽:560
安卓手機如何用airportspro 瀏覽:449
怎麼清理idea編譯緩存 瀏覽:951
鏡頭app怎麼推廣 瀏覽:437
什麼app隨便看電視劇 瀏覽:307
2021程序員薪酬 瀏覽:708
糖豆廣場怎麼下載app 瀏覽:213
qtvs2019選哪個編譯器 瀏覽:124
壓縮空氣管能焊嗎 瀏覽:284
linux中yum命令 瀏覽:397
在職演算法工程師 瀏覽:706
電碼加密函數方法有幾種 瀏覽:803
後綴是pdf 瀏覽:720
pr導出壓縮 瀏覽:32
命令語氣 瀏覽:245