⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 关于lcd的c语言.txt

📁 uclinux的lcd显示源代码
💻 TXT
字号:
#include <reg51.h>
#include <intrins.h>




sbit dc=P2^2; /*P2.0 LCD 的RS 21*///改过了
sbit rw=P2^1; /*P2.1 LCD 的R/W 22*/
sbit cs=P2^0; /*P2.4 LCD 的E 25*/
sfr lcdbus=0x80; /*p0LCD 数据 D0=P0.0*/




unsigned int sys10mscounter;//======================变量
unsigned char syslimitcounter;




char path1[8]={0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f};/*自定义符号横1*/
char path2[8]={0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00};/*自定义符号横2*/
char pats1[8]={0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15};/*自定义符号竖1*/
char pats2[8]={0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a};/*自定义符号竖2*/




void soft_nop(){}



/***********12MHZ 提供10MS 软件延时************///无外部变量
void soft_10ms()
{ register int i;
for(i=0;i<711;i++);
}//无外部变量



/***********12MHZ 提供20MS 软件延时************///无外部变量
void soft_20ms()
{ soft_10ms();
soft_10ms();
}




/*=================10MS 的硬件延时==============*///外部变量为 unsigned int sys10mscounter
void hard_10ms(unsigned int delaytime)
{ sys10mscounter=delaytime;
while(sys10mscounter);
}




unsigned char data lcdcounter;//=====================================变量
bit lcdusing1,lcdusing2;



/*=======================================
==============检查LCD 忙=================
========================================*/
bit lcd_checkbusy()
{ 
  register lcdstate;
  dc=0; /*dc=1为数据,=0 为命令.*/
  rw=1; /*rw=1为读,=0为写.*/
  cs=1; /*cs=1选通.*/
  soft_nop();
  lcdstate=lcdbus;
  cs=0;
  return((bit)(lcdstate&0x80));
}




/*===============================================
====================写LCD指令====================
===============================================*/
void lcd_wrcmd(unsigned char lcdcmd) 
{ 
  lcdusing1=1;
  while(lcd_checkbusy());//调用函数lcd_checkbusy()
  lcdbus=lcdcmd;
  dc=0; /*dc=1为数据,=0 为命令.*/
  rw=0; /*rw=1为读,=0为写.*/
  cs=1; /*cs=1选通.*/
  soft_nop();
  cs=0;
  lcdbus=0xff;//lcdbus为sfr
  lcdusing1=0;//外部变量 bit lcdusing1
}




/*移动光标到指定位.0-79============================
==============移动光标到指定位。0-79===============
=================================================*/
void lcd_moveto(char position) /*移动光标到指定位.0-79*/
{ 
  register cmd=0x80;
  lcdcounter=position;
  if (position > 59)
    position += 0x18;
  else
  { if (position > 39)position -= 0x14;
    else
    { 
   if (position > 19)position += 0x2c;
    }
  }
  cmd=cmd|position;
  lcd_wrcmd(cmd);
}





/*===========================================
===========在当前显示位置显示数据============
===========================================*/
void lcd_wrdata(char lcddata) 
{ 
  //char i;//高亮把它注释掉了
  lcdusing2=1;//外部变量lcdusing2
  while(lcd_checkbusy());//调用函数lcd_checkbusy()
  if(lcdcounter==20)//外部变量lcdcounter
    {              
      lcd_moveto(20);//调用函数lcd_moveto
      while(lcd_checkbusy());
    }
  if(lcdcounter==40)
    {
      lcd_moveto(40);
      while(lcd_checkbusy());



    }
  if(lcdcounter==60)
    {
      lcd_moveto(60);
      while(lcd_checkbusy());
    }
  if(lcdcounter==80)
    {
      lcd_moveto(0);
      while(lcd_checkbusy());
      lcdcounter=0;
    } /*为通用而如此*/
lcdcounter++;
lcdbus=lcddata;
dc=1; /*dc=1为数据,=0 为命令.*/
rw=0; /*rw=1为读,=0为写.*/
cs=1; /*cs=1选通.*/
soft_nop();//调用函数soft_nop()
cs=0;
lcdbus=0xff;
lcdusing2=0;//外部变量lcdusing2=0
}




/*====================================================
=============在当前显示位置显示LCD 字符串=============
====================================================*/
void lcd_string(char *strpoint) 
{ 
  register i=0;
  while(strpoint!=0)
  {
    lcd_wrdata(strpoint);//调用函数lcd_wrdata
    i++;
  }
}




