有没有51控制1602液晶的原理图和程序

paddydong   2008-7-26 18:46 楼主
简单点好,最好有点解释!给我一个啊,我的E-mail:panyaoem@126.com

回复评论 (13)

估计是:HD44780

  1. #include
  2. #include
  3. #include
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define nop()  _nop_()

  7. uchar bdata status;
  8. sbit status_busy=status^7;
  9. sbit status_Reset=status^4;

  10. sbit  LCD_E=P3^2;
  11. sbit  LCD_RW=P3^6;
  12. sbit  LCD_RS=P3^7;

  13. void  LCD_delay1ms(uint delay_xms);
  14. void  LCD_delay50us(uchar count50us);
  15. void  LCD_command(uchar command_data);
  16. void  LCD_data(uchar w_data);
  17. void  LCD_read_busy();
  18. void  LCD_initialize();
  19. void  LCD_dip_11();
  20. uchar  code  LCD_dis_char[]={0x32,'Q',0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,'Q',
  21.                                };

  22. uchar  code  LCD_write_cgram[]={
  23.                                0x01,0x03,0x07,0x0f,0x1f,0x0f,0x07,0x03,//picture3
  24.                                0x10,0x18,0x1c,0x1e,0x1f,0x1e,0x1c,0x18,//picture4
  25.                                0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,//picture5
  26.                                0x08,0x04,0x12,0x08,0x04,0x02,0x11,0x00,//picture7
  27.                                0x08,0x11,0x02,0x04,0x08,0x11,0x02,0x04,//picture8
  28.                                0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,//picture9
  29.                                0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,//picture11
  30.                                0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,//picture12

  31.                               };
  32. //* delay  1ms  *//
  33. void LCD_delay1ms(uint delay_xms)
  34. {
  35.     uint data n,m;
  36.    for(n=0;n
  37.   {
  38.     for(m=0;m<75;m++)
  39.    {
  40.      ;
  41.       }
  42. }
  43. }
  44. //***********delay50us************************//
  45. void LCD_delay50us(uchar count50us)

  46. {
  47.     uchar data k ;
  48.      _nop_();
  49.     for(k=0;k<2*count50us;k++)
  50.     {

  51.       _nop_();
  52.       _nop_();
  53.       _nop_();
  54.       _nop_();
  55.       _nop_();
  56.       }
  57.       }
  58. void LCD_command(uchar command_data)

  59. {        //RS=0;
  60.          //RW=0;
  61.          P3=0;
  62.          LCD_E=1;
  63.          P1=command_data;
  64.          LCD_delay1ms(0x02);
  65.          _nop_();
  66.          LCD_E=0;
  67.          LCD_RS=1;
  68.          LCD_RW=1;
  69.         }

  70. void LCD_data(uchar w_data)

  71. {
  72.         LCD_RS=1;
  73.         LCD_RW=0;
  74.         LCD_E=1;
  75.         P1=w_data;
  76.         LCD_delay50us(0x02);
  77.         _nop_();
  78.         LCD_E=0;
  79.         LCD_RS=0;
  80.         LCD_RW=1;
  81.         }
  82. void  LCD_read_busy()
  83. {  
  84. do
  85. {
  86.         LCD_RS=0;
  87.         LCD_RW=1;
  88.         LCD_E=1;
  89.         status=P1;
  90.         LCD_delay50us(0x02);
  91.         LCD_delay50us(0x02);
  92.       }
  93.         while(status_busy);
  94.         _nop_();
  95.         LCD_E=0;
  96.         LCD_RS=0;
  97.         LCD_RW=1;
  98.                }
  99. void LCD_initialize()
  100. {
  101.   uchar data i;
  102.       P1=0;
  103.       for(i=0;i<3;i++)
  104.      {
  105.       LCD_command(0x38);//N=1  2 line  diaplay    DL=1 8_bit bus mode whih MPU F=0 5*8 dots //
  106.       LCD_delay50us(0x02);
  107.       LCD_read_busy();
  108.       }

  109.       LCD_command(0x01);  /* CLR LCD AC=0 AC+1清屏 */
  110.       LCD_delay1ms(0x02);
  111.       LCD_read_busy();
  112.       //write_command(0x8f); //

  113.       LCD_command(0x02);//归home位 set DDRAM Adress  is 00h //
  114.       LCD_delay1ms(0x02);
  115.       LCD_read_busy();


  116.       LCD_command(0x04);// 1 I/D S  I/D=0 cursor/blink moves to left and ddram address is decreased by 1 //
  117.       LCD_delay50us(0x02);
  118.       LCD_read_busy();

  119.       LCD_command(0x0c);//1DCB   D=1 entire display is turned on cursor off //cursor bink off   //
  120.       LCD_delay50us(0x02);
  121.       LCD_read_busy();

  122.       LCD_command(0x07);
  123.       LCD_delay50us(0x02);
  124.       LCD_read_busy();
  125.      
  126.       }
  127. void  LCD_dip_11()
  128. {    uchar data i;
  129.      LCD_command(0x40);
  130.         for(i=0;i<8;i++)
  131.         {
  132.          LCD_data(0x0a);
  133.          }
  134.        for(i=0;i<8;i++)
  135.         {
  136.          LCD_data(0x15);
  137.          }
  138.          LCD_command(0x80);
  139.          for(i=0;i<40;i++)
  140.          {
  141.          LCD_data(0x00);
  142.          LCD_data(0x01);
  143.           }
  144.           LCD_delay1ms(1000);
  145.           }
  146. main()
  147.    {
  148.    uchar data i,j;
  149.     LCD_initialize();


  150.       while(1)
  151.       {

  152.       LCD_command(0x40);
  153.       LCD_delay50us(0x02);
  154.       
  155.       for(j=0;j<64;j++)
  156.       {

  157.      LCD_data(LCD_write_cgram[j]);
  158.       LCD_delay50us(0x02);
  159.       }
  160.       for(j=0;j<9;j++)
  161.      {
  162.       LCD_command(0x80);

  163.       LCD_delay50us(0x01);

  164.       for(i=0;i<80;i++)
  165.       {
  166.        LCD_data(LCD_dis_char[j]);
  167.        //write_data(0x00);
  168.        LCD_delay50us(0x01);
  169.        }
  170.         LCD_delay1ms(1000);
  171.        }
  172.         LCD_dip_11();
  173.         LCD_command(0x01);
  174.         LCD_delay1ms(1000);
  175.        }
  176.        }
点赞  2008-7-27 00:41
data       P1
sbit  LCD_E=P3^2;
sbit  LCD_RW=P3^6;
sbit  LCD_RS=P3^7;
点赞  2008-7-27 00:42
//C语言源程序

******************************************************************/
#include
#define uchar unsigned char
#define uint unsigned int

#define LCM_Data P1//数据接口

sbit LCM_E=P3^5;//定义接口
sbit LCM_RW=P3^6;//
sbit LCM_RS=P3^7;
void LCM_WriteData(uchar WDLCM);
void LCM_WriteCommand(uchar WCLCM,BuysC);
uchar LCM_ReadData(void);
uchar LCM_ReadStatus(void);
void LCM_Init(void);
void DisplayOneChar(uchar X, uchar Y, uchar DData);
void DisplayListChar(uchar X, uchar Y, uchar code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
uchar code uctech[] = {"1602A"};
uchar code net[] = {"www.52c51.com"};

void main(void)
{
        while(1)
        {
        Delay400Ms();//启动等待,等LCM讲入工作状态
        LCM_Init();//LCM初始化
        Delay5Ms();//延时片刻(可不要)
        DisplayListChar(6, 1, uctech);
        DisplayListChar(0, 0, net);
        LCM_ReadData();//测试用句无意义
        LCM_Data=255;
        }
        
}
/****************************1602A写数据函数**************************/
/*函数原型:void LCM_WriteData(uchar WDLCM)
/*函数功能:1602A写数据
/*输入参数:要写入的数据
/*输出参数:无
/*调用模块:
/*建立时间:2005/11/14
/*作者:站长
/**********************************************************************/
void LCM_WriteData(uchar WDLCM)
{
        LCM_ReadStatus();//检测忙
        LCM_Data = WDLCM;
        LCM_RS = 1;
        LCM_RW = 0;
        LCM_E = 0;//若晶振速度太高可以在这后加小的延时
        LCM_E = 0;//延时
        LCM_E = 1;
}
/****************************1602A写指令函数**************************/
/*函数原型:void LCM_WriteCommand(uchar WCLCM,BuysC)
/*函数功能:1602A写指令
/*输入参数:要写入的指令
/*输出参数:无
/*调用模块:
/*建立时间:2005/11/14
/*作者:站长
/**********************************************************************/
void LCM_WriteCommand(uchar WCLCM,BuysC)//BuysC为0时忽略忙检测
{
        if (BuysC)
          LCM_ReadStatus();//根据需要检测忙
        LCM_Data = WCLCM;
        LCM_RS = 0;
        LCM_RW = 0;
        LCM_E = 0;
        LCM_E = 0;
        LCM_E = 1;
}
/****************************1602A读数据函数**************************/
/*函数原型:uchar LCM_ReadData(void)
/*函数功能:1602A读数据
/*输入参数:无
/*输出参数:1602A返回的数据
/*调用模块:
/*建立时间:2005/11/14
/*作者:站长
/**********************************************************************/
uchar LCM_ReadData(void)
{
        LCM_RS = 1;
        LCM_RW = 1;
        LCM_E = 0;
        LCM_E = 0;
        LCM_E = 1;
        return(LCM_Data);
}
/****************************1602A读状态函数**************************/
/*函数原型:uchar LCM_ReadData(void)
/*函数功能:1602A读状态
/*输入参数:无
/*输出参数:1602A返回的状态
/*调用模块:
/*建立时间:2005/11/14
/*作者:站长
/**********************************************************************/
uchar LCM_ReadStatus(void)
{
        LCM_Data = 0xFF;
        LCM_RS = 0;
        LCM_RW = 1;
        LCM_E = 0;
        LCM_E = 0;
        LCM_E = 1;
        while (LCM_Data & 0x80);//检测忙信号
        return(LCM_Data);
}
/****************************1602A初始化函数**************************/
/*函数原型:void LCM_Init(void)
/*函数功能:1602A初始化
/*输入参数:无
/*输出参数:无
/*调用模块:
/*建立时间:2005/11/14
/*作者:站长
/**********************************************************************/
void LCM_Init(void)
{
        LCM_Data = 0;
        LCM_WriteCommand(0x38,0);//三次显示模式设置,不检测忙信号
        Delay5Ms();
        LCM_WriteCommand(0x38,0);
        Delay5Ms();
        LCM_WriteCommand(0x38,0);
        Delay5Ms();
        
        LCM_WriteCommand(0x38,1);//显示模式设置,开始要求每次检测忙信号
        LCM_WriteCommand(0x08,1);//关闭显示
        LCM_WriteCommand(0x01,1);//显示清屏
        LCM_WriteCommand(0x06,1);// 显示光标移动设置
        LCM_WriteCommand(0x0C,1);// 显示开及光标设置
}
/******************1602A按指定位置显示一个字符函数**********************/
/*函数原型:void DisplayOneChar(uchar X, uchar Y, uchar DData)
/*函数功能:1602A按指定位置显示一个字符
/*输入参数:X坐标 Y坐标 要显示的字符
/*输出参数:无
/*调用模块:
/*建立时间:2005/11/14
/*作者:站长
/**********************************************************************/
void DisplayOneChar(uchar X, uchar Y, uchar DData)
{
        Y &= 0x1;
        X &= 0xF;//限制X不能大于15,Y不能大于1
        if (Y) X |= 0x40;//当要显示第二行时地址码+0x40;
        X |= 0x80;// 算出指令码
        LCM_WriteCommand(X, 0);//这里不检测忙信号,发送地址码
        LCM_WriteData(DData);
}
/*******************1602A按指定位置显示一串字符函数*********************/
/*函数原型:void DisplayListChar(uchar X, uchar Y, uchar code *DData)
/*函数功能:1602A按指定位置显示一个字符
/*输入参数:X坐标 Y坐标 要显示字符串的首地址
/*输出参数:无
/*调用模块:
/*建立时间:2005/11/14
/*作者:站长
/**********************************************************************/
void DisplayListChar(uchar X, uchar Y, uchar code *DData)
{
        uchar ListLength;
        ListLength = 0;
        Y &= 0x1;
        X &= 0xF;//限制X不能大于15,Y不能大于1
        while (DData[ListLength]>0x20)//若到达字串尾则退出
        {
                if (X <= 0xF)//X坐标应小于0xF
                {
                        DisplayOneChar(X, Y, DData[ListLength]);//显示单个字符
                        ListLength++;
                        X++;
                }
        }
}
/********************5ms延时函数************************/
/*函数原型:void Delay5Ms(void)
/*函数功能:5ms延时
/*输入参数:无
/*输出参数:无
/*调用模块:
/*建立时间:2005/11/14
/*作者:站长
/**********************************************************************/
void Delay5Ms(void)
{
        unsigned int TempCyc = 5552;
        while(TempCyc--);
}
/********************400ms延时延时函数************************/
/*函数原型:void Delay400Ms(void)
/*函数功能:400ms延时延时
/*输入参数:无
/*输出参数:无
/*调用模块:
/*建立时间:2005/11/14
/*作者:站长
/**********************************************************************/
void Delay400Ms(void)
{
        uchar TempCycA = 5;
        unsigned int TempCycB;
        while(TempCycA--)
        {
                TempCycB=7269;
                while(TempCycB--);
        };
}



点赞  2008-7-27 09:19
经过调试的  可以用的 并且注释也很全  应该看的懂吧~~~

记得 要在第三脚接一个滑动变阻器~~~~

还有背景灯的正负别接反了~~~

还有什么问题 尽管问吧!!!!!!
点赞  2008-7-27 09:22
#include
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="I LIKE MCU!";
uchar code table1[]="WWW.TXMCU.COM";
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit dula=P2^6;
sbit wela=P2^7;
uchar num;


void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void write_com(uchar com)
{
        lcdrs=0;
        P0=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}

void write_data(uchar date)
{
        lcdrs=1;
        P0=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
void init()
{
        dula=0;
        wela=0;
        lcden=0;
        write_com(0x38);
        write_com(0x0e);
        write_com(0x06);
        write_com(0x01);
        write_com(0x80+0x10);
}
void main()
{
        init();
        for(num=0;num<11;num++)
        {
                write_data(table[num]);
                delay(20);
        }
//        write_com(1);
        write_com(0x80+0x53);
        for(num=0;num<13;num++)
        {
                write_data(table1[num]);
                delay(20);
        }
        for(num=0;num<16;num++)
        {
                write_com(0x18);
                delay(20);
        }
        while(1);
}

很简单的小程序 自己能看明白的
点赞  2008-7-27 20:56
我发现大家真好,给楼主这么大的帮助。但不知道楼主能否看懂。
点赞  2008-7-28 21:39
我只用过st7920,自带字库的,很方便。
点赞  2008-7-29 15:38
我这有个控制IC是st7920,汉字很方便,不知道画图怎么样?
点赞  2008-7-29 23:48
不错!

顺便学习下了!
点赞  2008-9-12 17:17
mark一下,做个记录!
点赞  2008-9-12 21:48
marking
顺便帮顶
点赞  2008-9-12 23:07
顶!!
暂时还没试,谢谢
点赞  2010-3-7 21:56
顶!
先复制了,看看再说
点赞  2010-3-9 12:06
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复