原创 aduc7026控制1602液晶源程序,试试吧

2009-8-7 15:37 1794 1 1 分类: MCU/ 嵌入式


/*******************************************************
  功能:1602液晶测试
*******************************************************/
#include<aduc7026.h>


/****管脚定义*******
  并行控制
  RS    P2.6  寄存器选择 H Data L Com 
  RW    P1.0  读写选择   H Read L Write 
  E  P1.1  使能信号
  LCDBK P0.4  背光
  D0-D7 P3.0-P3.7
*******************/
/***** 管脚操作定义****/
#define  SETRS    GP2SET = 0x00400000
#define  CLRRS    GP2CLR = 0x00400000 
#define  SETRW    GP1SET = 0x00010000
#define  CLRRW    GP1CLR = 0x00010000 
#define  SETE     GP1SET = 0x00020000
#define  CLRE     GP1CLR = 0x00020000
/******************************************************************/
/*                    函数声明                                    */
/******************************************************************//***************************************************************/
void SysClkInit(unsigned char clk)
{
  PLLKEY1=0xAA;
  PLLCON="0x01";   // PLL配置 
  PLLKEY2=0x55;
  POWKEY1=0x01;
  POWCON="clk";  // CPU时钟配置为41.78MHz
  POWKEY2=0xF4;
}
/******************************************************************/
void DelayUs(unsigned char us)//delay us
{
 unsigned char uscnt;
 uscnt=us>>1;
 while(--uscnt);
}
/******************************************************************/
void DelayMs(unsigned char ms)//delay Ms
{
 while(--ms)
   {
     DelayUs(250);
     DelayUs(250);
  DelayUs(250);
  DelayUs(250);
   }
}
/******************************************************************/
void WriteCommand(unsigned char data1)
{
   unsigned long int data;
   data = data1;
   data = data<<16;
   data |= 0xFF000000;


   DelayMs(5);
   SETE;  // E="0";
   CLRRS; // RS="0";
   CLRRW; // RW="0";
   __asm  // 嵌入汇编语言延时
   NOP
   SETE;  // E="1";
   GP3DAT = data;
   CLRE;  // E="0";
}
/****************************************************************/
void WriteData(unsigned char data1)
{
   unsigned long int data;
   data = data1;
   data = data<<16;
   data |= 0xFF000000;


   DelayMs(5);  
   SETE;    // E="0";
   SETRS;   // RS="1";
   CLRRW;   // RW="0";
    __asm // 嵌入汇编语言延时
   NOP
   SETE;    // E="1";
   GP3DAT = data; // Data="c";
   CLRE;    // E="0";
   CLRRS;   // RS="0";
}
/***************************************************************
   函数说明:
           row : 行,line : 列,*ptr : 数组指针,num :字符个数
***************************************************************/
void ShowString (unsigned char row,unsigned char line,char *ptr,int num)
{
   unsigned char add,i;
   switch(row)
   {
   case 1: add="0x00";break;
  case 2: add="0xC0";break;
  default :add=0x00;break;
   }
   WriteCommand (add+line-1);//写命令
   DelayUs(5);
   for(i=0;i<num;i++)
   {
      WriteData (*(ptr+i));
   DelayUs(5);
   }
}
/*********************************************************************/
void InitLcd()
{
   GP0DAT = 0x10000000; // 开背光
   DelayMs(15);
   WriteCommand(0x38); //设定显示模式
   WriteCommand(0x38); //设定显示模式
   WriteCommand(0x38); //设定显示模式
   WriteCommand(0x06); //显示光标移动位置
   WriteCommand(0x0c); //显示开及光标设置
   WriteCommand(0x01); //显示清屏


}
/******************************************************************/
void main(void)


{
  const unsigned char Test1[]={"  ADuC7026test  "};
  const unsigned char Test2[]={"LCD1602 Test ok!"};
  SysClkInit(2);
  GP1DAT |= 0x03000000;  // 配置P1.0和P1.1为输出
  GP2DAT |= 0x40000000;  // 配置P2.6为输出
  InitLcd();
  DelayMs(15);
  ShowString(1,1,Test1,16);
  ShowString(2,1,Test2,16);
  while(1);


}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
1
关闭 站长推荐上一条 /4 下一条