|
時(shí)鐘+滾屏+lcd12864+stc12c5a60s2
#include "AT89X52.H"
//#include <intrins.h>
//#include <stdio.h>
#define uchar unsigned char
#define Fisrt_Addr 0 //定義字符/漢字顯示起始位置
typedef unsigned char uint8;
sbit LCD_RS=P1^0;
sbit LCD_RW=P1^1;
sbit LCD_E=P1^2;
sbit PCB=P1^3;
uchar i,j;
uint8 AC_TABLE[]={
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, //第一行漢字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, //第二行漢字位置
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, //第三行漢字位置
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, //第四行漢字位置
};
void delay(int ms)
{
while(ms--)
{
for(j=0;j<120;j++);
}
}
bit lcd_busy()
{
bit result;
LCD_RS=0;
LCD_RW=1;
LCD_E= 1;
result=(bit)(P0&0x80);
LCD_E=0;
return result;
}
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS=0;
LCD_RW=0;
LCD_E=0;
P0=cmd;
LCD_E=1;
LCD_E=0;
}
void lcd_wdata(uchar dat)
{
while(lcd_busy());
LCD_RS=1;
LCD_RW=0;
LCD_E=0;
P0=dat ;
LCD_E=1;
LCD_E=0;
}
void lcd_initial()
{
lcd_wcmd(0x30);
delay(1);
lcd_wcmd(0x0C); //開(kāi)顯示,關(guān)光標(biāo),不閃爍
delay(1);
lcd_wcmd(0x06);//指定在資料寫入或讀取時(shí),光標(biāo)的移動(dòng)方向
delay(1);
lcd_wcmd(0x01);
delay(10); //這里要延時(shí)長(zhǎng)一點(diǎn),否側(cè)會(huì)影響下面的操作
}
/*------------------清屏命令--------------------------*/
void Clr_Screen()
{
lcd_wcmd(0x30);//考慮到前面出現(xiàn)0x34
lcd_wcmd(0x01);
delay(10);
}
/*------------------整屏寫入數(shù)據(jù):全亮,或者豎條-----------------------------*/
//先寫0x34關(guān)繪圖,寫地址數(shù)據(jù),0x360x繪圖
void Lcd_Fill(uchar disdata)
{
uchar x,y; //參考PDF寫GDRAM的步驟,顯示坐標(biāo)
for(y=0;y<32;y++)
for(x=0;x<16;x++)
{
lcd_wcmd(0x34);
lcd_wcmd(y+0x80); //行地址
lcd_wcmd(x+0x80); //列地址
lcd_wdata(disdata);
lcd_wdata(disdata);
lcd_wcmd(0x36);
}
lcd_wcmd(0x30);//考慮到前面出現(xiàn)0x34
}
/*------------------顯示字符串--------------------------*/
void Zi_FU(uchar code *s)
{
while(*s!=0)
{
lcd_wdata(*s);
s++;
delay(10);
}
}
//注意:中文顯示時(shí)空格符或數(shù)字ASCII碼必需兩個(gè)一起用,標(biāo)點(diǎn)符號(hào)注意中英文
void intruction()
{
Clr_Screen() ;
lcd_wcmd(0x80);//第一行(如果是地址是:80H,即LCD的第一行的第一個(gè)位置顯示)
Zi_FU("我真的很愛(ài)你");
lcd_wcmd(0x90);//第二行(如果是地址是:90H,即LCD的第二行的第一個(gè)位置顯示)
Zi_FU("很在乎很在乎你 ");
lcd_wcmd(0x88);//第三行(如果是地址是:88H,即LCD的第二行的第一個(gè)位置顯示)
Zi_FU("我把我的心交給你");
lcd_wcmd(0x98);//第四行(如果是地址是:98H,即LCD的第二行的第一個(gè)位置顯示)
Zi_FU("想你啦");
delay(1000);
}
void feeling1()
{
lcd_wcmd(0x30);
Zi_FU("我真的很愛(ài)你");
delay(300);
lcd_wcmd(0x90+Fisrt_Addr);
Zi_FU("很在乎很在乎你 ");
delay(300);
lcd_wcmd(0x88+Fisrt_Addr);
Zi_FU("我把我的心交給你");
delay(300);
lcd_wcmd(0x98+Fisrt_Addr);
delay(500);
Zi_FU("想你哦");
}
/*------------------顯示圖片---------------------------*/
void Disp_Img(uchar code *bmp)
{
uchar count=2,X=0x80;
lcd_wcmd(0x34); //擴(kuò)展指令
lcd_wcmd(0x36); //打開(kāi)繪圖
for(;count>0;count--)
{
for(i=0;i<32;i++)
{
lcd_wcmd(0x80|i);
lcd_wcmd(X); //X地址坐標(biāo),自動(dòng)加1.
for(j=0;j<16;j++) //16*8=128
lcd_wdata(*bmp++);
}
X=0x88;//下半屏
}
}
/*********************************************
函數(shù)名稱:去字摸函數(shù) ,取模方式是橫向,順序
函數(shù)功能:
**********************************************/
void ZK(uchar *zk)
{
uchar i, j;
for(j=0;j<16;j++)
{
lcd_wcmd(0x34); //擴(kuò)展指令
lcd_wcmd(0x36); //打開(kāi)繪圖
lcd_wcmd(0x80|j);
lcd_wcmd(0x80) ;//X地址坐標(biāo),自動(dòng)加1.
for(i=0;i<2;i++)
{
lcd_wdata(*zk++);
}
}
}
/*********************************************
函數(shù)名稱: 向某一行寫字符
函數(shù)功能:
**********************************************/
void Lcd_Write_Poss(uchar x,uchar y,uchar *ZiFu)
{
uchar addr,i=0;
if(x==1)addr=0x80;
if(x==2)addr=0x90;
if(x==3)addr=0x88;
if(x==4)addr=0x98;
addr=addr+y;
lcd_wcmd(0x30);
lcd_wcmd(addr);
while(*ZiFu!='\0')
{
lcd_wdata(*ZiFu++);
}
}
void main()
{
PCB=1;
while(1)
{
lcd_initial();
delay(1000);
Clr_Screen();
feeling1();
delay(3000);
for(i=8;i>0;i--)
{
lcd_wcmd(0x18); //一二行與三四行調(diào)換了,液晶分為上下兩個(gè)半屏,
delay(1000); //有時(shí)會(huì)亂,與上面程序有關(guān),要加lcd_wcmd(0x30), clrscreen();
}
Clr_Screen(); //清屏
feeling1();
lcd_wcmd(0x34);
lcd_wcmd(0x04); //0X04第一行和第三行反白顯示,
delay(3000); //0X05第二行和第四行反白顯示,與PDF不符
lcd_wcmd(0x04); //恢復(fù)正常
delay(3000);
lcd_wcmd(0x34);
lcd_wcmd(0x03); //允許輸入滾動(dòng)地址
for(i=0x40;i<0x7f;i++)
{
lcd_wcmd(i); //垂直滾動(dòng)屏幕的內(nèi)容
delay(500);
}
}
}
|
評(píng)分
-
查看全部評(píng)分
|