×
单片机 > 单片机程序设计 > 详情

用51单片机控制LCD12864显示屏源程序

发布时间:2020-08-25 发布时间:
|

12864液晶在出厂时其对比度已经调好,所以用户在使用的时候第三管脚可不用接任何东西,本实验板上为了兼容多家12864液晶所以加了液晶对比度调节电位器,若用户使用我们配套的12864液晶可不用管它,液晶的第三管脚悬空就可以。有些液晶功耗比较大,用户在使用的时候可将液晶的第19、20引脚的背光不接,这样字体会很清楚。

 

单片机源程序如下:

/**********************BST-V51实验开发板例程************************

*  平台:BST-V51 + Keil U3 + STC89C52

*  名称: 

*  晶振:11.0592MHZ

*  说明:免费开源,不提供源代码分析.

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

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

/*                                                                 */

/* 单片机开发系统演示程序 - 128*64LCD显示显示  */

/*                                                                 */

//;*  LCD型号:TS12864A-3(带汉字库)或兼容型号    控制器ST7920      */

//;*  MCU:AT89S52 ,晶体频率:11.0592MHz                              */

/*                                                                 */

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


#include

#include

        

#define uchar unsigned char

#define uint  unsigned int

/*12864端口定义*/

#define LCD_data  P0             //数据口

sbit LCD_RS  =  P2^6;            //寄存器选择输入 

sbit LCD_RW  =  P2^5;            //液晶读/写控制

sbit LCD_EN  =  P2^7;            //液晶使能控制

sbit LCD_PSB =  P1^2;            //串/并方式控制

sbit wela    =  P2^6;

sbit dula    =  P2^7;


uchar code dis1[] = {"看什么看!"};

uchar code dis2[] = {"显示屏而已!"};

uchar code dis3[] = {"少见多怪!"};

uchar code dis4[] = {"那凉哪呆着!"};                  


#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

uchar IRDIS[2];

uchar IRCOM[4];

void delay0(uchar x);  //x*0.14MS

void beep();

void  dataconv();

void lcd_pos(uchar X,uchar Y);  //确定显示位置

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

/*                                                                 */

/*  延时函数                                                       */

/*                                                                 */

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

void delay(int ms)

{

    while(ms--)

        {

      uchar i;

          for(i=0;i<250;i++)  

           {

            _nop_();                           

                _nop_();

                _nop_();

                _nop_();

           }

        }

}                

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

/*                                                                 */

/*检查LCD忙状态                                                    */

/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。      */

/*                                                                 */

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

bit lcd_busy()

{                          

    bit result;

    LCD_RS = 0;

    LCD_RW = 1;

    LCD_EN = 1;

    delayNOP();

    result = (bit)(P0&0x80);

    LCD_EN = 0;

    return(result); 

}

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

/*                                                                 */

/*写指令数据到LCD                                                  */

/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */

/*                                                                 */

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

void lcd_wcmd(uchar cmd)

{                          

   while(lcd_busy());

    LCD_RS = 0;

    LCD_RW = 0;

    LCD_EN = 0;

    _nop_();

    _nop_(); 

    P0 = cmd;

    delayNOP();

    LCD_EN = 1;

    delayNOP();

    LCD_EN = 0;  

}

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

/*                                                                 */

/*写显示数据到LCD                                                  */

/*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */

/*                                                                 */

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

void lcd_wdat(uchar dat)

{                          

   while(lcd_busy());

    LCD_RS = 1;

    LCD_RW = 0;

    LCD_EN = 0;

    P0 = dat;

    delayNOP();

    LCD_EN = 1;

    delayNOP();

    LCD_EN = 0; 

}

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

/*                                                                 */

/*  LCD初始化设定                                                  */

/*                                                                 */

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

void lcd_init()


    LCD_PSB = 1;         //并口方式

    

    lcd_wcmd(0x34);      //扩充指令操作

    delay(5);

    lcd_wcmd(0x30);      //基本指令操作

    delay(5);

    lcd_wcmd(0x0C);      //显示开,关光标

    delay(5);

    lcd_wcmd(0x01);      //清除LCD的显示内容

    delay(5);

}

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

/*



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈msp430f5529入门(2)----时钟配置.例程分析