標(biāo)題:
51單片機(jī)lcd12864半屏顯示程序詳解
[打印本頁]
作者:
hongniu
時(shí)間:
2015-6-23 18:48
標(biāo)題:
51單片機(jī)lcd12864半屏顯示程序詳解
哎!這些日子發(fā)生了很多事,很多人讓我改變看法,也許我也是有點(diǎn)。。。。
真是很郁悶,真的還好有它---------給我挑戰(zhàn),給我動(dòng)力,加油!努力!
這是我一貫的,用笨法子編程,管他那,能用就行 !
128*64的半屏和刷屏程序!
#include<reg51.h>
#define uint unsigned int;
#define uchar unsigned char;
sbit rs=P1^0;//并行模式下為指令數(shù)據(jù)選擇信H/L=指令/數(shù)據(jù)
雖然并不是什么圖,只是很多點(diǎn),但是我知道他意味這什么,
第一幅是在PC上顯示的圖,第二幅是在12864液晶上顯示的圖,也就是如果我ROM足夠大,我可以做視屏,這一點(diǎn)我堅(jiān)信!只是現(xiàn)在我的ROM存儲(chǔ)到?jīng)]有了,所以ROM空間放不下了,我才用了半屏。現(xiàn)在要大ROM也是很簡單的,16K的,64K的,多了,只要有錢!呵呵
sbit rw=P1^1;//并行的讀寫信號(hào)H/L=讀/寫
sbit e=P1^2; //并行下的使能信號(hào)
sbit reset=P1^5;
uchar x,y;//坐標(biāo)
uchar datetabal;
uchar d1,d2;//數(shù)據(jù)緩沖
uchar k=0,h=0;
unsigned int i,j;
uchar code tab[]={/*-- 調(diào)入了一幅圖像:C:\Users\lenovo\Desktop\100001313985056.bmp --*/
/*-- 寬度x高度=128x32 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xE1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x66,0x4A,0xFC,0xEF,0xF5,0x92,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xC6,0x0F,0x99,0x49,0x9D,0x5F,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x8D,0xFD,0x66,0x79,0x67,0x4D,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x19,0x3E,0x96,0x8F,0xCB,0xA9,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x33,0xE9,0xF2,0x60,0xB6,0xFB,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xE7,0xD3,0xFF,0x33,0xED,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x4F,0x4E,0x33,0x93,0x33,0x64,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x7E,0xA6,0xCC,0xD8,0x42,0xAD,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x4C,0x34,0x48,0x46,0x00,0x2A,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x93,0x7E,0x36,0xE9,0xFF,0x64,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x57,0xFF,0xCA,0x26,0x00,0xBB,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xBF,0x4D,0xF1,0x78,0x00,0x2D,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x38,0x05,0xAC,0x73,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFD,0xB4,0xBE,0xBE,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x32,0xB6,0x4F,0xF5,0xFF,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xF6,0x0A,0x6B,0xAA,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x7D,0x4A,0x3E,0x6D,0x9B,0xD5,0x8A,0x45,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xBF,0xAF,0xCC,0xF6,0x50,0x6C,0x77,0xA8,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x76,0x15,0xAF,0x7A,0xAB,0xA7,0x6A,0x13,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x5D,0xAA,0x7F,0xFE,0x5D,0xFF,0x4D,0xD4,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xEC,0x25,0xB3,0xB8,0x5B,0xCF,0xEC,0x2D,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x6F,0xDE,0xB6,0x65,0xFF,0x27,0xF7,0xFC,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xAB,0x2D,0x73,0x7A,0x3E,0x51,0x29,0x9B,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x4B,0xC5,0x5D,0xF3,0xFD,0x4D,0xFC,0xCE,0x00,0x00,0x00,0x00,
};
void delay40ms(void) //誤差 -0.000000000009us
{
unsigned char ad,bd,cd;
for(cd=11;cd>0;cd--)
for(bd=124;bd>0;bd--)
for(ad=12;ad>0;ad--);
}
void delay4_6ms()//
{
unsigned char av,bv;
for(bv=12;bv>0;bv--)
for(av=175;av>0;av--);
}
void delay(void)
{
;;;
}
void writedate(unsigned char a)//寫數(shù)據(jù)
{
delay4_6ms();
rs=1;
delay();
rw=0;
delay();
e=1;
delay();
P0=a;
delay();
e=0;
delay();
}
void writectrl(unsigned char ds)//寫指令
{
rs=0;
delay();
rw=0;
delay();
e=1;
delay();
P0=ds;
delay();
e=0;
delay();
}
void main()
{
reset=0;
delay();
reset=1;
delay40ms();
writectrl(0x3f);//開擴(kuò)充指令操作數(shù)據(jù)位選擇8位
delay4_6ms();
writectrl(0x3e);//寫指令擴(kuò)充指令操作,8位數(shù)據(jù),繪圖開關(guān)關(guān)
delay4_6ms();
// writectrl(0x80);//寫指令設(shè)置 垂直 列地址 Y軸為 “0”
//delay4_6ms();
//writectrl(0x80);//寫指令設(shè)置 水平 行地址 X軸 “0”
//delay4_6ms();
//writedate(0xffff); //數(shù)據(jù)寫入FffFH
//delay4_6ms();
x=0;
y=0;
i=0;
j=0;
for( h=0;h<32;h++ )
{
x=0;
for (k=0;k<8;k++)
{
writectrl((0x80+y));//寫指令設(shè)置 垂直 列地址 Y軸為 “0”
delay4_6ms();
writectrl((0x80+x));//寫指令設(shè)置 水平 行地址 X軸 “0”
delay4_6ms();
writedate(tab[i]); //數(shù)據(jù)寫入FFH
i++;
writedate(tab[i]); //數(shù)據(jù)寫入FFH
delay4_6ms();
i++;
x++;
}
y++;
}
//;***********以上是上半屏(Y=0-1F,X=0-07)以下是下扳平Y(jié)=8-0F X=0-1F********************************
x=0;y=0;
for( h=0;h<32;h++ )
{
x=0;
for (k=0;k<8;k++)
{
writectrl((0x80+y));/:/寫指令設(shè)置 垂直 列地址 Y軸為 “0”
delay4_6ms();
writectrl((0x88+x));//寫指令設(shè)置 水平 行地址 X軸 “0”
delay4_6ms();
writedate(0x00); //數(shù)據(jù)寫入FFH
i++;
writedate(0x00); //數(shù)據(jù)寫入FFH
delay4_6ms();
i++;
x++;
}
y++;
}
while(1); //*******************************************************
//12864到今晚我也成功了,呵呵,我是這樣的:把12864分成兩部分,上半部分12832,下半部分12832
//然后用掃描的辦法從第一行開始掃描,知道32行,在執(zhí)行下半部分掃描程序,第33行開始,掃描32行道64至
//這里還要說一個(gè)事:關(guān)于12864畫圖,你看那大海,水很多,但是它是由一滴滴水組成的,所以要想在12864屏幕上顯示一幅圖像,你就要
//從一個(gè)點(diǎn)開始,第一步我讓第一行的第一列顯示一個(gè)點(diǎn),怎么實(shí)現(xiàn)呢?我開始很是不明白,看了一天的手冊(cè),一下午的實(shí)驗(yàn),終于總結(jié)出
//1:向7920的寫入3F和3E指令,使液晶工作在擴(kuò)展指令狀態(tài),8位數(shù)據(jù),繪圖開關(guān)開2:設(shè)定繪圖RAM地址,先寫入列(Y軸)再寫入行(X軸)
//然后再一口氣寫入16位的數(shù)據(jù),也可以寫8位,但要寫2次,我是采取后者,然后這十六是什么呢?---即這樣的排列D15-D0,讓第一個(gè)點(diǎn)就寫入8000H
//那么,現(xiàn)在就是在第一行第一列顯示一個(gè)點(diǎn)!呵呵,會(huì)寫一個(gè)點(diǎn),你就一定會(huì)寫一幅圖像了,為什么呢,你只要讓單片機(jī)這樣重復(fù)的寫512個(gè)字就是有一幅
//12864的圖像了,這其實(shí)說白了就是點(diǎn)陣啊----------
//呵呵,2010年11月17日 與天津開發(fā)區(qū)第四項(xiàng)目部宿舍,操今天給分包隊(duì)干了一天的活,很郁悶,但是有單片機(jī)真的讓我開心起來
//
//
//
//
//
//
//
///
//***************************************************8
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1