📄 lcd.c
字号:
#include "c8051f040.h"
#include <intrins.h> // 液晶点阵显示试验 -128*64,控制器DM12864I
#define LCD_DATA P7
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_E = P2^2;
sbit LCD_CS1 = P2^6;
sbit LCD_CS2 = P2^7;
void Delay1us(unsigned char);
void Delay1ms(unsigned char);
void Delay1s(unsigned char T);
char code zero[]={
0xF8,0xFC,0x04,0xC4,0x24,
0xFC,0xF8,0x00,0x07,0x0F,
0x09,0x08,0x08,0x0F,0x07,
0x00
};
char code one[]={
0x00,0x10,0x18,0xFC,0xFC,
0x00,0x00,0x00,0x00,0x08,
0x08,0x0F,0x0F,0x08,0x08,
0x00
};
char code two[]={
0x08,0x0C,0x84,0xC4,0x64,
0x3C,0x18,0x00,0x0E,0x0F,
0x09,0x08,0x08,0x0C,0x0C,
0x00
};
char code three[]={
0x08,0x0C,0x44,0x44,0x44,
0xFC,0xB8,0x00,0x04,0x0C,
0x08,0x08,0x08,0x0F,0x07,
0x00
};
char code four[]={
0xC0,0xE0,0xB0,0x98,0xFC,
0xFC,0x80,0x00,0x00,0x00,
0x00,0x08,0x0F,0x0F,0x08,
0x00
};
char code five[]={
0x7C,0x7C,0x44,0x44,0xC4,
0xC4,0x84,0x00,0x04,0x0C,
0x08,0x08,0x08,0x0F,0x07,
0x00
};
char code six[]={
0xF0,0xF8,0x4C,0x44,0x44,
0xC0,0x80,0x00,0x07,0x0F,
0x08,0x08,0x08,0x0F,0x07,
0x00
};
char code seven[]={
0x0C,0x0C,0x04,0x84,0xC4,
0x7C,0x3C,0x00,0x00,0x00,
0x0F,0x0F,0x00,0x00,0x00,
0x00
};
char code eight[]={
0xB8,0xFC,0x44,0x44,0x44,
0xFC,0xB8,0x00,0x07,0x0F,
0x08,0x08,0x08,0x0F,0x07,
0x00
};
char code nine[]={
0x38,0x7C,0x44,0x44,0x44,
0xFC,0xF8,0x00,0x00,0x08,
0x08,0x08,0x0C,0x07,0x03,
0x00
};
char code chen[]={
0x00, 0xfe, 0x22, 0x5a, 0x86, 0x08, 0x88, 0x48, 0x38, 0x0f, 0xe8, 0x08, 0x88, 0x0c, 0x08, 0x00, 0x00, 0xff, 0x04, 0x08, 0x07, 0x20, 0x11, 0x0d, 0x41, 0x81, 0x7f, 0x01, 0x05, 0x19, 0x30, 0x00
};
char code hao[]={0x00, 0x00, 0x80, 0xbe, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xbf, 0x82, 0x00, 0x00, 0x00, 0x04, 0x84, 0x84, 0x44, 0x44, 0x24, 0x14, 0x0f, 0x14, 0x24, 0x24, 0x44, 0xc4, 0x46, 0x04, 0x00};
char code wen[]={
0x00, 0xfc, 0x01, 0x12, 0x16, 0xf0, 0x52, 0x52, 0x52, 0xf2, 0x1a, 0x12, 0x02, 0xff, 0x02, 0x00, 0x00, 0xff, 0x00, 0x08, 0x08, 0x0f, 0x09, 0x09, 0x09, 0x7f, 0x08, 0x48, 0x80, 0x7f, 0x00, 0x00
};
char code niao[]={0x00, 0x00, 0x00, 0xfc, 0x04, 0x16, 0x65, 0x04, 0x84, 0x04, 0xfe, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x13, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x5a, 0x92, 0x42, 0x3f, 0x02, 0x00};
char code ren[]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x0c, 0x03, 0x00, 0x03, 0x0c, 0x10, 0x20, 0x40, 0xc0, 0x40, 0x00};
#define SELECTCS 1
void LCD_WriteCommand1(char ch) //向LCD控发送控制命令 左半边
{
LCD_CS1=SELECTCS;
LCD_CS2=!SELECTCS;
LCD_RW=0;
LCD_RS=0;
LCD_DATA=ch;
LCD_E=1;
Delay1us(30);
LCD_E=0;
}
void LCD_WriteCommand2(char ch) //向LCD控制发送控制命令 右半边
{
LCD_CS2=SELECTCS;
LCD_CS1=!SELECTCS;
LCD_RW=0;
LCD_RS=0;
LCD_DATA=ch;
LCD_E=1;
Delay1us(30);
LCD_E=0;
}
void LCD_WriteData1(char ch) //发送数据 左半边
{
LCD_CS1=SELECTCS;
LCD_CS2=!SELECTCS;
LCD_RW=0;
LCD_RS=1;
LCD_DATA=ch;
LCD_E=1;
Delay1us(30);
LCD_E=0;
}
void LCD_WriteData2(char ch) //发送数据 右半边
{
LCD_CS1=!SELECTCS;
LCD_CS2=SELECTCS;
LCD_RW=0;
LCD_RS=1;
LCD_DATA=ch;
LCD_E=1;
Delay1us(30);
LCD_E=0;
// LCD_CS1=!SELECTCS;
}
void InitLCD(void) //初始化LCD
{
char i,j;
LCD_WriteCommand1(0xc0);
LCD_WriteCommand2(0xc0);
LCD_WriteCommand1(0x3f); //开显示 和设定起始行
LCD_WriteCommand2(0x3f);
for (j=0;j<8;j++) //清屏
{
LCD_WriteCommand1(0xB8+j); //清左半屏
LCD_WriteCommand1(0x40);
for (i=0;i<64;i++)
LCD_WriteData1(0x00);
LCD_WriteCommand2(0xB8+j); //清右半屏
LCD_WriteCommand2(0x40);
for (i=0;i<64;i++)
LCD_WriteData2(0x00);
}
}
void LCD_WriteHZ(char x,char y,char *HZ) //显示16*16点阵汉字 x表示起始页,y表示起始列(对于整个液晶来说)
{
unsigned char i;
Delay1ms(15);
for (i=0;i<32;i++)
{
if ((y+i%16)<64) //64列以内显示在左半屏
{
LCD_WriteCommand1(0xb8+x+i/16);
LCD_WriteCommand1(0x40+y+i%16);
LCD_WriteData1(HZ[i]);
}
else //64列以外显示在右半屏
{
LCD_WriteCommand2(0xb8+x+i/16);
LCD_WriteCommand2(0x40+y-64+i%16);
LCD_WriteData2(HZ[i]);
}
}
}
void LCD_WriteSZ(char x,char y,char *SZ) //显示8*16点阵数字 x表示起始页,y表示起始列(对于整个液晶来说)
{
unsigned char i;
Delay1ms(8);
for (i=0;i<16;i++)
{
if ((y+i%8)<64) //64列以内显示在左半屏
{
LCD_WriteCommand1(0xB8+x+i/8);
LCD_WriteCommand1(0x40+y+i%8);
LCD_WriteData1(SZ[i]);
}
else //64列以外显示在右半屏
{
LCD_WriteCommand2(0xB8+x+i/8);
LCD_WriteCommand2(0x40+y-64+i%8);
LCD_WriteData2(SZ[i]);
}
}
}
void TestLCD(void){
LCD_WriteSZ(0,0,zero);
/*LCD_WriteSZ(0,8,one);
Delay1ms(100);
LCD_WriteSZ(0,16,two);
Delay1ms(100);
LCD_WriteSZ(0,24,three);
Delay1ms(100);
LCD_WriteSZ(0,32,four);
Delay1ms(100);
LCD_WriteSZ(0,40,five);
Delay1ms(100);
LCD_WriteSZ(0,48,six);
Delay1ms(100);
LCD_WriteSZ(0,56,seven);
Delay1ms(100);
LCD_WriteSZ(0,64,eight);
Delay1ms(100);
LCD_WriteSZ(0,72,nine);
Delay1ms(100);
LCD_WriteSZ(0,80,nine);
Delay1ms(100);
LCD_WriteSZ(0,88,eight);
Delay1ms(100);
LCD_WriteSZ(0,96,seven);
Delay1ms(100);
LCD_WriteSZ(0,104,six);
Delay1ms(100);
LCD_WriteSZ(0,112,five);
Delay1ms(100);
LCD_WriteSZ(0,120,four);
Delay1ms(100);
LCD_WriteSZ(0,128,three);
Delay1ms(100);*/
LCD_WriteSZ(2,0,two);
//LCD_WriteSZ(2,8,one);
//Delay1ms(100);
//LCD_WriteSZ(2,16,zero);
Delay1ms(100);
}
void Port_IO_Init()
{
// P0.0 - Unassigned, Open-Drain, Digital
// P0.1 - Unassigned, Open-Drain, Digital
// P0.2 - Unassigned, Open-Drain, Digital
// P0.3 - Unassigned, Open-Drain, Digital
// P0.4 - Unassigned, Open-Drain, Digital
// P0.5 - Unassigned, Open-Drain, Digital
// P0.6 - Unassigned, Open-Drain, Digital
// P0.7 - Unassigned, Open-Drain, Digital
// P1.0 - Unassigned, Open-Drain, Digital
// P1.1 - Unassigned, Open-Drain, Digital
// P1.2 - Unassigned, Open-Drain, Digital
// P1.3 - Unassigned, Open-Drain, Digital
// P1.4 - Unassigned, Open-Drain, Digital
// P1.5 - Unassigned, Open-Drain, Digital
// P1.6 - Unassigned, Open-Drain, Digital
// P1.7 - Unassigned, Open-Drain, Digital
// P2.0 - Unassigned, Open-Drain, Digital
// P2.1 - Unassigned, Open-Drain, Digital
// P2.2 - Unassigned, Open-Drain, Digital
// P2.3 - Unassigned, Open-Drain, Digital
// P2.4 - Unassigned, Open-Drain, Digital
// P2.5 - Unassigned, Open-Drain, Digital
// P2.6 - Unassigned, Open-Drain, Digital
// P2.7 - Unassigned, Open-Drain, Digital
// P3.0 - Unassigned, Open-Drain, Digital
// P3.1 - Unassigned, Open-Drain, Digital
// P3.2 - Unassigned, Open-Drain, Digital
// P3.3 - Unassigned, Open-Drain, Digital
// P3.4 - Unassigned, Open-Drain, Digital
// P3.5 - Unassigned, Open-Drain, Digital
// P3.6 - Unassigned, Open-Drain, Digital
// P3.7 - Unassigned, Open-Drain, Digital
SFRPAGE = CONFIG_PAGE;
P2MDOUT = 0xFF;
P3MDOUT = 0xFF;
P4MDOUT = 0xFF;
P5MDOUT = 0xFF;
P6MDOUT = 0xFF;
P7MDOUT = 0xFF;
XBR0 = 0x04;
XBR1 = 0x04;
XBR2 = 0x40;
XBR3 = 0x00;
}
void Oscillator_Init()
{
SFRPAGE = CONFIG_PAGE;
OSCICN = 0x83;
}
void Delay1us(unsigned char T)
{ while(T){
T--;
}
}
void Delay1ms(unsigned char T)
{
while (T)
{
Delay1us(200);
Delay1us(200);
Delay1us(200);
Delay1us(200);
Delay1us(200);
T--;
}
}
void Delay1s(unsigned char T)
{
while (T)
{
Delay1ms(200);
Delay1ms(200);
Delay1ms(200);
Delay1ms(200);
Delay1ms(200);
T--;
}
}
void main(){
WDTCN = 0x07;
WDTCN = 0xde;
WDTCN = 0xad; //关看门狗
Port_IO_Init();
Oscillator_Init();
InitLCD();
TestLCD();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -