從網上下載了個無字庫12864顯示程序,但是但是斷電送電后程序不顯示,有時候剛下載能顯示,再下載進去就不顯示,怪了。
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define Port P0 //LCD12864數據線
sbit RS=P1^0; // 數據\指令 選擇
sbit RW=P1^1; // 讀\寫 選擇
sbit EN=P1^2; // 讀\寫使能
sbit cs1=P1^6; // 片選1
sbit cs2=P1^7; // 片選2
/********************************/
/* 定義中文字庫 */
/********************************/
uchar code Hzk[]={
/*-- 文字: 各 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x20,0x20,0x10,0x08,0x8F,0xB4,0x44,0x44,0xA4,0x9C,0x04,0x00,0x00,0x00,0x00,
0x02,0x02,0x02,0x01,0x7F,0x42,0x42,0x42,0x42,0x42,0x42,0x7F,0x01,0x03,0x01,0x00,
/*-- 文字: 位 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0xC0,0x30,0xEC,0x03,0x2A,0xC8,0x09,0x0A,0x0E,0x08,0xE8,0x48,0x08,0x00,0x00,
0x01,0x00,0x00,0x7F,0x20,0x20,0x20,0x27,0x20,0x30,0x2E,0x21,0x20,0x20,0x20,0x00,
/*-- 文字: 單 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x00,0xF8,0x28,0x29,0x2E,0x2A,0xF8,0x28,0x2C,0x2B,0x2A,0xF8,0x00,0x00,0x00,
0x08,0x08,0x0B,0x09,0x09,0x09,0x09,0xFF,0x09,0x09,0x09,0x09,0x0B,0x08,0x08,0x00,
/*-- 文字: 機 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x08,0x08,0xC8,0xFF,0x48,0x88,0x08,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,
0x04,0x03,0x00,0xFF,0x00,0x41,0x30,0x0C,0x03,0x00,0x00,0x00,0x3F,0x40,0x78,0x00,
/*-- 文字: 愛 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x40,0xB2,0x96,0x9A,0x92,0xF6,0x9A,0x93,0x91,0x99,0x97,0x91,0x90,0x30,0x00,
0x40,0x20,0xA0,0x90,0x4C,0x47,0x2A,0x2A,0x12,0x1A,0x26,0x22,0x40,0xC0,0x40,0x00,
/*-- 文字: 好 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x10,0x10,0xF0,0x1F,0x10,0xF0,0x80,0x82,0x82,0x82,0xF2,0x8A,0x86,0x82,0x80,0x00,
0x80,0x43,0x22,0x14,0x0C,0x73,0x20,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: 者 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x20,0x24,0x24,0x24,0x24,0xA4,0xBF,0x64,0x24,0x34,0x28,0x26,0x24,0x20,0x00,
0x04,0x04,0x04,0x02,0x02,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,
/*-- 文字: 你 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x80,0x40,0xF0,0x2C,0x43,0x20,0x98,0x0F,0x0A,0xE8,0x08,0x88,0x28,0x1C,0x08,0x00,
0x00,0x00,0x7F,0x00,0x10,0x0C,0x03,0x21,0x40,0x3F,0x00,0x00,0x03,0x1C,0x08,0x00,
/*-- 文字: 們 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x80,0x40,0xF0,0x1C,0x03,0xF0,0x01,0x0E,0x04,0x00,0x04,0x04,0x04,0xFC,0x00,0x00,
0x00,0x00,0x7F,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x20,0x40,0x3F,0x00,0x00,
/*-- 文字: 辛 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x80,0x84,0x84,0x94,0xA4,0xC4,0x85,0x86,0x84,0xC4,0xA4,0x94,0x84,0x84,0x80,0x00,
0x00,0x04,0x04,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x00,
/*-- 文字: 苦 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x40,0x44,0x44,0x44,0x44,0x5F,0x44,0xF4,0x44,0x44,0x5F,0x44,0x44,0x44,0x44,0x00,
0x00,0x00,0x00,0x7E,0x22,0x22,0x22,0x23,0x22,0x22,0x22,0x7E,0x00,0x00,0x00,0x00,
/*-- 文字: 了 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x02,0x02,0x02,0x02,0x02,0x02,0xF2,0x12,0x0A,0x0A,0x06,0x06,0x02,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: 希 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x20,0x20,0x30,0x30,0xA9,0x6A,0x3A,0x24,0xE4,0x2A,0x29,0x30,0x20,0x20,0x20,0x00,
0x08,0x04,0x02,0x01,0x3F,0x01,0x01,0x01,0xFF,0x01,0x21,0x61,0x3F,0x00,0x00,0x00,
/*-- 文字: 望 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x04,0x04,0xFC,0x85,0x46,0x24,0x04,0x80,0x7E,0x2A,0x2A,0xAA,0xAA,0xFE,0x00,0x00,
0x00,0x40,0x42,0x4A,0x4A,0x4A,0x4A,0x7E,0x4A,0x4A,0x4A,0x4A,0x4A,0x42,0x40,0x00,
/*-- 文字: 大 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x7F,0xA0,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x01,0x06,0x08,0x30,0x60,0xC0,0x40,0x00,
/*-- 文字: 家 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x18,0x04,0x14,0x94,0x94,0xD5,0xB6,0x14,0x14,0x94,0x04,0x14,0x0C,0x04,0x00,
0x00,0x29,0x29,0x15,0x14,0x4A,0x89,0x44,0x3F,0x06,0x09,0x09,0x10,0x30,0x10,0x00,
/*-- 文字: 能 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x10,0xB8,0x97,0x92,0x90,0x94,0xB8,0x10,0x00,0x7F,0x48,0x48,0x44,0x74,0x20,0x00,
0x00,0xFF,0x0A,0x0A,0x4A,0x8A,0x7F,0x00,0x00,0x3F,0x44,0x44,0x42,0x72,0x20,0x00,
/*-- 文字: 多 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x00,0x00,0x20,0x90,0x88,0x54,0x53,0xA2,0x22,0x12,0x0A,0x06,0x00,0x00,0x00,
0x00,0x81,0x89,0x89,0x44,0x44,0x42,0x25,0x29,0x11,0x11,0x09,0x05,0x03,0x01,0x00,
/*-- 文字: 多 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x00,0x00,0x20,0x90,0x88,0x54,0x53,0xA2,0x22,0x12,0x0A,0x06,0x00,0x00,0x00,
0x00,0x81,0x89,0x89,0x44,0x44,0x42,0x25,0x29,0x11,0x11,0x09,0x05,0x03,0x01,0x00,
/*-- 文字: 交 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x08,0x88,0x48,0x38,0x28,0x09,0x0E,0x0C,0x08,0x98,0x28,0x68,0x48,0x08,0x00,
0x00,0x80,0x80,0x40,0x41,0x22,0x14,0x18,0x0C,0x16,0x23,0x61,0xC0,0x40,0x00,0x00,
/*-- 文字: 流 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x10,0x60,0x01,0x86,0x60,0x04,0x44,0x64,0x55,0x4E,0x44,0x64,0xC4,0x04,0x04,0x00,
0x04,0x04,0xFC,0x03,0x40,0x30,0x0F,0x00,0x00,0x7F,0x00,0x3F,0x40,0x40,0x70,0x00,
/*-- 文字: 學 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x40,0x30,0x10,0x12,0x5C,0x54,0x50,0x51,0x5E,0xD4,0x50,0x18,0x57,0x32,0x10,0x00,
0x00,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x00,
/*-- 文字: 習 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x00,0x02,0x02,0x0A,0x12,0x22,0x62,0x02,0x82,0x82,0x42,0x02,0xFE,0x00,0x00,
0x00,0x00,0x04,0x0C,0x04,0x02,0x02,0x01,0x01,0x00,0x20,0x40,0x80,0x7F,0x00,0x00,
/*-- 文字: 24 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
/****************************************/
/* 定義ASCII字庫8列*16行 */
/****************************************/
uchar code Ezk[]={
/*-- 文字: Q --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,
/*-- 文字: Q --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,
/*-- 文字: 3 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: 4 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
/*-- 文字: 5 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: 4 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
/*-- 文字: 1 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
/*-- 文字: 5 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: 2 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
/*-- 文字: 4 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
/*-- 文字: 4 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
/*-- 文字: --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
/*狀態檢查,LCD是否忙*/
void Checkbusy()
{
uchar dat;//狀態信息(判斷是否忙)
RS=0; // 數據\指令選擇,D/I(RS)=“L” ,表示 DB7∽DB0 為顯示指令數據
RW=1; //R/W=“H” ,E=“H”數據被讀到DB7∽DB0
do{
Port=0x00;
EN=1; //EN下降源
_nop_(); //一個時鐘延時
dat=Port;
EN=0;
dat=(0x80 & dat);
}while(!(dat==0x00)); //僅當第7位為0時才可操作(判別busy信號)
}
/*寫命令到LCD中*/
Wcmd(uchar cmd)
{
Checkbusy();//狀態檢查,LCD是否忙
RS=0; //向LCD發送命令。RS=0寫指令,RS=1寫數據
RW=0;//R/W=“L” ,E=“H→L”數據被寫到 IR 或 DR
Port=cmd; //com :命令
EN=1;//EN下降源
_nop_();
_nop_();
EN=0;
}
/*設置頁 0xb8是頁的首地址*/
void Setpage(uchar page)
{
page=0xb8|page; //1011 1xxx 0<=page<=7 設定頁地址--X 0-7,8行為一頁64/8=8,共8頁
Wcmd(page);
}
/*設定顯示開始行,0xc0是行的首地址*/
void Setx(uchar x)
{
x=0xc0|x; //1100 0000
Wcmd(x); //設置從哪行開始:0--63,一般從0 行開始顯示
}
/*設定列地址--Y 0-63 ,0x40是列的首地址*/
void Sety(uchar y)
{
y=y&0x3f; //column最大值為64,越出 0=<column<=63
y= 0x40|y; //01xx xxxx
Wcmd(y);
}
/*開關顯示,0x3f是開顯示,0x3e是關顯示*/
void SetOnOff(uchar onoff)
{
onoff=0x3e|onoff; //0011 111x,onoff只能為0或者1
Wcmd(onoff);
}
/*寫顯示數據 */
void Writedata(uchar dat)
{
Checkbusy();//狀態檢查,LCD是否忙
RS=1; //RS=0寫指令,RS=1寫數據
RW=0;////R/W=“L” ,E=“H→L”數據被寫到 IR 或 DR
Port=dat;//dat:顯示數據
EN=1; //EN下降源
_nop_();
_nop_();
EN=0;
}
/*選擇屏幕screen: 0-全屏,1-左屏,2-右屏*/
void SelectScreen(uchar screen)
{
switch(screen)
{ case 0: cs1=0;//全屏
_nop_(); _nop_(); _nop_();
cs2=0;
_nop_(); _nop_(); _nop_();
break;
case 1: cs1=0;//左屏
_nop_(); _nop_(); _nop_();
cs2=1;
_nop_(); _nop_(); _nop_();
break;
case 2: cs1=1;//右屏
_nop_(); _nop_(); _nop_();
cs2=0;
_nop_(); _nop_(); _nop_();
break;
}
}
/*清屏screen: 0-全屏,1-左屏,2-右*/
void ClearScreen(uchar screen)
{
uchar i,j;
SelectScreen(screen);
for(i=0;i<8;i++) //控制頁數0-7,共8頁
{
Setpage(i);
Sety(0);
for(j=0;j<64;j++) //控制列數0-63,共64列
{
Writedata(0x00); //寫點內容,列地址自動加1
}
}
}
/*延時程序*/
void delay(uint z)
{
uint i,j;
for(i=0; i<z; i++)
for(j = 0; j < 110; j++);
}
/*向上滾屏*//*這里用做滾動顯示*/
/*void lcd_rol()
{
uint i;
for(i = 0; i < 64; i++)
{
cs1=0; // 片選1
SendCommandToLCD(0xc0+i);
cs1=1;
cs2=0;// 片選2
SendCommandToLCD(0xc0+62-i);
cs2=0; // 片選2
delay(6);
}
}
*/
/*初始化LCD*/
void InitLCD()
{
Checkbusy();
SelectScreen(0);
SetOnOff(0); //關顯示
SelectScreen(0);
SetOnOff(1); //開顯示
SelectScreen(0);
ClearScreen(0);//清屏
Setx(0); //開始行:0
}
/*顯示全角漢字*/
void Display(uchar ss,uchar page,uchar y,uchar number)
{
int i; //選屏參數,pagr選頁參數,column選列參數,number選第幾漢字輸出
SelectScreen(ss);
y=y&0x3f;
Setpage(page); //寫上半頁
Sety(y); //控制列
for(i=0;i<16;i++) //控制16列的數據輸出
{
Writedata(Hzk[i+32*number]); //i+32*number漢字的前16個數據輸出
}
Setpage(page+1); //寫下半頁
Sety(y); //控制列
for(i=0;i<16;i++) //控制16列的數據輸出
{
Writedata(Hzk[i+32*number+16]); //i+32*number+16漢字的后16個數據輸出
}
}
/*顯示半角漢字和數字和字母*/
void Displayen(uchar ss,uchar page,uchar y,uchar number)
{
uint i;//選屏參數,pagr選頁參數,column選列參數,number選第幾漢字輸出
SelectScreen(ss);
y=y&0x3f;
Setpage(page); //寫上半頁
Sety(y);
for(i=0;i<8;i++)
{
Writedata(Ezk[i+16*number]);
}
Setpage(page+1); //寫下半頁
Sety(y);
for(i=0;i<8;i++)
{
Writedata(Ezk[i+16*number+8]);
}
}
/*主函數*/
void main()
{
uint i;
InitLCD();//初始12864
//ClearScreen(0);//清屏
Setx(0);//顯示開始行
while(1)
{
/* 可以單個顯示
Display(2,0,0*16,0);//
Display(2,0,1*16,1);//
Display(2,0,2*16,2);//
Display(2,0,3*16,3);//
Display(1,0,4*16,4);//
Display(1,0,5*16,5);//
Display(1,0,6*16,6);//*
/* 可以多個顯示,這里是4個一起顯示*/
for(i=0;i<4;i++)
{
Display(2,0,i*16,i);/*Display(選屏參數(cs0,cs1),pagr選頁參數,column選列參數,number選第幾漢字輸出)*/
_nop_();
Display(1,0,i*16,i+4);
_nop_();
Display(2,0+2,i*16,i+8);
_nop_();
Display(1,0+2,i*16,i+12);
_nop_();
Display(2,0+2+2,i*16,i+16);
_nop_();
Display(1,0+2+2,i*16,i+20);
}
for(i=0;i<8;i++)
{
Displayen(2,0+2+2+2,i*8,i);
_nop_(); ;
Displayen(1,0+2+2+2,i*8,i+8);
}
}
/* while(1)
{
lcd_rol();
delay(1000);
} */
}
|