- #include <reg51.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define Port P3 //LCD12864數(shù)據線
- sbit RS=P0^3; // 數(shù)據\指令 選擇
- sbit RW=P0^2; // 讀\寫 選擇
- sbit EN=P0^1; // 讀\寫使能
- sbit cs1=P0^5; // 片選1
- sbit cs2=P0^4; // 片選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,
- /*-- 文字: 1 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
- /*-- 文字: 1 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
- /*-- 文字: 8 --*/
- /*-- 新宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
- /*-- 文字: 1 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
- /*-- 文字: 8 --*/
- /*-- 新宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
- /*-- 文字: 2 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
- /*-- 文字: 6 --*/
- /*-- 新宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,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,
- /*-- 文字: 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,
- };
- /*狀態(tài)檢查,LCD是否忙*/
- void Checkbusy()
- {
- uchar dat;//狀態(tài)信息(判斷是否忙)
- RS=0; // 數(shù)據\指令選擇,D/I(RS)=“L” ,表示 DB7∽DB0 為顯示指令數(shù)據
- RW=1; //R/W=“H” ,E=“H”數(shù)據被讀到DB7∽DB0
- do{
- Port=0x00;
- EN=1; //EN下降源
- _nop_(); //一個時鐘延時
- dat=Port;
- EN=0;
- dat=(0x80 & dat);
- }while(!(dat==0x00)); //僅當?shù)?位為0時才可操作(判別busy信號)
- }
- /*寫命令到LCD中*/
- Wcmd(uchar cmd)
- {
- Checkbusy();//狀態(tài)檢查,LCD是否忙
- RS=0; //向LCD發(fā)送命令。RS=0寫指令,RS=1寫數(shù)據
- RW=0;//R/W=“L” ,E=“H→L”數(shù)據被寫到 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);
- }
- /*寫顯示數(shù)據 */
- void Writedata(uchar dat)
- {
- Checkbusy();//狀態(tài)檢查,LCD是否忙
- RS=1; //RS=0寫指令,RS=1寫數(shù)據
- RW=0;////R/W=“L” ,E=“H→L”數(shù)據被寫到 IR 或 DR
- Port=dat;//dat:顯示數(shù)據
- 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++) //控制頁數(shù)0-7,共8頁
- {
- Setpage(i);
- Sety(0);
- for(j=0;j<64;j++) //控制列數(shù)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; //選屏參數(shù),pagr選頁參數(shù),column選列參數(shù),number選第幾漢字輸出
-
- SelectScreen(ss);
- y=y&0x3f;
- Setpage(page); //寫上半頁
- Sety(y); //控制列
- for(i=0;i<16;i++) //控制16列的數(shù)據輸出
- {
- Writedata(Hzk[i+32*number]); //i+32*number漢字的前16個數(shù)據輸出
-
- }
- Setpage(page+1); //寫下半頁
- Sety(y); //控制列
- for(i=0;i<16;i++) //控制16列的數(shù)據輸出
- {
- Writedata(Hzk[i+32*number+16]); //i+32*number+16漢字的后16個數(shù)據輸出
- }
- }
- /*顯示半角漢字和數(shù)字和字母*/
- void Displayen(uchar ss,uchar page,uchar y,uchar number)
- {
- uint i;//選屏參數(shù),pagr選頁參數(shù),column選列參數(shù),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]);
- }
- }
- /*主函數(shù)*/
- 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(1,0,i*16,i);//Display(選屏參數(shù)(cs0,cs1),pagr選頁參數(shù),column選列參數(shù),number選第幾漢字輸出)
- _nop_();
- Display(2,0,i*16,i+4);
- _nop_();
- Display(1,0+2,i*16,i+8);
- _nop_();
- Display(2,0+2,i*16,i+12);
- _nop_();
- Display(1,0+2+2,i*16,i+16);
- _nop_();
- Display(2,0+2+2,i*16,i+20);
- }
- for(i=0;i<8;i++)
- {
- Displayen(1,0+2+2+2,i*8,i);
- _nop_(); ;
- Displayen(2,0+2+2+2,i*8,i+8);
- }
- }
- /* while(1)
- {
- lcd_rol();
- delay(1000);
- } */
- }
復制代碼 |