原创 给大家贴个利用1602动态显示字符串的完整程序

2009-11-1 21:01 3716 10 10 分类: MCU/ 嵌入式

#include<reg52.H>
#include <stdio.h>
#include<string.h>
#define uchar unsigned char


sfr lcd_data=0x80;
sbit lcd_E=P0^0;
sbit lcd_RW=P0^1;
sbit lcd_RS=P0^2;
sbit P3_4=P3^4;
sbit P3_5=P3^5;
sbit P3_6=P3^6;


unsigned char code show1[]="Welcome";
unsigned char code show2[]="Friend";
unsigned char code show3[]="Welcome gj";
unsigned char code show4[]="Friendship";
unsigned char code show5[]="Welcome ftl";
unsigned char code show6[]="Friendship";
unsigned char code show7[]="Welcome wf";
unsigned char code show8[]="Friendship";
unsigned char temp;
unsigned char key;
uchar i,j,k;



/****************************延时函数


**************************/
/*函数原型:void f_v_delay5ms(void)
/*函数功能:延时
/*输入参数:无
/*输出参数:无
///***********************************************


***********************/
void f_v_delay5ms(void)
{
 unsigned char i;
 unsigned char j;
 for(i=0;i<100;i++)
 {
  for(j=0;j<250;j++)
   ;
 }
}
void f_v_delay50us(void)
{
 unsigned char i;
 for(i=0;i<50;i++)
  {;}
}
void f_v_delay2ms(void)
{
 unsigned char i;
 unsigned char j;
 for(i=0;i<200;i++)
 {
  for(j=0;j<50;j++)
   ;
 }
}


void f_v_delay10ms(void)
{
 f_v_delay5ms();
 f_v_delay5ms();
}


//*lcd显示*/
/****************************1602A读状态函数


**************************/
/*函数原型:unsigned char f_uc_lcdReadStatus(void)
/*函数功能:1602A读状态
/*输入参数:无
/*输出参数:1602A返回的状态
/*调用模块:
///***********************************************


***********************/


void f_uc_lcdReadStatus(void)
{
    lcd_data=0xff;   
    lcd_RS = 0;   
    lcd_RW = 1;       
    lcd_E = 1;
 f_v_delay50us();
 while(P2&0x80);//检测忙信号
 lcd_E = 0;   
}


