摸索了好幾天,終于把普中16個管腳的12864使用起來了。
不僅管腳排列與20腳的不一樣,而且命令也不一樣,關鍵是初始化命令
以下是我結合普中的例程寫的,請大家參考:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code dis1[]=
{
0x40,0x44,0x54,0x54,0x54,0x54,0x54,0x7F,0x54,0x54,0x54,0x54,0x54,0x44,0x40,0x00,//青
0x00,0x00,0x00,0xFF,0x15,0x15,0x15,0x15,0x15,0x55,0x95,0x7F,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xFC,0x04,0x04,0x16,0x25,0x04,0x24,0x44,0x3C,0x00,0x00,0x00,0x00,//島
0x00,0x00,0x1C,0x11,0x11,0x11,0x1F,0x11,0x11,0x11,0x5D,0x81,0x41,0x3F,0x00,0x00,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,//大
0x80,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x03,0x0C,0x10,0x20,0x40,0x80,0x80,0x00,
0x40,0x30,0x11,0x96,0x90,0x90,0x91,0x96,0x90,0x90,0x98,0x14,0x13,0x50,0x30,0x00,//學
0x04,0x04,0x04,0x04,0x04,0x44,0x84,0x7E,0x06,0x05,0x04,0x04,0x04,0x04,0x04,0x00,
0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00,//電
0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x7F,0x88,0x88,0x88,0x88,0x9F,0x80,0xF0,0x00,
0x80,0x82,0x82,0x82,0x82,0x82,0x82,0xE2,0xA2,0x92,0x8A,0x86,0x82,0x80,0x80,0x00,//子
0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x40,0x30,0x11,0x96,0x90,0x90,0x91,0x96,0x90,0x90,0x98,0x14,0x13,0x50,0x30,0x00,//學
0x04,0x04,0x04,0x04,0x04,0x44,0x84,0x7E,0x06,0x05,0x04,0x04,0x04,0x04,0x04,0x00,
0x00,0x00,0x22,0x32,0x2A,0xA6,0xA2,0x62,0x21,0x11,0x09,0x81,0x01,0x00,0x00,0x00,//系
0x00,0x42,0x22,0x13,0x0B,0x42,0x82,0x7E,0x02,0x02,0x0A,0x12,0x23,0x46,0x00,0x00,
};
sbit wr=P2^7; //wr=1 從LCD讀出
sbit rs=P2^6; //rs=0 命令,rs=1數據
sbit rd=P2^5; //rd=1 往LCD寫入
sbit cs=P3^2; //片選信號,低電平有效
sbit reset=P3^3;
uchar a;
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
cs=0;
rd=1; //讀禁用
rs=0; //選用命令
wr=0;
delay(1);
P0=com;
delay(1);
wr=1; //寫入命令
}
void write_date(uchar date)
{
cs=0;
rd=1;
rs=1; //選用數據
wr=0;
delay(1);
P0=date;
delay(1);
wr=1;
}
void init()
{
reset=0;
delay(1);
cs=0;
reset=1;
delay(10);
write_com(0xe2); //軟件初始化
delay(10);
write_com(0xa0); //表格第8個命令,設置顯示方向(左右),A1為反向顯示,A0為正常顯示
delay(10);
write_com(0xc8); //表格第15個命令,設置顯示方向(上下),C8為反向顯示,C0為正常顯示
delay(10);
write_com(0xa6); //表格第9個命令,A6黑字白底,A7白字黑底
delay(10);
write_com(0xa4); //表格第10個命令,A4正常顯示,A5像素全開
delay(10);
write_com(0xa2); //第11個命令,a3偏壓為1/7,a2偏壓為1/9
delay(10);
write_com(0xf8);
write_com(0xf1); //第19個命令,雙字節命令,0xf800增壓為4x,f801為5x,效果差不多
delay(10);
write_com(0x81);
write_com(0x23); //第18個命令,設置背光對比度,范圍0x00到0x3f
delay(10);
write_com(0x25); //第17個命令,選擇調節電阻率
delay(10);
write_com(0x2f); //第16個命令,電源設置
delay(10);
write_com(0x40); //第2個命令,設置顯示開始位置
delay(10);
write_com(0xaf); //第一個命令,開啟顯示
}
void clearscreen()
{
uchar i,j;
for(i=0;i<8;i++)
{
write_com(0xb0+i); //設置page,共8個page,每個page 8行
write_com(0x10); //設置x軸
write_com(0x04);
for(j=0;j<128;j++)
write_date(0x00); //向每個點中填入數據
}
}
void writechar(uchar x, uchar y,uchar num)
{
uchar j,x1,x2,y1,wordnum;
for(wordnum=0;wordnum<=num;wordnum++)
{
y1=y+0xb0;
write_com(y1);
x1 = (x >> 4) & 0x0F;
x2 = x & 0x0F;
write_com(0x10+x1);
write_com(0x40+x2);
j=0;
for(j=0;j<32;j++)
{
if(j==16)
{
write_com(y1+1);
write_com(0x10+x1);
write_com(0x40+x2);
}
write_date(dis1[j+32*wordnum]);
}
x=x+16;
}
}
void main()
{
init();
delay(10);
clearscreen();
while(1)
{
writechar(0,2,7);
delay(100);
}
}
|