日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

LCD1602液晶顯示帶漢字的萬年歷程序(51單片機(jī))

 昵稱29273511 2015-12-11

#include 'reg51.h'

#define uint unsigned int
#define uchar unsigned char
#define port P0
uchar table[]='I love you!';
uchar table1[]='Shang Hong Rui!';
uchar table2[]='LI ZHEN WEI!' ;
uchar table3[]='> > > > > > > > ';
uchar num;
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
/********************************************
1ms 為基本單位的延時函數(shù)
********************************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/********************************************
讀取lcd1602狀態(tài)
********************************************/
read()
{
uchar temp ;
port=0xff;
rs=0;
rw=1;
e=1;
temp=port;
e=0;
return temp;
}
/********************************************
檢測lcd是否忙碌 小卒整天沒事
********************************************/
void busy()
{
uchar temp;
do
{
temp=read();
}

while((temp&0x80)==0x80);
}
/********************************************
向 lcd 里寫命令
********************************************/
void write_com(uchar com)
{
busy();
//delay(2);
port=com;
//busy();
rs=0;
rw=0;
e=1;
e=0;
}/********************************************
向 lcd 里寫數(shù)據(jù)
********************************************/
void write_data(uchar dat)
{
busy();
//delay(2);
port=dat;
//busy();
rs=1;
rw=0;
e=1;
e=0;
}
/********************************************
初始化lcd
********************************************/
void init()
{
write_com(0x06) ;//顯示地址遞增,即寫一個數(shù)據(jù)后,顯示位置右移一位
write_com(0x0e) ;//開顯示,有光標(biāo),光標(biāo)不閃
write_com(0x38) ;//8位數(shù)據(jù),雙列,5*7字形
write_com(0x01) ;//清屏
}
/**********************************************
主程序 實現(xiàn)顯示
***********************************************/
main()
{
init();
write_com(0x80+0x02);
for(num=0;num<11;num++)
{
write_data(table[num]);
delay(150);
}
//busy();
write_com(0x80+0x40);


for(num=0;num<15;num++)
{
write_data(table1[num]);
delay(150);
}


write_com(0x01); //清屏
write_com(0x80+0x15);
for(num=0;num<12;num++)
{
write_data(table2[num]);
delay(5);
}


for(num=0;num<20;num++)
{
//write_com(0x1c) ; //顯示地址遞增,即寫一個數(shù)據(jù)后,顯示位置右移一位 整屏向左移動
write_com(0x18) ; //顯示地址遞增,即寫一個數(shù)據(jù)后,顯示位置右移一位 整屏向右移動
delay(120);
}
//busy();
delay(50);
write_com(0x01); //清屏
write_com(0x80+0x54);
for(num=0;num<16;num++)
{
write_data(table3[num]);
delay(5);
}

for(num=0;num<20;num++)
{
//write_com(0x1c) ; //顯示地址遞增,即寫一個數(shù)據(jù)后,顯示位置右移一位 整屏向左移動
write_com(0x18) ; //顯示地址遞增,即寫一個數(shù)據(jù)后,顯示位置右移一位 整屏向右移動
delay(120);
}
delay(50);
write_com(0x01); //清屏
write_com(0x80+0x15);
for(num=0;num<12;num++)
{
write_data(table2[num]);
delay(5);
}
write_com(0x80+0x54);
for(num=0;num<16;num++)
{
write_data(table3[num]);
delay(5);
}

for(num=0;num<19;num++)
{
write_com(0x1c) ; //顯示地址遞增,即寫一個數(shù)據(jù)后,顯示位置右移一位 整屏向左移動
//write_com(0x18) ; //顯示地址遞增,即寫一個數(shù)據(jù)后,顯示位置右移一位 整屏向右移動
delay(120);
}
while(1);
}

/*0000000000000000000000000000000000000000000000000000000000000

0000000000000000000000000000000000000000000000000000000000000*/

#include 'reg51.h'
#define uchar unsigned char
#define uint unsigend int
#define port P0
uchar table[]='0123456789';
uchar miaog=0,miaos=1,feng=1,fens=1,shig=1,shis=1;
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;

/***********************************
***00000 5*7 -> 0xff
*****0** /5*8 0x40
*****0** 0x40 ----> I
*****0** 0x40 ---->
*****0** 0x40
*****0** 0x40
***00000 0x1f
添加自己的自定義字符
***********************************/
code uchar ziku[]=
{
0x0f,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00, //漢字“日”
0x0F,0x09,0x0F,0x09,0x0F,0x09,0x11,0x00, //漢字“月”
0x01,0x02,0x03,0x05,0x09,0x03,0x00,0x00, //漢字“年”左半部
0x00,0x00,0x1e,0x08,0x08,0x1e,0x08,0x08 //漢字“年”右半部
};