/****************************1602A写数据函数


**************************/
/*函数原型:void f_v_lcdWriteData(unsigned char


WDLCM)
/*函数功能:1602A写数据
/*输入参数:要写入的数?
/*输出参数:无
/*调用模块:
/*************************************************


*********************/
void f_v_lcdWriteData(unsigned char WDLCM)

 f_uc_lcdReadStatus(); //检测忙
 P2 = WDLCM;
    lcd_RS = 1;
    lcd_RW = 0;
    lcd_E = 1;//若晶振速度太高可以在这后加小的延时
 f_v_delay50us();//延时
    lcd_E = 0;
}
/****************************1602A写指令函数


**************************/
/*函数原型:void f_v_lcdWriteCommand(unsigned char


WCLCM,BuysC)
/*函数功能:1602A写指令
/*输入参数:要写入的指令
/*输出参数:无
/*调用模块:
/*************************************************


*********************/
void f_v_lcdWriteCommand(unsigned char WCLCM,unsigned char BuysC)//BuysC为0时忽略忙检测
{       
 if (BuysC)
  f_uc_lcdReadStatus();//根据需要检测忙
  P2 = WCLCM;  
     lcd_RS = 0;   
     lcd_RW = 0;   
     lcd_E = 1;
  f_v_delay50us();//延时   
     lcd_E = 0;   
}
/****************************1602A读数据函数


**************************/
/*函数原型:unsigned char f_v_lcdReadData(void)
/*函数功能:1602A读数据
/*输入参数:无
/*输出参数:1602A返回的数据
/*调用模块:
/*************************************************


**********************/
/*unsigned char f_uc_lcdReadData(void)
{       
 lcd_RS = 1;       
 lcd_RW = 1;       
 lcd_E = 0;       
 lcd_E = 0;       
 lcd_E = 1;       
 return(lcd_data);
}*/
/******************1602A按指定位置显示一个字符函数


**********************/
/*函数原型:void f_v_displayOneChar(unsigne char X,


unsigned char Y, unsigned char DData)
/*函数功能:1602A按指定位置显示一个字符
/*输入参数:X坐标 Y坐标 要显示的字符
/*输出参数:无
/*调用模块:
/*************************************************


*********************/
void f_v_displayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{       
 Y &= 0x1;       
 X &= 0xF;//限制X不能大于15,Y不能大于1    


  
 if (Y)
 X |= 0x40;//当要显示第二行时地址码+0x40;       
 X |= 0x80;// 算出指令码       
     
    f_v_lcdWriteCommand(X, 0);//这里不检测忙信号,发送地址码       
 f_v_lcdWriteData(DData);
         
}
/*******************1602A按指定位置显示一串字符函


数*********************/
/*函数原型:void f_v_displayListChar(unsigned char


X, unsigned char Y, unsigned char code *DData)
/*函数功能:1602A按指定位置显示一个字符
/*输入参数:X坐标 Y坐标 要显示字符串的首地址
/*输出参数:
/*************************************************


*********************/
void f_v_displayListChar(unsigned char X, unsigned char Y, unsigned char  *DData)
{       
 unsigned char ListLength;       
 ListLength = 0;       
 Y &= 0x1;       
 X &= 0xF;//限制X不能大于15,Y不能大于1    


  
 while (DData[ListLength]>=0x20)//若到达字串尾则退出       
 {               
  if (X <= 0xF)//X坐标应小于0xF    
  {  
             f_v_displayOneChar(X, Y, DData[ListLength]);//显示单个字符                     
    ListLength++;             
    X++;
  }       
 }
}
/****************************1602A初始化函数


**************************/
/*函数原型:void f_v_lcdInit(void)
/*函数功能:1602A初始化
/*输入参数:无
/*输出参数:无
/*调用模块:/
/*************************************************


*********************/
void f_v_lcdInit(void)
{       
 lcd_data = 0;  
    f_v_lcdWriteCommand(0x38,0);//三次显示模式设置,不检测忙信号    
    f_v_delay5ms();   
    f_v_lcdWriteCommand(0x38,0);   
    f_v_delay5ms();   
    f_v_lcdWriteCommand(0x38,0);   
    f_v_delay5ms();         
    f_v_lcdWriteCommand(0x38,1);//显示模式设置,开始要求每次检测忙信号
   
    f_v_lcdWriteCommand(0x08,1);//关闭显示   
    f_v_lcdWriteCommand(0x01,1);//显示清屏
 f_v_delay2ms();  
    f_v_lcdWriteCommand(0x06,1);// 显示光标移动设置    
    f_v_lcdWriteCommand(0x0C,1);// 显示开及光标设置
}


//////////////////////////////////////////////////


//////////////////////////
/*喂狗程序*/
/*void f_v_watchDog()
{
 dog=1;
 ;
 ; 
 ;
 ;
 ;
 ;
 ;
 dog=0;
}*/
//////////////////////////////////////////////////


//////////////////////////


/*void f1()
{
 f_v_delay10ms();
 f_v_delay10ms();
 f_v_lcdInit();
 f_v_delay10ms();
 f_v_delay10ms();
 f_v_displayListChar(0,0,show1);
 f_v_displayListChar(0,1,show2);
}


void f2()
{
 f_v_delay10ms();
 f_v_delay10ms();
 f_v_lcdInit();
 f_v_delay10ms();
 f_v_delay10ms();
 f_v_displayListChar(0,0,show3);
 f_v_displayListChar(0,1,show4);
}


void f3()
{
 f_v_delay10ms();
 f_v_delay10ms();
 f_v_lcdInit();
 f_v_delay10ms();
 f_v_delay10ms();
 f_v_displayListChar(0,0,show5);
 f_v_displayListChar(0,1,show6);
}*/


void main(void)
{
  i="0";
  j="0";
  while(1)
    {
/*      for(i=0;i<10;i++)
      {
           ;
      f_v_lcdInit();
      ;
      f_v_displayListChar(i,0,show1);
      f_v_displayListChar(i,1,show2);
       ;
   }
      for(i=10;i<16;i++)
   {
      ;
      f_v_lcdInit();
      ;
            for(j=0;j<7;j++) 
   {
    f_v_displayOneChar((i+j)%16,0,show1[j]);
       f_v_displayOneChar((i+j)%16,1,show2[j]);
    ;
            }
      
   }*/
      for(i=0;i<16;i++)
   {
      ;
      f_v_lcdInit();
      ;
            for(j=0;j<strlen(show1);j++) 
   {
    f_v_displayOneChar((i+j)%16,0,show1[j]);
                ;
            }
   for(j=0;j<strlen(show2);j++)
       {
                f_v_displayOneChar((i+j)%16,1,show2[j]);
    ;
   }
   }
    }
}

文章评论0条评论)

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