📄 lcd显示主程序.c
字号:
for(i=0;i<16;i++) // 下半部分
{Wrdata(Hzk[x]);
x++;
col++;
if (col==LCMLIMIT)
{col=0;row++;row++;} // 下一列,如果列越界换行
if (row>7)
row=1; // 如果行越界,返回首行
} // 下半个字符输出结束
row = bakery;
} // 整个字符输出结束
/***************************************************************************
清屏,全屏幕清零
***************************************************************************/
void Lcmcls( void )
{for(row=0;row<8;row++)
for(col=0;col<LCMLIMIT;col++)
Wrdata(0);
}
/***************************************************************************
从液晶片上读数据,保留在全局变量中
***************************************************************************/
void Rddata(void)
{Locatexy(); // 坐标定位,返回时保留分区状态不变
//P2OUT = 0xFF;
P1OUT |= BIT5; // 数据
P1OUT |= BIT6; // 读数据
P1OUT |= BIT7; // 读入到LCM
P1DIR &= ~BIT0;
_NOP();
cbyte = P2IN; // 虚读一次
P1OUT &= ~BIT7;
Locatexy(); // 坐标定位,返回时保留分区状态不变
//P2OUT = 0xFF;
_NOP();
P1OUT |= BIT5; // 数据
P1OUT |= BIT6; // 读数据
P1OUT |= BIT7; // 读入到LCM
_NOP();
cbyte = P2IN; // 从数据口读数据,真读
P1OUT &= ~BIT7;
P1DIR &= ~BIT0;
}
/***************************************************************************
数据写输出
***************************************************************************/
void Wrdata(unsigned char X)
{Locatexy(); // 坐标定位,返回时保留分区状态不变
wtcom();
P1OUT |= BIT5; // 数据输出
P1OUT &= ~BIT6; // 写输出
P2OUT = X; // 数据输出到数据口
P1OUT |= BIT7; // 读入到LCM
_NOP();
P1OUT &= ~BIT7;
}
/***************************************************************************
命令输出,每次输出一个分区控制口
***************************************************************************/
// void Wrcmd(unsigned char X)
// {Locatexy(); /*确定分区,返回时保留分区状态不变 */
// wtcom(); /*等待LCM操作允许 */
// Dilcm = 0; /*数据操作 */
// Rwlcm = 0; /*写输出 */
// Datalcm = X; /*数据输出到数据口 */
// Elcm = 1;_nop_();Elcm = 0; /*读入到LCM*/
// }
/***************************************************************************
命令输出到左区控制口
***************************************************************************/
void WrcmdL(unsigned char X)
{lcdbusyL(); // 确定分区,返回时保留分区状态不变
P1OUT &= ~BIT5; // 命令操作
P1OUT &= ~BIT6; // 写输出
P2OUT = X; // 数据输出到数据口
P1OUT |= BIT7; // 读入到LCM
_NOP();
P1OUT &= ~BIT7;
}
/***************************************************************************
命令输出到中区控制口
***************************************************************************/
void WrcmdM(unsigned char X)
{lcdbusyM(); // 确定分区,返回时保留分区状态不变
P1OUT &= ~BIT5; // 命令操作
P1OUT &= ~BIT6; // 写输出
P2OUT = X; // 数据输出到数据口
P1OUT |= BIT7; // 读入到LCM
_NOP();
P1OUT &= ~BIT7;
}
/***************************************************************************
命令输出到右区控制口
***************************************************************************/
void WrcmdR(unsigned char X)
{lcdbusyR(); // 确定分区,返回时保留分区状态不变
P1OUT &= ~BIT5; // 命令操作
P1OUT &= ~BIT6; // 写输出
P2OUT = X; // 数据输出到数据口
P1OUT |= BIT7; // 读入到LCM
_NOP();
P1OUT &= ~BIT7;
}
/***************************************************************************
分区操作允许等待,返回时保留分区选择状态
***************************************************************************/
void lcdbusyL(void)
{P1OUT &= ~BIT4;
P1OUT &= ~BIT3;
wtcom(); // waitting for enable
}
void lcdbusyM(void)
{P1OUT |= BIT4;
P1OUT &= ~BIT3;
wtcom(); // waitting for enable
}
void lcdbusyR(void)
{P1OUT &= ~BIT4;
P1OUT |= BIT3;
wtcom(); // waitting for enable
}
void wtcom(void)
{P1OUT &= ~BIT5; // CLR DI
P1OUT |= BIT6; // SETB RW
//P2OUT = 0xFF; // MOV DATA_LCM,#0FFH
P1DIR &= ~BIT0;
P1OUT |= BIT7;
_NOP();
while(P2IN & Lcdbusy);
P1OUT &= ~BIT7;
P1DIR |= BIT0;
}
/***************************************************************************
根据设定的坐标数据,定位LCM上的下一个操作单元位置
***************************************************************************/
void Locatexy(void)
{unsigned char x,y;
switch (col&0xc0) // col.and.0xC0
{case 0: {lcdbusyL();break;} // 左区
case 0x40: {lcdbusyM();break;} // 中区
case 0x80: {lcdbusyR();break;} // 右区
}
x = col&0x3F|SETX; // col.and.0x3f.or.setx
y = row&0x07|SETY; // row.and.0x07.or.sety
wtcom(); // waitting for enable
P1OUT &= ~BIT5; // CLR DI
P1OUT &= ~BIT6; // CLR RW
P2OUT = y; // MOV P0,Y
P1OUT |= BIT7;
_NOP();
P1OUT &= ~BIT7;
wtcom(); // waitting for enable
P1OUT &= ~BIT5; // CLR DI
P1OUT &= ~BIT6; // CLR RW
P2OUT = x; // MOV P0,Y
P1OUT |= BIT7;
_NOP();
P1OUT &= ~BIT7;
}
/***************************************************************************
时钟初始化
***************************************************************************/
void InitCLK(void)
{unsigned int iq0;
BCSCTL1 &= ~XT2OFF; // 打开XT2振荡器
do
{IFG1 &= ~OFIFG; // 清除振荡器失效标志
for(iq0=0xFF;iq0>0;iq0--); // 延时,等待XT2起振
}
while((IFG1 &OFIFG)!= 0); // 判断XT2是否起振
BCSCTL2=SELM_2+SELS; // MCLK SMCLK的时钟源为TX2CLK
}
/***************************************************************************
端口初始化
***************************************************************************/
void InitPort(void)
{P1DIR = 0xFF; // 设置P1~P2端口为输出方式
P2DIR = 0xFF;
P1SEL = 0; // 将P1~P2端口设置为一般I/O口
P2SEL = 0;
}
/***************************************************************************
液晶屏初始化
***************************************************************************/
void Lcminit(void)
{cbyte = DISPOFF; // 关闭显示屏
WrcmdL(cbyte);
WrcmdM(cbyte);
WrcmdR(cbyte);
cbyte = DISPON; // 打开显示屏
WrcmdL(cbyte);
WrcmdM(cbyte);
WrcmdR(cbyte);
cbyte = DISPFIRST; // 定义显示起始行为零
WrcmdL(cbyte);
WrcmdM(cbyte);
WrcmdR(cbyte);
Lcmcls(); // 清屏
col=0;
row=0;
Locatexy();
}
/***************************************************************************
延时
***************************************************************************/
void Delay(unsigned char MS)
{unsigned char us,usn;
while(MS!=0)
{usn = 4;
while(usn!=0)
{us=0xf0;
while (us!=0){us--;};
usn--;
}
MS--;
}
}
/***************************************************************************
定义字符串数组
***************************************************************************/
unsigned char STR1[]={
0x80,0x81,0x82,0x83,0x84,0x85,
0x86,0x87,0x88,0x89,0x8a,0x8B
};
unsigned char STR2[]="Our friend over the wold";
unsigned char STR3[]="Program by Keil C51 6.12";
unsigned char STR4[]="Thank you ~v~ 1234567890";
/***************************************************************************
定义中文字库
***************************************************************************/
unsigned char Hzk[]={
/*茂 C3515 0 */
0x04,0x04,0xC4,0x44,0x5F,0x44,0x44,0xF4,
0x44,0x4F,0x54,0x64,0x44,0x46,0x04,0x00,
0x80,0x40,0x3F,0x00,0x40,0x40,0x20,0x20,
0x13,0x0C,0x18,0x24,0x43,0x80,0xE0,0x00,
/*兴 C4843 1 */
0x00,0xFE,0x4A,0x4A,0x00,0xFE,0xEA,0xAA,
0xAA,0xFE,0x00,0x4A,0x4A,0xFE,0x00,0x00,
0x02,0x83,0x42,0x22,0x12,0x1B,0x02,0x02,
0x02,0x0B,0x12,0x22,0x62,0xC3,0x02,0x00,
/*国 C2590 2 */
0x00,0xFE,0x02,0xD2,0x52,0x52,0xD2,0x3E,
0xD2,0x16,0x1A,0x12,0xFF,0x02,0x00,0x00,
0x00,0xFF,0x50,0x53,0x52,0x4A,0x6B,0x50,
0x4F,0x54,0x7B,0x40,0xFF,0x00,0x00,0x00,
/*际 C2842 3 */
0x00,0xFE,0x22,0xD2,0x0E,0x20,0xB8,0x4F,
0xB2,0x9E,0x80,0x9F,0x72,0x8A,0x06,0x00,
0x00,0xFF,0x04,0x08,0x07,0x21,0x12,0x0A,
0x46,0x82,0x7E,0x06,0x0A,0x12,0x31,0x00,
/*( C0308 4 */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xC0,0x30,0x08,0x04,0x02,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0x0C,0x10,0x20,0x40,0x00,0x00,
/*广 C2567 5 */
0x00,0x00,0xFC,0x44,0x54,0x54,0x7C,0x55,
0xD6,0x54,0x7C,0x54,0x54,0x44,0x44,0x00,
0x80,0x60,0x1F,0x80,0x9F,0x55,0x35,0x15,
0x1F,0x15,0x15,0x35,0x5F,0x80,0x00,0x00,
/*东 C2211 6 */
0x00,0x08,0xE8,0xA8,0xA8,0xA8,0xA8,0xFF,
0xA8,0xA8,0xA8,0xA8,0xE8,0x0C,0x08,0x00,
0x00,0x40,0x23,0x12,0x0A,0x06,0x02,0xFF,
0x02,0x06,0x0A,0x12,0x23,0x60,0x20,0x00,
/*) C0309 7 */
0x00,0x00,0x02,0x04,0x08,0x30,0xC0,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x40,0x20,0x10,0x0C,0x03,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*有 C5148 8 */
0x04,0x04,0x04,0x84,0xE4,0x3C,0x27,0x24,
0x24,0x24,0x24,0xF4,0x24,0x06,0x04,0x00,
0x04,0x02,0x01,0x00,0xFF,0x09,0x09,0x09,
0x09,0x49,0x89,0x7F,0x00,0x00,0x00,0x00,
/*限 C4762 9 */
0x00,0xFE,0x02,0x22,0xDA,0x06,0x00,0xFE,
0x92,0x92,0x92,0x92,0xFF,0x02,0x00,0x00,
0x00,0xFF,0x08,0x10,0x08,0x07,0x00,0xFF,
0x42,0x24,0x08,0x14,0x22,0x61,0x20,0x00,
/*公 C2511 10 */
0x00,0x00,0x80,0x40,0x30,0x0C,0x00,0xC0,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -