实验原理
ARM的P0.0口到P0.10口接LCD,P0.11接LED。每过一段时间LED状态改变,LCD显示LED的状态。
Proteus仿真电路图
image.png
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();
  •                 }              
  • }
  • 复制代码