/*====================================================
=======================初始化=========================
====================================================*/
void lcd_init()
{ 
  lcd_wrcmd(0x38); /*设置8 位格式,2行,5*7*///调用函数lcd_wrcmd()
  lcd_wrcmd(0x0c); /*整体显示,关光标,不闪烁*/
  lcd_wrcmd(0x06); /*设定输入方式,增量不移位*/
  lcd_wrcmd(0x01); /*清除显示*/
  lcdcounter=0;//外部变量lcdcounter
}




/*====================================================
======================清除显示========================
====================================================*/
void lcd_cls()
{ 
  lcd_wrcmd(0x01);//调用函数lcd_wrcmd
  lcdcounter=0;//外部变量lcdcounter
}




/*====================================================
======================T0中断==========================
====================================================*/
void timer0(void) interrupt 1 
{ 
  TH0=0xd8; /*12M,10ms*/
  TL0=0xf6;
  TR0=1;
  if(sys10mscounter!=0)sys10mscounter--; /*定时器10ms*///外部变量sys10mscounter
  if(syslimitcounter!=0)syslimitcounter--; /*定时器10ms*///外部变量syslimitcounter
}




main()
{




unsigned char j;



/*=============初始化T==============*/                       //T是什么?
IE=0;
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;//有什么用?

lcd_init();
soft_20ms();



TMOD=0x51;
TH0=0xd8; /*12M,10ms*/
TL0=0xf6;



TR0=1;//开始计数



ET0=1;EA=1;//开中断



while(1)
{
  /*全黑横一横二竖一竖二U Q ABCD... */
  lcd_init(); /*全黑*///每个循环重置一次LCD
  for(j=0;j<80;j++){lcd_wrdata(0xff);}
  hard_10ms(50);
  lcd_init(); /*横一可参考自行设计符号*/
  lcd_wrcmd(0x40);
  for(j=0;j<8;j++)lcd_wrdata(path1[j]);
  for(j=0;j<100;j++)lcd_wrdata(0);
  hard_10ms(50);
  lcd_init(); /*横二*/
  lcd_wrcmd(0x40);
  for(j=0;j<8;j++)lcd_wrdata(path2[j]);
  for(j=0;j<100;j++)lcd_wrdata(0);
  hard_10ms(50);
  lcd_init(); /*竖一*/
  lcd_wrcmd(0x40);
  for(j=0;j<8;j++)lcd_wrdata(pats1[j]);
  for(j=0;j<100;j++)lcd_wrdata(0);
  hard_10ms(50);
  lcd_init(); /*竖二*/
  lcd_wrcmd(0x40);
  for(j=0;j<8;j++)lcd_wrdata(pats2[j]);
  for(j=0;j<100;j++)lcd_wrdata(0);
  hard_10ms(50);
  lcd_init();
  lcd_string("UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU");
  hard_10ms(50);
  lcd_init();
  lcd_string("QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ");
  hard_10ms(50);
  lcd_init();
  lcd_string("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz0123456789+-!#$%&?");hard_10ms(50);
  }



}




这是另外一个兄弟写的lcd的重置

/*=======================================================
初始化程序, 必须按照产品资料介绍的初始化过程进行
=======================================================*/
void LcdReset( void ) {

    LcdWriteCommand( 0x38, 0);            // 显示模式设置(不检测忙信号)
        Delay5Ms();
    LcdWriteCommand( 0x38, 0);            // 共三次
        Delay5Ms();
    LcdWriteCommand( 0x38, 0);
        Delay5Ms();

    LcdWriteCommand( 0x38, 1);            // 显示模式设置(以后均检测忙信号)
    LcdWriteCommand( 0x08, 1);            // 显示关闭
    LcdWriteCommand( 0x01, 1);            // 显示清屏
    LcdWriteCommand( 0x06, 1);            // 显示光标移动设置
    LcdWriteCommand( 0x0c, 1);            // 显示开及光标设置
}

/*=======================================================
写控制字符子程序: E=1 RS=0 RW=0
=======================================================*/
void LcdWriteCommand( Uchar CMD,Uchar AttribC ) {

    if (AttribC) WaitForEnable();                // 检测忙信号?

    RS = 0;    RW = 0; _nop_();

    DataPort = CMD; _nop_();
    // 送控制字子程序

    Elcm = 1;_nop_();_nop_();Elcm = 0;            // 操作允许脉冲信号
}

/*=======================================================
正常读写操作之前必须检测LCD控制器状态:    CS=1 RS=0 RW=1
DB7:    0  LCD控制器空闲; 1  LCD控制器忙
========================================================*/
void WaitForEnable( void ) {

    DataPort = 0xff;

    RS =0; RW = 1; _nop_();Elcm = 1; _nop_(); _nop_();

    while( DataPort & Busy );

    Elcm = 0;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -