📄 main.c
字号:
/*============================================================
LPC214X kit 学习板 液晶功能演示
作者: Mingtree ycxms88@163.com http://www.mcu123.com
液晶型号:RT1602C
==============================================================
*/
#include <LPC214X.H> /* LPC214x definitions */
#define uchar unsigned char
#define uint unsigned int
#define RW 22 //读写控制端 0为写 1为读
#define RS 4 //A0为1时是数据,0时为指令数据
#define Elcm 21 //
#define busy 0x0800
unsigned char const mcu123[]="WWW.MCU123.COM" ;
void Io_Set(uchar pin) //单个IO口置位函数
{
unsigned int io_data=1;
io_data=io_data<<pin;
IOSET0=io_data; //IOSET0为IO线上置位寄存器,1有效,0无
}
void Io_Clr(uchar pin) //单个IO口清零函数
{
unsigned int io_data=1;
io_data=io_data<<pin;
IOCLR0=io_data; //IOCLR0为IO线上清零寄存器,1有效,0无
}
void Io_Set1(uchar pin) //单个IO口置位函数
{
unsigned int io_data=1;
io_data=io_data<<pin;
IOSET1=io_data; //IOSET0为IO线上置位寄存器,1有效,0无
}
void Io_Clr1(uchar pin) //单个IO口清零函数
{
unsigned int io_data=1;
io_data=io_data<<pin;
IOCLR1=io_data; //IOCLR0为IO线上清零寄存器,1有效,0无
}
void Sent_Byte(unsigned char data)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(data&1) {Io_Set1(i+16);} //把相应的IO口置位或者清零
else {Io_Clr1(i+16);}
data=data>>1;
}
}
//延时
void delay(unsigned int i)
{
unsigned int k=1000;
while(i>0)
{
i--;
}
while(k>1)k--;
}
void delayms (unsigned int i) { /* Delay function */
unsigned int n;
while(i>1)
{
for(n=65535;n>1;n--);
i--;
}
}
void delay1s(unsigned char i)
{
while(i>1)
{
i--;
delayms(20);
}
}
void init_port(void)
{
//port initialized
IODIR1=0x00FF0000;
IODIR0=0x40600010;
}
/*=======================================================
正常读写操作之前必须检测LCD控制器状态: CS=1 RS=0 RW=1
DB7: 0 LCD控制器空闲; 1 LCD控制器忙
========================================================*/
void WaitForEnable( void ) {
//unsigned int i;
Io_Clr(RS);
delay(1);
Io_Set(RW);
delay(1);
Io_Set(Elcm);
delayms(10);
// i=IO1PIN; //读P1
while( IO1PIN & busy );
Io_Clr(Elcm);
}
/*=======================================================
写控制字符子程序: E=1 RS=0 RW=0
=======================================================*/
void LcdWrite_CMD( uchar CMD,uchar AttribC ) {
if (AttribC) WaitForEnable(); // 检测忙信号?
Io_Clr(RS);
delay(1);
Io_Clr(RW);
delay(1);
Sent_Byte(CMD);
Io_Set(Elcm);
delay(1);
delay(1);
Io_Clr(Elcm);
delay(1);
}
/*=======================================================
当前位置写字符子程序: E =1 RS=1 RW=0
=======================================================*/
void LcdWrite_D( char dataW ) {
WaitForEnable(); // 检测忙信号
Io_Set(RS);
delay(1);
Io_Clr(RW);
delay(1);
Sent_Byte(dataW);
Io_Set(Elcm);
delay(1);
Io_Clr(Elcm);
delay(1);
}
/*=======================================================
显示光标定位
=======================================================*/
void LocateXY( char posx,char posy) {
uchar temp;
temp = posx & 0xf;
posy &= 0x1;
if ( posy )temp |= 0x40;
temp |= 0x80;
LcdWrite_CMD(temp,0);
}
/*=======================================================
按指定位置显示数出一个字符
=======================================================*/
void DispOneChar(uchar x,uchar y,uchar Wdata) {
LocateXY( x, y ); // 定位显示地址
LcdWrite_D( Wdata ); // 写字符
}
/*=======================================================
显示字符串
=======================================================*/
void disp(uchar x,uchar y,const unsigned char *ptr) {
uchar i,l=0;
while (ptr[l] >31){l++;};
for (i=0;i<l;i++) {
DispOneChar(x++,y,ptr[i]);
if ( x == 16 ){
x = 0; y ^= 1;
}
}
}
//初始化
void lcdreset(void)
{
LcdWrite_CMD(0x38, 0); //显示模式设置(不测试忙信号)共三次
delayms(50);
LcdWrite_CMD(0x38, 0);
delayms(50);
LcdWrite_CMD(0x38, 0);
delayms(50);
LcdWrite_CMD( 0x38, 1);
LcdWrite_CMD( 0x08, 1);
LcdWrite_CMD( 0x01, 1);
LcdWrite_CMD( 0x06, 1);
LcdWrite_CMD( 0x0f, 1);
}
int main(void)
{ init_port();
delayms(1);
lcdreset(); //初始化
delay1s(1);
disp(0,0,mcu123);
disp(0,1,"www.mcu123.net");
while(1)
{
//disp(0,0,mcu123);
delay1s(1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -