实验原理
ARM的P0.0口到P0.10口接LCD,P0.11接LED。每过一段时间LED状态改变,LCD显示LED的状态。
Proteus仿真电路图
C语言源程序
#include <LPC21XX.H>#define rs (1<<8) #define rw (1<<9) #define en (1<<10) #define busy (1<<7) //P0.7 typedef unsigned char uint8; uint8 ledDown[]={"The LED is down!"}; uint8 ledUp[]={"The LED is up!"}; void waitLCD() /*等待LCD*/ { IO0DIR=0xf00; while(1) { IO0CLR=rs; IO0SET=rw; IO0SET=en; if(!(IO0PIN & busy))break; IO0CLR = en; } IO0DIR=0xfff; } void lcdOp(uint8 dat)/*送LCD控制码*/ { waitLCD(); IO0CLR=rs; IO0CLR=rw; IO0CLR=0xff; IO0SET=dat; IO0SET=en; IO0CLR=en; } void lcdData(uint8 dat)/*送LCD显示数据*/ { waitLCD(); IO0SET=rs; IO0CLR=rw; IO0CLR=0xff; IO0SET=dat; IO0SET=en; IO0CLR=en; } void lcdInit(void)/*初始化LCD,DataSheet里有建议的初始化代码*/ { /* LCD配置为两行,5*7字体 */ lcdOp(0x38); lcdOp(0x38); lcdOp(0x06); lcdOp(0x0E); lcdOp(0x01); /* LCD配置为一行,5*10字体 lcdOp(0x34); lcdOp(0x34); lcdOp(0x06); lcdOp(0x0E); lcdOp(0x01); */ } void lcdDisplay(uint8 addr,uint8 *p)/*LCD显示字符串*/ { lcdOp(addr); while(*p !='\0'){ lcdData(*(p++)); } } void lcdClear(void)/*LCD清屏*/ { lcdOp(0x01); } void delay (void) { unsigned volatile long i,j; for(i=0;i<60000;i++) for(j=0;j<10;j++) ; } int main(void) { lcdInit();/*初始化LCD显示*/ IO0DIR=0xfff;//设置为输出口 IO0CLR=0xfff; while (1) { IO0CLR = 0x000800; lcdDisplay(0x80,ledUp); delay(); lcdClear(); IO0SET = 0x000800; lcdDisplay(0x80,ledDown); delay(); lcdClear(); } }
复制代码