/*******************************
讀取lcd1602狀態(tài)
*******************************/
uchar lcd_readcom()
{
uchar temp;
e=0;
port=0xff;
rs=0;
rw=1;
e=1;
temp=port;
e=0;
return temp;
}
/***************************************
檢測 lcd 是否忙碌 小卒整天沒事
***************************************/
check_busy()
{
uchar temp;
do{
temp=lcd_readcom();
}while((temp&0x80)==0x80);
}
/*****************************************
向lcd里寫命令
*****************************************/
void lcd_writecom(uchar dat)
{
check_busy();
e=0;
port=dat;
rs=0;
rw=0;
e=1;
e=0;
}
/***************************************
讀取lcd對應(yīng)地址數(shù)據(jù)
*****************************************/
uchar lcd_readdat()
{
uchar temp;
check_busy();
e=0;
port=0xff;
rs=1;
rw=1;
e=1;
temp=port;
e=0;
return temp;
}
/****************************************
向lcd里寫數(shù)據(jù)
****************************************/
void lcd_writedat(uchar dat)
{
check_busy();
e=0;
port=dat;
rs=1;
rw=0;
e=1;
e=0;
}
/****************************************
向lcd寫字符串
*****************************************/
void lcd_gets(char *dat)
{
while(*dat!=0)
{

lcd_writedat(*dat);
dat++;
}
}
/*****************************************
確定要寫的位子即x y 坐標(biāo)
******************************************/
void lcd_xy(uchar x,uchar y)
{
switch(y)
{
case 0:lcd_writecom(0x80+x);break;//第一行第X個位置
case 1:lcd_writecom(0xc0+x);break;//0xc0==0x80+0x50 第二行第X個位置
case 2:lcd_writecom(0x94+x);break;//
case 3:lcd_writecom(0xd4+x);break;//4*20
}
}
/****************************************************
單行顯示才有5*10 其他5*8 MODE=1 5*8 MODE=0 5*10
****************************************************/
add_custom_word(uchar *dat,uchar len,uchar mode)
{
uchar n,m;
for(n=0;n<len;n++)
{
if(mode)
{
lcd_writecom(0x40+8*n);
for(m=0;m<8;m++)
{
lcd_writedat(*dat);
dat++;
}
}
else
{
lcd_writecom(0x40+10*n);
for(m=0;m<10;m++)
{
lcd_writedat(*dat);
dat++;
}
}
}
}
/********************************************
初始化lcd
********************************************/
void lcd_init()
{
lcd_writecom(0x01) ;//清屏
lcd_writecom(0x03) ;
lcd_writecom(0x3c) ;
lcd_writecom(0x40) ;
lcd_writecom(0x0c) ;
add_custom_word(ziku,4,1); //初始化自定義字符
}
/********************************************
1ms 為基本單位的延時函數(shù)
********************************************/
void delay(uchar z)
{
uchar x,y,a;
for(x=z;x>0;x--)
for(y=110;y>0;y--)
for(a=1;a>0;a--) ;
}

/**********************************************
主程序 實現(xiàn)顯示
***********************************************/
main()
{
lcd_init();

//lcd_xy(0,0);
//lcd_gets(' I LOVE YOU');
//lcd_xy(0,1);
//lcd_gets('Shang Hong Rui');
lcd_xy(2,0) ;
lcd_gets('2011');
lcd_xy(6,0) ;
lcd_writedat(2);
lcd_xy(7,0);
lcd_writedat(3);
lcd_xy(8,0) ;
lcd_gets('03');
lcd_xy(10,0);
lcd_writedat(1);
lcd_xy(11,0) ;
lcd_gets('06');
lcd_xy(13,0);
lcd_writedat(0);

lcd_xy(3,1) ;
lcd_gets('0');
lcd_xy(4,1) ;
lcd_gets('0');
lcd_xy(5,1) ;
lcd_gets(':');
lcd_xy(6,1) ;
lcd_gets('0');
lcd_xy(7,1) ;
lcd_gets('0');
lcd_xy(8,1) ;
lcd_gets(':');
lcd_xy(9,1) ;
lcd_gets('0');
lcd_xy(10,1) ;
lcd_gets('0');

while(1)
{

//for(m=0;m<10;m++)
lcd_xy(10,1);
lcd_writedat(table[miaog]); //秒個位
delay(1000);
miaog++;

if(miaog==10)
{
miaog=0;
lcd_xy(9,1);
lcd_writedat(table[miaos]); //秒十位
miaos++;
if(miaos==6)
{

miaos=0;
lcd_xy(7,1);
lcd_writedat(table[feng]); //分個位
feng++;
if(feng==10)
{
feng=0;
lcd_xy(6,1);
lcd_writedat(table[fens]); //分十位
fens++;
if(fens==6)
{
fens=0;
lcd_xy(4,1);
lcd_writedat(table[shig]); //時個位
shig++;
if(shig==10)
{
shig=0;
lcd_xy(3,1);
lcd_writedat(table[shis]); //時十位
shis++;
if(shis==6)
{
shis=0;
}

}
}
}
}
}
}

//lcd_xy(0,0);
//lcd_writedat(0);//自定義字符使用,0表示第一個字 ,1表示第二個字,依此類推
//lcd_xy(15,0);
//lcd_writedat(3); //自定義字符使用

}

第二段程序為借用別人的,呵呵


限時干貨下載:關(guān)注我們“單片機(jī)”,回復(fù)“教程”獲取單片機(jī)電子書,回復(fù)“仿真”獲取Proteus仿真資料。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多