(原文件名:截图03.jpg) ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// // COCOGUOJIA NOKIA 5110 // // PHILIPS PCD8544 48*48 LCD // ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// //头文件 #include <AT89X51.H> #define u8 unsigned char #define u16 unsigned int u8 nop; #define nop() nop++ u8 code character_table[]= { /*-- 文字: C --*/ /*-- Trebuchet MS11; 此字体下对应的点阵为:宽x高=8x14 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=8x16 --*/ 0xE0,0xF0,0x18,0x08,0x08,0x38,0x38,0x00,0x03,0x07,0x0C,0x08,0x08,0x0C,0x04,0x00, /*-- 文字: O --*/ /*-- Trebuchet MS11; 此字体下对应的点阵为:宽x高=8x14 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=8x16 --*/ 0xE0,0xF0,0x18,0x08,0x18,0xF0,0xE0,0x00,0x03,0x07,0x0C,0x08,0x0C,0x07,0x03,0x00, /*-- 文字: C --*/ /*-- Trebuchet MS11; 此字体下对应的点阵为:宽x高=8x14 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=8x16 --*/ 0xE0,0xF0,0x18,0x08,0x08,0x38,0x38,0x00,0x03,0x07,0x0C,0x08,0x08,0x0C,0x04,0x00, /*-- 文字: O --*/ /*-- Trebuchet MS11; 此字体下对应的点阵为:宽x高=8x14 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=8x16 --*/ 0xE0,0xF0,0x18,0x08,0x18,0xF0,0xE0,0x00,0x03,0x07,0x0C,0x08,0x0C,0x07,0x03,0x00, /*-- 文字: G --*/ /*-- Trebuchet MS11; 此字体下对应的点阵为:宽x高=8x14 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=8x16 --*/ 0xE0,0xF0,0x18,0x08,0x08,0x38,0x38,0x00,0x03,0x07,0x0C,0x08,0x09,0x0F,0x07,0x01, /*-- 文字: U --*/ /*-- Trebuchet MS11; 此字体下对应的点阵为:宽x高=8x14 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=8x16 --*/ 0x08,0xF8,0xF8,0x08,0x08,0xF8,0xF8,0x08,0x00,0x07,0x0F,0x08,0x08,0x0F,0x07,0x00, /*-- 文字: O --*/ /*-- Trebuchet MS11; 此字体下对应的点阵为:宽x高=8x14 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=8x16 --*/ 0xE0,0xF0,0x18,0x08,0x18,0xF0,0xE0,0x00,0x03,0x07,0x0C,0x08,0x0C,0x07,0x03,0x00, /*-- 文字: J --*/ /*-- Trebuchet MS11; 此字体下对应的点阵为:宽x高=8x14 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=8x16 --*/ 0x00,0x08,0x08,0xF8,0xF8,0x08,0x08,0x00,0x30,0x30,0x20,0x3F,0x1F,0x00,0x00,0x00, /*-- 文字: I --*/ /*-- Trebuchet MS11; 此字体下对应的点阵为:宽x高=8x14 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=8x16 --*/ 0x00,0x08,0x08,0xF8,0xF8,0x08,0x08,0x00,0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00, /*-- 文字: A --*/ /*-- Trebuchet MS11; 此字体下对应的点阵为:宽x高=8x14 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=8x16 --*/ 0x00,0x00,0xE0,0xF8,0xF8,0xE0,0x00,0x00,0x08,0x0E,0x0F,0x09,0x09,0x0F,0x0E,0x08, }; u8 code Chinese_table[]= { /*-- 文字: 欢 --*/ /*-- Trebuchet MS12; 此字体下对应的点阵为:宽x高=17x16 --*/ 0x34,0x64,0xC4,0xE4,0x7C,0x3C,0x38,0x1F,0xEF,0xE8,0x08,0x28,0x38,0x18,0x08, 0x00,0x20,0x30,0x5C,0x4F,0x43,0x6F,0x2C,0x30,0x1C,0x0F,0x07,0x1E,0x38,0x70,0x60, 0x20 /*-- 文字: 迎 --*/ /*-- Trebuchet MS12; 此字体下对应的点阵为:宽x高=17x16 --*/ ,0x41,0xCF,0xCE,0x04,0xFC,0xFC,0x06,0x02,0xFE,0xFC,0x04,0x04,0xFC,0xFC,0x00, 0x00,0x40,0x60,0x3F,0x3F,0x60,0x47,0x47,0x43,0x41,0x5F,0x5F,0x42,0x46,0x47,0x43, 0x40 /*-- 文字: 光 --*/ /*-- Trebuchet MS12; 此字体下对应的点阵为:宽x高=17x16 --*/ ,0x40,0x42,0x46,0x5C,0xDC,0xC8,0x7F,0x7F,0xC0,0xD0,0x5E,0x4E,0x64,0x60,0x40, 0x00,0x00,0x80,0xC0,0x60,0x38,0x1F,0x07,0x00,0x00,0x3F,0x7F,0x40,0x40,0x40,0x78, 0x78 /*-- 文字: 临 --*/ /*-- Trebuchet MS12; 此字体下对应的点阵为:宽x高=17x16 --*/ ,0xF8,0xF8,0x00,0xFE,0xFE,0x70,0xBF,0x8F,0x0A,0x18,0x78,0x68,0x88,0x88,0x08, 0x00,0x00,0x1F,0x1F,0x00,0x7F,0x7F,0x00,0x7F,0x7F,0x21,0x3F,0x3F,0x21,0x7F,0x7F, 0x01 }; ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// //管脚定义(起个小名了~) lcd的内部驱动是PCD8544,一下的芯片即为PCD8544 sbit RST = P0^1; //芯片复位 0有效 sbit SCE = P0^0; //芯片使能 0有效 sbit D_C = P3^4; //模式选择 1写数据 0写指令 sbit DIN = P3^5; //串行数据线 数据类型---8位 sbit SCK = P3^6; //串行时钟线 上升沿有效 ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// //delay_1ms: 大约延时1ms void delay_1ms(void)//1ms延时函数 { u16 i; for (i=0;i<500;i++) { ; } } ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// //LCD_Write_Byte: 写数据或命令到LCD //输入参数:u8 Data_or_Command:要写入的数据或命令; // u8 D_or_C :1 写数据/ 0 写命令 void LCD_Write_Byte(u8 Data_or_Command,u8 D_or_C) { u8 i; SCE=0;//选择芯片 D_C=D_or_C;// 数据? 命令? for(i=0;i<8;i++)//写 { if(0x80==(Data_or_Command&0x80)) { DIN=1; } else { DIN=0; } Data_or_Command<<=1;//移位 //造个上升沿 SCK=0; nop(); nop(); nop(); nop(); SCK=1; } //回复到安全状态 保险 D_C=1; SCE=1; DIN=1; } ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// //LCD_init: LCD初始化 void LCD_init(void) { RST=0; delay_1ms(); RST=1; delay_1ms(); LCD_Write_Byte(0x21,0);//初始化Lcd,功能设定使用扩充指令 LCD_Write_Byte(0xd0,0);//设定液晶偏置电压 LCD_Write_Byte(0x20,0);//使用基本指令 水平寻址 //LCD_Write_Byte(0x0C,0);//设定显示模式,正常显示 LCD_Write_Byte(0x0D,0); //设定显示模式,反白显示 } ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// //LCD_Set_XY: 设置LCD坐标函数 用于准备显示高度是‘8个点’的汉字或字母 //输入参数:X:0-83 Y:0-5 void LCD_Set_XY(u8 X, u8 Y) { LCD_Write_Byte(0x40 | Y, 0);// 竖 LCD_Write_Byte(0x80 | X, 0);// 横 } ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// //LCD_Clear: LCD清屏函数 void LCD_Clear(void) { u8 x; u8 y; LCD_Set_XY(0,0); for(y=0;y<=5;y++) { for(x=0;x<=83;x++) { LCD_Write_Byte(0x00,1); } } } ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// //LCD_Write_ABC: 显示8(宽)*16(高)点阵列数字字母符号等半角类 //输入参数: x: // y: // ABC:显示的字符的序号 void LCD_Write_ABC(u8 x, u8 y,u8 ABC) //x:横 y:竖 ABC:字符的序号 { u8 i; LCD_Set_XY(x*8, y);//横 ,竖 for(i=0; i<8;i++) { LCD_Write_Byte(character_table[ABC*16+i],1); } LCD_Set_XY(x*8, y+1);//横 ,竖 for(i=8; i<16;i++) { LCD_Write_Byte(character_table[ABC*16+i],1); } } ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// //LCD_Write_Chinese: 显示16(宽)*16(高)点阵列汉字等半角类 //输入参数: // x: // y: // Chinese:显示的汉字的序号 void LCD_Write_Chinese(u8 x, u8 y,u8 Chinese) { unsigned char i; LCD_Set_XY(x*8, y);// 列,页 for(i=0; i<16;i++) { LCD_Write_Byte(Chinese_table[Chinese*32+i],1); } LCD_Set_XY(x*8, y+1);// 列,页 for(i=16; i<32;i++) { LCD_Write_Byte(Chinese_table[Chinese*32+i],1); } } void main(void) { unsigned char k; RST=0; for(k=0;k<250;k++); RST=1; LCD_init(); LCD_Clear(); LCD_Write_ABC(0,1,0); LCD_Write_ABC(1,1,1); LCD_Write_ABC(2,1,2); LCD_Write_ABC(3,1,3); LCD_Write_ABC(4,1,4); LCD_Write_ABC(5,1,5); LCD_Write_ABC(6,1,6); LCD_Write_ABC(7,1,7); LCD_Write_ABC(8,1,8); LCD_Write_ABC(9,1,9); LCD_Write_Chinese(1,3,0); LCD_Write_Chinese(3,3,1); LCD_Write_Chinese(5,3,2); LCD_Write_Chinese(7,3,3); while(1) { ; } } |
欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) | Powered by Discuz! X3.4 |