#include
#include
#define uint unsigned int
#define uchar unsigned char
//--定时使用的IO口--//
#define DATA_PORT P0
sbit LCD12864_CS = P3^2;
sbit LCD12864_RSET = P3^3;
sbit LCD12864_RS = P2^6;
sbit LCD12864_RW = P2^7;
sbit LCD12864_RD = P2^5;
//--定义全局函数--//
void LcdSt7565_WriteCmd(cmd);
void LcdSt7565_WriteData(dat);
void Lcd12864_Init();
void Lcd12864_ClearScreen(void);
void Lcd12864_Write16CnCHAR(uchar x, uchar y,uchar k);
void Delay10ms(unsigned int c);
unsigned char code table[40][32]={
/*-- 文字: 。--*/
/*-- 宋体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,0x18,0x24,0x24,0x18,0x00,0x00,
/*-- 文字: 都--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x06,0xDA,0x22,0x02,0xFE,0x20,0x26,0x28,0x34,0x24,0x7F,0xA4,0x24,0x24,0x20, 0x00,0x07,0x08,0x10,0x08,0xFF,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0xFF,0x02,0x04,
/*-- 文字: 皇--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x00,0x00,0x7C,0x54,0x54,0x54,0x54,0x55,0x56,0x54,0x7C,0x00,0x00,0x00, 0x00,0x40,0x41,0x49,0x49,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x49,0x41,0x40,
/*-- 文字: 满--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x24,0x24,0x2F,0xE4,0x24,0x24,0xE4,0x2F,0x24,0x24,0x00,0x8C,0x02,0x60,0x10, 0x00,0x7F,0x91,0x49,0x07,0x09,0x19,0x07,0x09,0x11,0xFF,0x00,0x01,0x7E,0x04,0x04,
/*-- 文字: 柳--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0xFC,0x04,0x04,0xFC,0x00,0xF8,0x02,0x04,0xFC,0x10,0x90,0xFF,0xD0,0x10,0x10, 0x00,0x07,0x08,0x04,0xFF,0x00,0x0F,0x32,0x44,0x8F,0x01,0x00,0xFF,0x00,0x03,0x04,
/*-- 文字: 烟--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0xFE,0x42,0x42,0x42,0xFA,0x42,0x42,0x42,0xFE,0x08,0x10,0xFF,0x00,0x70,0x80, 0x00,0xFF,0x40,0x4C,0x42,0x41,0x46,0x48,0x50,0xFF,0x10,0x08,0x07,0x18,0x60,0x80,
/*-- 文字: 胜--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x10,0x10,0x10,0xFF,0x10,0x10,0x3C,0x40,0x00,0xFE,0x22,0x22,0xFE,0x00, 0x00,0x40,0x42,0x42,0x42,0x7F,0x42,0x42,0x42,0x40,0x00,0xFF,0x82,0x02,0x7F,0x80,
/*-- 文字: 绝--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0xE0,0x2C,0x34,0xE4,0x24,0x27,0xE8,0x10,0x20,0x10,0x63,0xAC,0x30,0x20, 0x00,0x70,0x43,0x42,0x42,0x43,0x42,0x42,0x3F,0x00,0x00,0x12,0x12,0x22,0x67,0x22,
/*-- 文字: ,--*/
/*-- 宋体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,0x38,0x58,0x00,0x00,
/*-- 文字: 处--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x80,0x40,0x20,0x10,0xFF,0x00,0x00,0xF8,0x08,0x08,0x9F,0x60,0x80,0x00, 0x00,0x40,0x41,0x40,0x40,0x40,0x5F,0x40,0x20,0x20,0x13,0x0C,0x13,0x20,0x40,0x81,
/*-- 文字: 好--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x80,0x86,0x8A,0x92,0xE2,0x82,0x82,0x80,0x00,0xF0,0x10,0x1F,0xF0,0x10,0x10, 0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x40,0x00,0x00,0x61,0x16,0x08,0x15,0x22,0x40,
/*-- 文字: 春--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x40,0x44,0x54,0x54,0xD4,0x54,0x54,0x5F,0x74,0x54,0xD4,0x54,0x54,0x44,0x40, 0x00,0x04,0x04,0x02,0x01,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x01,0x02,0x04,0x04,
/*-- 文字: 年--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x04,0x44,0x44,0x44,0x44,0xFC,0x44,0x44,0x44,0x44,0xC7,0x18,0x20,0x00, 0x00,0x04,0x04,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x04,
/*-- 文字: 一--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: 是--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x00,0x00,0x7F,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x7F,0x00,0x00,0x00, 0x00,0x81,0x81,0x89,0x89,0x89,0x89,0x89,0xFF,0x81,0x41,0x21,0x1D,0x21,0x41,0x81,
/*-- 文字: 最--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x40,0x40,0x40,0x5F,0x55,0x55,0x55,0x55,0xD5,0x55,0x55,0x5F,0xC0,0x40,0x40, 0x00,0x80,0x80,0x43,0x2D,0x11,0x29,0x47,0x90,0xFF,0x15,0x15,0x25,0x3F,0x60,0x20,
/*-- 文字: 。--*/
/*-- 宋体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,0x18,0x24,0x24,0x18,0x00,0x00,
/*-- 文字: 无--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x40,0x40,0x42,0x42,0x42,0xC2,0x42,0x7E,0xC2,0x42,0x42,0x42,0x40,0x00, 0x00,0x00,0x70,0x40,0x40,0x40,0x40,0x3F,0x00,0x00,0x03,0x0C,0x10,0x20,0x40,0x80,
/*-- 文字: 却--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0xFC,0x04,0x04,0x04,0xFC,0x80,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x80, 0x00,0x00,0x0F,0x10,0x08,0x00,0xFF,0x00,0x30,0x18,0x14,0x10,0x13,0x14,0x38,0x10,
/*-- 文字: 近--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x20,0x22,0x23,0xE2,0x24,0x24,0x24,0xFC,0x00,0x00,0x00,0xCC,0x42,0x40,0x40, 0x00,0x40,0x40,0x40,0x5F,0x40,0x40,0x40,0x43,0x4C,0x50,0x20,0x1F,0x20,0x40,0x00,
/*-- 文字: 看--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x20,0x20,0x29,0x29,0x29,0x29,0x29,0x2E,0x3A,0x6A,0xAA,0x2A,0x2A,0x22,0x20, 0x00,0x00,0x00,0x00,0xFF,0x55,0x55,0x55,0x55,0x55,0x55,0xFF,0x01,0x02,0x04,0x08,
/*-- 文字: 遥--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x2D,0x31,0x21,0xF1,0x2A,0x22,0x32,0x4A,0x00,0x00,0xCC,0x42,0x40,0x40,
0x00,0x81,0xBD,0xA1,0xA1,0xBF,0xA1,0xA1,0xBD,0x81,0x80,0x40,0x3F,0x40,0x80,0x00,
/*-- 文字: 色--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x00,0xE0,0x20,0x2C,0x34,0x24,0xE4,0x24,0x24,0x27,0x24,0xE8,0x10,0x20, 0x00,0x78,0x40,0x43,0x42,0x42,0x42,0x42,0x43,0x42,0x42,0x42,0x42,0x3F,0x00,0x00,
/*-- 文字: 草--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x04,0x04,0x04,0xE4,0xA4,0xAF,0xA4,0xA4,0xA4,0xAF,0xA4,0xE4,0x04,0x04,0x04, 0x00,0x08,0x08,0x08,0x0B,0x0A,0x0A,0x0A,0xFE,0x0A,0x0A,0x0A,0x0B,0x08,0x08,0x08,
/*-- 文字: ,--*/
/*-- 宋体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,0x38,0x58,0x00,0x00,
/*-- 文字: 酥--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x42,0x43,0x42,0xFE,0x44,0x44,0x44,0x00,0xF2,0x12,0xFE,0x12,0xFE,0x12,0xF2, 0x00,0x08,0x06,0x01,0xFF,0x03,0x0C,0x10,0x00,0xFF,0x49,0x49,0x48,0x49,0x4A,0xFF,
/*-- 文字: 如--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0xF8,0x08,0x08,0x08,0xF8,0x00,0x00,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10, 0x00,0x00,0x7F,0x20,0x20,0x20,0x7F,0x00,0x00,0x61,0x16,0x08,0x14,0x22,0x41,0x80,
/*-- 文字: 润--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0xFE,0x02,0x12,0x12,0xF2,0x10,0x16,0x01,0xFC,0x00,0x8C,0x02,0x60,0x10, 0x00,0x00,0x7F,0x80,0x51,0x11,0x1F,0x11,0x11,0x00,0xFF,0x00,0x01,0x7E,0x04,0x04,
/*-- 文字: 雨--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x02,0xE2,0x22,0x22,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0x22,0xE2,0x02, 0x00,0x00,0x7F,0x80,0x40,0x12,0x09,0x00,0x7F,0x00,0x12,0x09,0x00,0x00,0xFF,0x00,
/*-- 文字: 小--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x80,0x40,0x20,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xE0,0x00,0x00,0x00, 0x00,0x0E,0x01,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x40,0x00,0x00,0x03,0x04,0x08,
/*-- 文字: 街--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x40,0x44,0xC4,0x44,0x40,0x24,0x24,0xBF,0x24,0x24,0x00,0x23,0xC4,0x88,0x10,
0x00,0x00,0x00,0x7F,0x80,0x40,0x12,0x12,0x1F,0x22,0x62,0x20,0x00,0xFF,0x00,0x01,
/*-- 文字: 天--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x40,0x40,0x42,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0x42,0x40,0x40,
0x00,0x80,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x03,0x0C,0x10,0x20,0x40,0x80,0x80,
/*-- 文字: 早--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,
0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
/*-- 文字: 春--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x40,0x44,0x54,0x54,0xD4,0x54,0x54,0x5F,0x74,0x54,0xD4,0x54,0x54,0x44,0x40,
0x00,0x04,0x04,0x02,0x01,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x01,0x02,0x04,0x04,
/*-- 文字: 韩--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x08,0x48,0x48,0x48,0xFF,0x48,0x48,0x00,0x08,0xE8,0xA8,0xBF,0xA8,0xE8,0x08,
0x00,0x1E,0x22,0x12,0x02,0xFF,0x02,0x02,0x02,0x08,0x0B,0x0A,0xFE,0x0A,0x0B,0x08,
/*-- 文字: 愈--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x10,0x10,0xE8,0x08,0x04,0xCC,0x0A,0x09,0xEA,0xAC,0xA4,0xA8,0xE8,0x10,0x10, 0x00,0xC0,0x20,0x0F,0xC8,0x80,0x83,0xA0,0x90,0x8F,0x8A,0x62,0x02,0x0F,0x60,0x80,
/*-- 文字: 作--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x08,0x08,0x88,0x88,0x88,0x88,0xF8,0x0F,0x30,0x40,0x07,0xF8,0x60,0x80,0x00,
0x00,0x00,0x08,0x08,0x08,0x08,0x08,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x01,
/*-- 文字: 制--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0xFF,0x00,0x00,0xF8,0x40,0x48,0x48,0x48,0xFF,0x48,0x48,0x4E,0x50,0x40,
0x00,0x00,0x7F,0x80,0x40,0x0F,0x00,0x1E,0x22,0x12,0xFF,0x02,0x02,0x3E,0x00,0x00,
/*-- 文字: 豪--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x80,0x82,0x82,0xBA,0xAA,0xAA,0xAA,0xAB,0xAA,0xAA,0xAA,0xBA,0x82,0x82,0x00, 0x00,0x01,0x42,0x40,0x22,0x2A,0x12,0xF2,0xAA,0x56,0x56,0xAA,0xAA,0xA0,0x01,0x02,
/*-- 文字: 周--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x00,0xFE,0x82,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x82,0xFE,0x00,0x00, 0x00,0x00,0x00,0x7F,0x80,0x40,0x1E,0x12,0x12,0x12,0x1E,0x00,0x00,0x1F,0x60,0x80, };
uchar num;
void main()
{
Lcd12864_Init();
while(1)
{
Lcd12864_ClearScreen();
Delay10ms(60);
Lcd12864_Write16CnCHAR(72,0,32); //早
Delay10ms(60);
Lcd12864_Write16CnCHAR(40,0,33); //春
Delay10ms(60);
Lcd12864_Write16CnCHAR(64,2,34); //韩
Delay10ms(60);
Lcd12864_Write16CnCHAR(48,2,35); //愈
Delay10ms(200);
Lcd12864_ClearScreen();
Delay10ms(60);
Lcd12864_Write16CnCHAR(112,0,31); //第1行
Delay10ms(60);
Lcd12864_Write16CnCHAR(96,0,30);
Delay10ms(60);
Lcd12864_Write16CnCHAR(80,0,29);
Delay10ms(60);
Lcd12864_Write16CnCHAR(64,0,28);
Delay10ms(60);
Lcd12864_Write16CnCHAR(48,0,27);
Delay10ms(60);
Lcd12864_Write16CnCHAR(32,0,26);
Delay10ms(60);
Lcd12864_Write16CnCHAR(16,0,25);
Delay10ms(60);
Lcd12864_Write16CnCHAR(0,0,24);
Delay10ms(200);
Lcd12864_Write16CnCHAR(112,2,23); //第2行
Delay10ms(60);
Lcd12864_Write16CnCHAR(96,2,22);
Delay10ms(60);
Delay10ms(60);
Lcd12864_Write16CnCHAR(64,2,20);
Delay10ms(60);
Lcd12864_Write16CnCHAR(48,2,19);
Delay10ms(60);
Lcd12864_Write16CnCHAR(32,2,18);
Delay10ms(60);
Lcd12864_Write16CnCHAR(16,2,17);
Delay10ms(60);
Lcd12864_Write16CnCHAR(0,2,16);
Delay10ms(200);
Lcd12864_Write16CnCHAR(112,4,15); //第3行
Delay10ms(60);
Lcd12864_Write16CnCHAR(96,4,14);
Delay10ms(60);
Lcd12864_Write16CnCHAR(80,4,13);
Delay10ms(60);
Lcd12864_Write16CnCHAR(64,4,12);
Delay10ms(60);
Lcd12864_Write16CnCHAR(48,4,11);
Delay10ms(60);
Lcd12864_Write16CnCHAR(32,4,10); //x可选择为0.16.32.48.64.80.96.112
Delay10ms(60);
Lcd12864_Write16CnCHAR(16,4,9); //y选择
0.2.4.6 (1.3.5.7尽量不要)
Delay10ms(60);
Lcd12864_Write16CnCHAR(0,4,8);
Delay10ms(200);
Lcd12864_Write16CnCHAR(112,6,7); //第4行
Delay10ms(60);
Lcd12864_Write16CnCHAR(96,6,6);
Delay10ms(60);
Lcd12864_Write16CnCHAR(80,6,5);
Delay10ms(60);
Lcd12864_Write16CnCHAR(64,6,4);
Delay10ms(60);
Lcd12864_Write16CnCHAR(48,6,3);
Delay10ms(60);
Lcd12864_Write16CnCHAR(32,6,2);
Delay10ms(60);
Delay10ms(60);
Lcd12864_Write16CnCHAR(0,6,0);
Delay10ms(200);
Lcd12864_ClearScreen();
Delay10ms(60);
Lcd12864_Write16CnCHAR(80,2,39); //周
Delay10ms(60);
Lcd12864_Write16CnCHAR(64,2,38); //豪
Delay10ms(60);
Lcd12864_Write16CnCHAR(48,2,37); //制
Delay10ms(60);
Lcd12864_Write16CnCHAR(32,2,36); //作
Delay10ms(400);
Delay10ms(500);
}
}
/****************************************************************************** *
* 函数名: Delay10ms
* 函数功能: 延时函数,延时10ms
* 输入: 无
* 输出: 无
******************************************************************************* /
void Delay10ms(unsigned int c) //误差0us
{
unsigned char a,b;
for(;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
/****************************************************************************** *
* 函数名: LCD12864_WriteCmd
* 函数功能: 写入一个命令到12864
* 输入: cmd
* 输出: 无
******************************************************************************* /
void LcdSt7565_WriteCmd(cmd)
{
LCD12864_CS = 0; //chip select,打开片选
LCD12864_RD = 1; //disable read,读失能
LCD12864_RS = 0; //select command,选择命令
LCD12864_RW = 0; //select write,选择写模式
_nop_();
_nop_();
DATA_PORT = cmd; //put command,放置命令
_nop_();
_nop_();
LCD12864_RW = 1; //command writing ,写入命令
}
/****************************************************************************** *
* 函数名: LcdSt7565_WriteData
* 函数功能: 写入一个数据到12864
* 输入: dat
* 输出: 无
******************************************************************************* /
void LcdSt7565_WriteData(dat)
{
LCD12864_CS = 0; //chip select,打开片选
LCD12864_RD = 1; //disable read,读失能
LCD12864_RS = 1; //select data,选择数据
LCD12864_RW = 0; //select write,选择写模式
_nop_();
_nop_();
DATA_PORT = dat; //put data,放置数据
_nop_();
_nop_();
LCD12864_RW = 1; //data writing,写数据
}
/******************************************************************************
*
* 函数名: LCD12864_Init
* 函数功能: 初始化12864
* 输入: 无
* 输出: 无
* 说明: LCD12864的命令指令可以查看例程文件夹下的《ST7565p数据手册》* * 的第51页的位置。
******************************************************************************* /
void Lcd12864_Init()
{
uchar i;
LCD12864_RSET = 0;
for (i=0; i<100; i++);
LCD12864_CS = 0;
LCD12864_RSET = 1;
//----------------Star Initial Sequence-------//
//------程序初始化设置,具体命令可以看文件夹下---//
//--软件初始化--//
LcdSt7565_WriteCmd(0xE2); //reset
for (i=0; i<100; i++); //延时一下
//--表格第8个命令,0xA0段(左右)方向选择正常方向(0xA1为反方向)--//
LcdSt7565_WriteCmd(0xA1); //ADC select segment direction
//--表格第15个命令,0xC8普通(上下)方向选择选择反向,0xC0为正常方向--//
LcdSt7565_WriteCmd(0xC8); //Common direction
//--表格第9个命令,0xA6为设置字体为黑色,背景为白色---//
//--0xA7为设置字体为白色,背景为黑色---//
LcdSt7565_WriteCmd(0xA6); //reverse display
//--表格第10个命令,0xA4像素正常显示,0xA5像素全开--//
LcdSt7565_WriteCmd(0xA4); //normal display
//--表格第11个命令,0xA3偏压为1/7,0xA2偏压为1/9--//
LcdSt7565_WriteCmd(0xA2); //bias set 1/9
//--表格第19个命令,这个是个双字节的命令,0xF800选择增压为4X;--//
//--0xF801,选择增压为5X,其实效果差不多--//
LcdSt7565_WriteCmd(0xF8); //Boost ratio set
LcdSt7565_WriteCmd(0x01); //x4
//--表格第18个命令,这个是个双字节命令,高字节为0X81,低字节可以--//
//--选择从0x00到0X3F。用来设置背景光对比度。---/
LcdSt7565_WriteCmd(0x81); //V0 a set
LcdSt7565_WriteCmd(0x23);
//--表格第17个命令,选择调节电阻率--//
LcdSt7565_WriteCmd(0x25); //Ra/Rb set
//--表格第16个命令,电源设置。--//
LcdSt7565_WriteCmd(0x2F);
for (i=0; i<100; i++);
//--表格第2个命令,设置显示开始位置--//
LcdSt7565_WriteCmd(0x40); //start line
//--表格第1个命令,开启显示--//
LcdSt7565_WriteCmd(0xAF); // display on
for (i=0; i<100; i++);
}
/****************************************************************************** *
* 函数名: LCD12864_ClearScreen
* 函数功能: 清屏12864
* 输入: 无
* 输出: 无
******************************************************************************* /
void Lcd12864_ClearScreen(void)
{
uchar i, k;
for(i=0; i<8; i++)
{
LcdSt7565_WriteCmd(0xB0+i);
LcdSt7565_WriteCmd(0x10);
LcdSt7565_WriteCmd(0x04);
for(k=0; k<128; k++)
{
LcdSt7565_WriteData(0x00); //如果设置背景为白色时,清屏选择0XFF }
}
}
/****************************************************************************** *
* 函数名: LCD12864_Write16CnCHAR
* 函数功能: 在12864上面书写16X16的汉字
* 输入: x, y, cn
* 输出: 无
* 说明: 该函数可以直接书写字符串,但是书写是从右到左,所以输入的时* * 侯注意输入。汉字的取模方式请观看文件夹下的《汉字取模软件的* * 使用说明》
******************************************************************************* /
void Lcd12864_Write16CnCHAR(uchar x, uchar y,uchar j)
{
uchar k, x1, x2;
y += 0xB0; //求取Y坐标的值
//--设置Y坐标--//
LcdSt7565_WriteCmd(y);
//--设置Y坐标--//
LcdSt7565_WriteCmd(y);
x1 = (x >> 4) & 0x0F; //由于X坐标要两句命令,分高低4位,所以这里先取出高4位x2 = x & 0x0F; //去低四位
//--设置X坐标--//
LcdSt7565_WriteCmd(0x10 + x1); //高4位
LcdSt7565_WriteCmd(0x04 + x2); //低4位
for (k=0; k<32; k++) //写一个字
{
if (k == 16) //由于16X16用到两个Y坐标,当大于等于16时,切换坐标
{
//--设置Y坐标--//
LcdSt7565_WriteCmd(y+1);
//--设置X坐标--//
LcdSt7565_WriteCmd(0x10 + x1); //高4位
LcdSt7565_WriteCmd(0x04 + x2); //低4位
}
LcdSt7565_WriteData(table[j][k]);
}
}
本例程为通过用A T89C52芯片操作LCD12864显示的程序,使用的晶振为12M。 /********************************************************** 程序说明:LCD12864显示主程序 程序调试员:莫剑辉 调试时间:2010-6-7 **********************************************************/ #include ;实验目的:熟悉12864LCD的使用 ;12864LCD带中文字库 ;编程让12864LCD显示公司名称“深圳乾龙盛电子”,公司电话“0975”,公司传真“6”;硬件设置: ;关断所有拨码开关。 #include<> ;__CONFIG _DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_H S_OSC ;芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡 #define RS PORTA,5 ;命令/数据选择 #DEFINE RW PORTA,4 ;读/写选择 #DEFINE E PORTA,3 ;使能信号 #DEFINE PSB PORTA,2 ;并口/串口选择(H/L) #DEFINE RST PORTA,0 ;复位信号 ;----------------------------------------------- LCD_X EQU 30H ;页地址 LCD_Y EQU 31H ;Y地址 COUNT EQU 32H ;循环计数用 COUNT1 EQU 33H ;循环计数用 COUNT2 EQU 34H ;循环计数用 POINT EQU 35H ;查表偏移地址 POINT1 EQU 36H ;查表偏移地址 POINT2 EQU 37H ;查表偏移地址 TEMP EQU 38H ;临时寄存器 TEMP1 EQU 39H ;临时寄存器 ;----------------------------------------------- ORG 0000H ;复位地址 NOP ;ICD需要的空指令 GOTO MAIN ;跳转到主程序 ;**********************主程序************************ MAIN BANKSEL TRISA CLRF TRISA ;A口输出 CLRF TRISD ;D口输出 BANKSEL ADCON1 MOVLW 06H MOVWF ADCON1 ;A口全为数字口 CLRF STATUS 51单片机综合学习 12864液晶原理分析1 辛勤学习了好几天,终于对12864液晶有了些初步了解~没有视频教程学起来真有些累,基本上内部程序写入顺序都是根据程序自我变动,然后逆向反推出原理…… 芯片:YM12864R P-1 控制芯片:ST7920A带中文字库 初步小结: 1、控制芯片不同,寄存器定义会不同 2、显示方式有并行和串行,程序不同 3、含字库芯片显示字符时不必对字符取模了 4、对芯片的结构地址一定要理解清楚 5、显示汉字时液晶芯片写入数据的顺序(即显示的顺序)要清楚 6、显示图片时液晶芯片写入数据的顺序(即显示的顺序)要清楚 7、显示汉字时的二级单元(一级为八位数据写入单元)要清楚 8、显示图片时的二级单元(一级为八位数据写入单元)要清楚 12864点阵液晶显示模块(LCM)就是由128*64个液晶显示点组成的一个128列*64行的阵列。每个显示点对应一位二进制数,1表示亮,0表示灭。存储这些点阵信息的RAM称为显示数据存储器。要显示某个图形或汉字就是将相应的点阵信息写入 到相应的存储单元中。图形或汉字的点阵信息由自己设计,问题的关键就是显示点在液晶屏上的位置(行和列)与其在存储器中的地址之间的关系。由于多数液晶显示模块的驱动电路是由一片行驱动器和两片列驱动器构成,所以12864液晶屏实际上是由左右两块独立的64*64液晶屏拼接而成,每半屏有一个512*8 bits显示数据RAM。左右半屏驱动电路及存储器分别由片选信号CS1和CS2选择。显示点在64*64液晶屏上的位置由行号(line,0~63)与列号(column,0~63)确定。512*8 bits RAM中某个存储单元的地址由页地址(Xpage,0~7)和列地址(Yaddress,0~63)确定。每个存储单元存储8个液晶点的显示信息。 在我们常用的人机交互显示界面中,除了数码管,LED,以及我们之前已经提到的LCD1602之外,还有一种液晶屏用的比较多。相信接触过单片机的朋友都知道了,那就是12864液晶。顾名思义,12864表示其横向可以显示128个点,纵向可以显示64个点。我们常用的12864液晶模块中有带字库的,也有不带字库的,其控制芯片也有很多种,如KS0108 T6963,ST7920等等。在这里我们以ST7920为主控芯片的12864液晶屏来学习如何去驱动它。(液晶屏采用金鹏的OCMJ4X8C) 关于这个液晶屏的更多信息,请参考它的DATASHEET,附件中有下载。 我们先来了解一下它的并行连接情况。 下面是电路连接图 从上面的图可以看出,液晶模块和单片机的连接除了P0口的8位并行数据线之外,还有RS,RW,E等几根线。其中R/S是指令和数据寄存器的选择控制线(串行模式下为片选),R/W 是读写控制线(串行模式下是数据线),E是使能线(串行模式下为时钟线)。 通过这几根控制线和数据线,再结合它的时序图,我们就可以编写出相应的驱动程序啦。 看看并行模式下的写时序图: 根据这个时序图,我们就可以写出写数据或者写命令到LCD12864液晶的子程序。 读时序图如下: 根据这个时序图我们就可以从LCD12864液晶模块内部RAM中读出相应的数据,我们的忙检测函数就是根据这个时序图写出来的。以及后面章节中讲的画点函数等都要用到读时序。有了这两个时序图,然后我们再看看OCMJ4X8C的相关指令集,就可以编写出驱动程序了。这里要注意的是指令集分为基本指令集和扩充指令集,其中扩充指令集主要是与绘图相关,在此后的章节中会有相应的介绍。 下面让我们根据这些编写出它的驱动程序吧。 我的硬件测试条件为:STC89C516(11.0592MHz) + OCMJ4X8C 实际显示效果图片如下: 程序部分如下,请结合液晶模块的DATASHEET看程序,这样能够更加快速的弄懂程序的流程。大致有如下几个函数:写数据,写指令,忙检测,初始化,指定地址显示字符串等等。[p][/p] #include "reg52.h" #include "intrins.h" sbit io_LCD12864_RS = P1^0 ; /****************************** 2012年5月19日 调试成功 编辑环境:ICCAVR 功能:用LCD12864显示汉字 ********************************/ #include 本例程为通过用AT89C52芯片操作LCD12864显示的程序,使用的晶振为12M。 /********************************************************** 程序说明:LCD12864显示主程序 程序调试员:莫剑辉 调试时间:2010-6-7 **********************************************************/ #include 看到工具箱旁边那个LCD12864很久没用了(当初买回来用的时候只是简单地测试了一下),于是萌生了重新写一次接口程序的想法(而且这次要给它加个图片显示的功能),好,说做就做,就用Atmega16和ICCAVR来做吧,最近这MCU和平台用得比较熟练。 马上从书堆里把当初打印出来的中文datasheet给翻了出来,依葫芦画瓢地写了个初始化程序。好,OK。编译通过。于是又写了一个可以自定义从XY坐标值开始输出显示的函数,再次编译,也通过,OK。于是呼马上写了四行简单的字符烧到单片机上试了一下,嘿嘿,一次通过。如下图: 后来在进一步测试的时候也出了点小问题。就是我是使用USBISP烧写器把程序烧写进AVR的(此时实验板由USBISP烧写器供电),想要实现从第一行的第一个字符开始连续显示"0123456789"。刚烧写完程序后能看到LCD12864上正常显示"0123456789",但是把烧写器从实验板上断开连接,单独用USB给实验板供电的时候,LCD的第一行只是显示"123456789",第一个字符消失了……,左思右想地弄了一个多小时后,终于把问题给解决了,就是把初始化程序的延时适当增加了些,真是奇怪。刚开始一直想不通为什么在烧写器供电的情况下就正常显示,而换到USB供电后就出了问题。后来再想想,估计是跟供电有关。在使用USBISP烧写器供电的时候,LCD的背光灯明显比用USB供电的时候来得亮,而且对比度也高很多,看来是因为换到USB供电后,供电不怎么充足,以至于LCD在上电初始化的时候花上了更多的时间去初始化(因为供电低了,功率小了,跑起来有点力不从心,用的时间就久了嘛……我是觉得可以这样去理解的 接下来呢,就到了有点难度的画图了。当初刚买到12864的时候只是简单测试了字符显示功能,除了因为画图还不需要用到,另外一个原因就是那datasheet上关于画图那部分的内容不怎么看得懂…。现在重新拿起来看,依然一头雾水……。马上上网百度了一下“12864 7920 显示图片”,看到了不少的例子程序,可是……就是没看到有关于这部分功能实现的详细思路和讲解……下载下来的那些程序,基本上没注释,不是说晦涩难懂,但是至少看起来一团糟,让人家不想继续看下去……于是还是硬着头皮去啃那datasheet。上面对于画图这部分的内容是这样讲解的: 基于STM32--LCD12864驱动程序 STM32 LCD12864驱动程序(头文件)(2012-05-29 21:25:08)转载▼ 标签:杂谈 #ifndef LCD12864_H #define LCD12864_H #define LCD_CONTROL GPIOD //默认LCD12864的控制口在PD口 #define LCD_DATAPORT GPIOD //默认LCD12864的数据口在PD口 #define LCD_RESET_Pin GPIO_Pin_12 //默认LCD12864的复位引脚连接到PD.12 也可不用 #define LCD_RS_Pin GPIO_Pin_13 //默认LCD12864 RS -- PD.13 #define LCD_RW_Pin GPIO_Pin_14 //默认LCD12864 RW -- PD.14 #define LCD_EN_Pin GPIO_Pin_15 //默认LCD12864 E -- PD.15 #define LCD_CONTROL_CLOCK RCC_APB2Periph_GPIOD //默认LCD12864的控制口时钟 #define LCD_DATAPORT_CLOCK RCC_APB2Periph_GPIOD //默认LCD12864的数据口时钟 #define LCD_RS_1 LCD_CONTROL->BSRR &=~LCD_RS_Pin;LCD_CONTROL->BSRR |=LCD_RS_Pin //RS置高电平 #define LCD_RS_0 LCD_CONTROL->BRR &=~LCD_RS_Pin;LCD_CONTROL->BRR |=LCD_RS_Pin //RS置低电平 #define LCD_RW_1 LCD_CONTROL->BSRR &=~LCD_RW_Pin;LCD_CONTROL->BSRR |=LCD_RW_Pin //RW置高电平 #define LCD_RW_0 LCD_CONTROL->BRR &=~LCD_RW_Pin;LCD_CONTROL->BRR |=LCD_RW_Pin //RW置低电平 #define LCD_EN_1 LCD_CONTROL->BSRR &=~LCD_EN_Pin;LCD_CONTROL->BSRR |=LCD_EN_Pin //EN置高电平 #define LCD_EN_0 LCD_CONTROL->BRR &=~LCD_EN_Pin;LCD_CONTROL->BRR |=LCD_EN_Pin //EN置低电平 用12864显示单色图片 首先介绍本12864液晶显示器: 型号:QC12864B 因为单片机读取的是数据,而不是直接的图片。得将图片进行取模,图片应该是单色图片,像素128*64。 下面我为大家介绍个实例。 ①、在电脑附件画图,首先设置属性 开始画图 保存文件,注意格式: ②、然后进行取模。 ③、编程: #include LCD12864原理与应用 1、LCD12864简介: LCD12864分为两种,带字库的和不带字库的,不带字库的液晶显示汉字的时候可以选择自己喜欢的字体。而带字库的液晶,只能显示GB2312字体,当然也可以显示其他的字体,不过是用图片的形式显示。 下面介绍不带字库的LCD12864,以Proteus中的AMPIRE128×64为例,如下图所示,它的液晶驱动器为KS0108。 与带字库的液晶不同,此块液晶含有两个液晶驱动器,每块驱动器都控制64*64个点,分为左右两个屏幕显示,总共为128*64个点(即有128×64个点)。这就是为什么AMPIRE128*64有CS1和CS2两个片选端的原因。此液晶有8页,一页有8行点阵点,左右各64列,共128列。如下图所示: 2、LCD12864中的几条重要指令 (一)行(line)设置命令: 由此可见显示的起始行地址为0XC0,共64行,有规律地改变起始行号,可以实现滚屏效果。(二)页(page)设置指令: 起始页地址为0XB8,因为液晶有64行点,分为8页,每页就有8行点。 (三)列(column)地址设置指令 每块驱动器的列地址都是从0X40到0X7F,共64列,所以此液晶共有128列点。 (四)读状态指令 3、用LCD12864显示汉字(一) 由于这块液晶不带字库,我们就要自己编写字库,编写字库所用的字模提取软件为Zimo21(软件下载地址https://www.doczj.com/doc/0411156413.html,/),LCD1602显示自定义字符的时候也是用它。在取模之前我们要进行一些设定,根据此液晶的显示原理,设置为“纵向取模,字节倒序”,如下图所示:(若不是这样,则取模得到的数据不是我们想要的,将会出现乱码,同样可以在https://www.doczj.com/doc/0411156413.html,/下载到关于字模提取原理文档) 字体选择默认的“宋体,常规,小四号”,小四号为16*16大小,如下图所示: LCD12864图形液晶并口显示 【教学引入】 液晶屏,在生活中很常见,我们常见的液晶显示器,如电脑的显示器,电视机,手机等等。 液晶屏在生活中已得到了普遍应用,它显示个各种各样的画面。 【教学目标】 1、掌握LCD12864液晶屏的用法; 2、编写LCD12864液晶屏的指令代码; 【知识目标】 1、掌握LCD12864液晶屏的用法; 2、掌握LCD12864液晶屏指令代码; 【教学准备】 电脑、Proteus、Keil 【教学方法】 教法:讲授法、讨论法 学法:练习法、探究法 【教学课时】 四课时 【教学过程】 一、12864液晶介绍 (1)12864是128*64点阵液晶模块的点阵数简称,业界约定俗成的简称。12864点阵的屏显成本相对较低,适用于各类仪器,小型设备的显示领域。12864M汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。 12864引脚说明 查阅“12864M.PDF”12864M液晶显示模块技术手册——四、用户指令集 1、指令表1:(RE=0:基本指令表),如下图,讲解了12864的基本指令集和扩充指令集。 当模块在接受指令前,微处理器必须先确认模块内部处于非忙碌状态,即读取BF标志时BF需为0。“RE”为基本指令集与扩充指令集的选择控制位元,往后的指令集将维持在最后的状态。 当选择G=0 :绘图显示OFF,汉字显示的时,12864屏只能显示8X4=32个汉字,下面是汉字显示的坐标 二、12864液晶屏驱动电路 原件名称所属类(Category) 所属子类(Sub-category) AT89C52 Microprocessor ICs 8051 Family POT-HG Resistors Variable RESPACK-8 Resistors Resistor Packs LCD12864A 自制- AT89C52的P0口连接12864的并行数据口,RP1为P0口的上拉排阻。 三、52代码编写 (1)打开keil uVision4,建立一个新的工程,工程名为"12864 graphic LCD parallel display",保存类型*.uvproj,单片机型号AT89C52。在工程中添加12864 graphic LCD parallel display.c文件,如下图 #include 简介:第一行显示,距离系统爆炸时间 第二行显示,还剩 第三行显示,00时,00分,00秒 第四行显示,周林 按下旋钮开关,开始设定秒,秒编辑位闪动。左右旋转设定数值, 在按下开关,秒确定,设定分,分编辑位闪动左右调数值, 再按下,分确定,小时位闪动。左右转调小时,再按一下。时间确定,开始倒计时。到达定时时间后停止,并闪动。 #include signed char second=0,minute=0,hour=0,count=0,keycount=0; signed char key=0; unsigned char code DIS1[] = { "距离系统爆炸时间" }; unsigned char code DIS2[] = { "还剩:" }; unsigned char code DIS31[] = { "时" }; unsigned char code DIS32[] = { "分" }; unsigned char code DIS33[] = { "秒" }; LCD12864液晶基本程序 #includereg52.h#includeintrins.h#define uchar unsingned char#define uint unsigned intsbit rs=P2;sb it rw=P2 ;sbit e=P2;sb it psb=P2;ucha r table[]=“20100419”;write_12864com(uchar com);write_12864dat(uchar dat);void initinal(void);void display1(void);void display2(void);void display3(void);void delay50us(uint t)//延时函数{ uint j; for(;t0;t--) for(j=6245;j0;j--); }void main() { initnal(); while(1) { display1(); display2(); while(1); } }write_12864com(uchar com) //写程序函数{ rw=0; rs=0; //表明写程序delay_50us(1); P0=com; delay_50us(10); E=0; delay_50us(2); }write_12864dat(uchar dat) //写数据函数{ rw=0; rs=1;//表 明写数据delay_50us(1); P0=dat; delay_50us(10); E=0; delay_50us(2); }void initinal(void) //初始化函数{ delay_50us(1);//等待100 毫秒write_2864com(0x30); delay_50us(4); write_2864com(0x30); delay_50us(4); write_2864com(0x0f); delay_50us(4); write_2864com(0x01);//清平显示delay_50us(240); write_2864com(0x06); delay_50us(10); }void display1(void)//显示码{ uchar a, i; write_12864com(0x80); //写地址delay_50us(1); for(i=0;i16:i++) { write_12864dat(a); //写数据delay_50us(1); a++; }}void display2(void)//显示汉字{ uchar a,b,i; write_12864com(0xBA); //写地址write_12864com(0xC0); delay_50us(1); for(i=0;i16:i++) { write_12864dat(a); write_12864dat(b); //写数据delay_50us(1); b++; }}void display3(void)//更简单的显示函数{ uchar i; write_12864com(0x80); //写地址for(i=0;i16:i++) { write_12864dat(table[i]); delay_50us(1); i++; }}tips:感谢大家的阅读,本文由我司收集整编。仅供参阅! #ifndef jh_f330 #define jh_f330 #include 12864显示一个动态图片 姓名:周潘勇班级:电子0911 程序: #includeLCD12864显示程序
12864液晶显示图片原理(完整版)
玩转12864液晶(1)--显示字符
LCD12864写字符串程序及其头文件
LCD显示程序
12864显示图形
基于STM32--LCD12864驱动程序
在12864显示任意图片及参考程序
LCD12864原理与应用(源程序+原理图+proteus仿真)
LCD12864图形液晶并口显示
12864液晶显示程序(图案+文字)
12864LCD显示倒计时程序
LCD12864液晶基本程序
LCD12864(串口)显示程序
12864动态显示图片-仿真图及程序