1602 character LCD program written in C51

Publisher:BlissfulJourneyLatest update time:2016-12-13 Source: eefocusKeywords:C51 Reading articles on mobile phones Scan QR code
Read articles on your mobile phone anytime, anywhere

//FileName:delay.h
#ifndef __LZP_DELAY_H_
#define __LZP_DELAY_H_

#define TRUE 1
#define FALSE 0
//Set the baud rate
#define OSC_FREQ 11059200L


#define BAUD_115200             256 - (OSC_FREQ/192L)/115200L   // 255
#define BAUD_57600              256 - (OSC_FREQ/192L)/57600L    // 254
#define BAUD_38400              256 - (OSC_FREQ/192L)/38400L    // 253
#define BAUD_28800              256 - (OSC_FREQ/192L)/28800L    // 252
#define BAUD_19200              256 - (OSC_FREQ/192L)/19200L    // 250
#define BAUD_14400              256 - (OSC_FREQ/192L)/14400L    // 248
#define BAUD_9600               256 - (OSC_FREQ/192L)/9600L     // 244
// Timer2
#define RCAP2_50us             65536L - OSC_FREQ/240417L
#define RCAP2_1ms              65536L - OSC_FREQ/12021L


void delay_ms(unsigned int num);
void delay_50us(unsigned char num);
void delay_us(unsigned char num);


#endif


//FileName:delay.c
/********************************************
** start51 study board
** delay function implementation
** author:bluehacker
** QQ:282074921
**********************************************/
#include "delay.h"
#include "reg52.h"



void delay_ms(unsigned int num)
{
     RCAP2H = (RCAP2_1ms>>8);
    RCAP2L=(RCAP2_1ms&0x00ff);
    TH2=(RCAP2_1ms>>8);;
    TL2=(RCAP2_1ms&0x00ff);;
   
      ET2 = 0;     // Disable timer2 interrupt
      T2CON = 0x04;    // 16-bit auto-reload, clear TF2, start timer

      while (num--)
      {
        while (!TF2);
        TF2 = FALSE;
      }
      TR2 = FALSE;
}


void delay_50us(unsigned char num)
{
    RCAP2H=(RCAP2_50us>>8);
    RCAP2L=(RCAP2_50us&0x00ff);
    TH2=(RCAP2_50us>>8);
    TL2=(RCAP2_50us&0x00ff);
    ET2=0;
    T2CON=0x04;
    while(num--)
    {
        while(!TF2)
            TF2=FALSE;
    }
    TR2=FALSE;
}


void delay_us(unsigned char num)
{
    unsigned char i;
    for (i=0;i     {
    }
}


//FileName:lcd.h


#ifndef __LZP_LCD_H_
#define __LZP_LCD_H_
#include "reg52.h"
/////////////////////////////
//定义LCD控制引脚
////////////////////////////
sbit LCDRS="P2"^0;
sbit LCDRW="P2"^1;
sbit LCDE="P2"^2;


void lcd_write_cmd(unsigned char cmd);
void lcd_write_data(unsigned char dat);
void lcd_clear(void);
void lcd_init(void);
unsigned char lcd_status(void);
void lcd_set_mode(unsigned char  cursor, unsigned char text);
void lcd_write_str(unsigned char x,unsigned char y,unsigned char *s);
void lcd_write_char(unsigned char x,unsigned char y, unsigned char d);
#endif


//FileName:lcd.c
/************************************************************
**This development board supports 1602 character LCD
**You can find a lot of interface information for this LCD by using Google
** Pin definition:
* 1---GND
* 2---VDD
* 3---VLCD: Contrast adjustment
* 4---RS: Register selection, select data register when high level, select instruction register when low level
* 5---R/W: Read and write signal line, read operation when high level, write operation when low level.
          When RS and RW are both low level, instructions can be written or display addresses can be displayed. When RS is low level and
          RW is high level, busy signal can be read. When RS is high level and RW is low level, data can be written.
* 6---E: Enable terminal. When E terminal jumps from high level to low level, the LCD module executes the command.
* 7~14---DB0~DB7 data lines,
* 15---A: backlight pin, "A" connects to positive
* 16---K: backlight pin, "K" connects to negative

**************************************************************/
#include "lcd.h"
#include "delay.h"
#include "intrins.h"


/*向LCD写入命令*/
void lcd_write_cmd(unsigned char cmd)
{
    unsigned char status;
    P0=cmd;
    LCDRS="0";
    LCDRW="0";
    LCDE="0";
    delay_us(5);
    do{
        status="lcd"_status();
    }while(status&0x80);
   
    LCDE="1";
   
}


void lcd_write_data(unsigned char dat)
{
    unsigned char status;


    P0=dat;
    LCDRS="1";
    LCDRW="0";
    LCDE="0";
    delay_us(5);
    do{
        status="lcd"_status();
    }while(status&0x80);
       
    LCDE="1";
   
}


void lcd_clear(void)
{
    lcd_write_cmd(0x01);
}



/*显示屏字符串写入函数*/
void lcd_write_str(unsigned char x,unsigned char y,unsigned char *s)
{

    if (y == 0) {
     lcd_write_cmd(0x80 + x);
     }
    else {
     lcd_write_cmd(0xC0 + x);
     }
   
    while (*s) {
     lcd_write_data( *s);
     s ++;
     }
    
     /*
   unsigned char i;
   for(i=0;i<16&&s!=0;i++)
   {
       lcd_write_char(x+i,y,s);
    }
    */
}


void lcd_write_char(unsigned char x,unsigned char y, unsigned char d)
{
    if(y==0)
    {
        lcd_write_cmd(0x80+x);
    }
    else
    {
        lcd_write_cmd(0xc0+x);
    }
    lcd_write_data(d);
}
//光标复位
void lcd_reset_cursor(void)
{
    lcd_write_cmd(0x02);
}



//Set the display mode
void lcd_set_mode(unsigned char cursor, unsigned char text)
{
    unsigned char mode="0x04";
    if(cursor){//Cursor moves right
        mode|=0x02;
    }
    else{//Cursor moves left
        mode|=0x00;
    }
    if(text){//Text moves
        mode|=0x01;
    }
    else{//Text does not move
        mode|=0;
    }
    lcd_write_cmd(mode);
}


   
void lcd_init(void)
{
    P0=0;
    LCDE="1";
    delay_ms(500);
    lcd_clear();
    lcd_write_cmd(0x38);//Set LCD function: 8-bit bus, dual-line display, 5X7 dot matrix character
    lcd_write_cmd(0x0f);//Display switch control: display ON, cursor ON, blink ON
    lcd_write_cmd(0x06);//Cursor input mode incremental shift
    lcd_write_cmd(0x80);
    //lcd_write_cmd(0x0c);
    //lcd_clear();
}
//Read status, busy or not
unsigned char lcd_status(void)
{
    unsigned char tmp="0";
    P0=0xff;
    LCDRS="0";
    LCDRW="1";
    LCDE="0";
    _nop_();
    LCDE="1";
    //_nop_();
    tmp="P0";
    return tmp;
}


//FileName:test.c
/*******************************
** Start51 study board test software
** test 1602LCD
** author: bluehacker
** QQ:282074921
***********************************/


#include "lcd.h"
#include "delay.h"
#include "intrins.h"



void main(void)
{
    //初始化串口
    SCON="0x50";/*mode 1,1 start bit ,8 data bit ,1 stop bit,enable receive*/
    PCON="0x80";/*SMOD=1, Baud Rate twice*/
    TMOD="0x21";/*timer 0--mode 1 and timer 1 ---mode2*/
    //set baud rate,use timer 1 as baud rate generator
    TH1=BAUD_19200;
    TL1=TH1;
    TR1=TRUE;
    ET1=FALSE;//disable timer 1 interrupt
    EA="0";


    //delay_ms(400);
    lcd_init();
//    lcd_set_mode(1,0);
     //lcd_reset_cursor();
    // lcd_write_char(3,1,'c');
    lcd_write_str(2,0,"bluehacker");
    lcd_write_str(2,1,"QQ:282074921");
    while(1)
    {
    }
}


Keywords:C51 Reference address:1602 character LCD program written in C51

Previous article:51 MCU low power working mode
Next article:192*64 LCD driver written by Keil C51

Recommended ReadingLatest update time:2024-11-16 22:22

Manual counter design circuit diagram based on C51 single chip microcomputer
  Use AT89S51 single-chip microcomputer to make a manual counter. Connect a touch switch to the P3.7 pin of the AT89S51 single-chip microcomputer as a manual counting button. Connect a common cathode digital tube to the P2.0 - P2.7 of the single-chip microcomputer as the unit digit display of 00-99 counting. Connect a
[Microcontroller]
Manual counter design circuit diagram based on C51 single chip microcomputer
1602 LCD Introduction
The three types of LED devices we talked about before, such as running lights, digital tubes, and LED dot matrices, are all LED devices. In this class, we will learn about LCD display devices - 1602 liquid crystals. The big one that usually displays 16 small black blocks on the first line and nothing on the second lin
[Microcontroller]
1602 LCD Introduction
51 MCU Experiment 17: LCD1602 Liquid Crystal
The circuit diagram of the development board LCD module is as follows: #include reg52.h #include lcd.h   uc dig1 =" Happy New Year "; uc dig2 =" Ha  Ha  Ha  Ha ";   void main() { uc i; lcdinit(); lcdwritecom(0x80); for(i=1;i =16;i++) { lcdwritedata(dig1 ); }     lcdwritecom(0xc0); for(i=1;i =16;i++) { lc
[Microcontroller]
51 MCU Experiment 17: LCD1602 Liquid Crystal
KEILC51 compilation problem ERRORL104: MULTIPLEPUBLICDEFINITIONS repeated definition
Today, my junior high school sister's program has a BUG. The reason is that the same variable is used in two C files, but the declaration is wrong. After finding the problem, I found that I must have used extern to declare global variables, but it still reported an error. I remember that it worked fine before. Dec
[Microcontroller]
51 single chip microcomputer drives LCD1602 liquid crystal display system
Without further ado, here are the pictures of the real thing LCD1602+51 single-chip computer minimum system application simulation and production Okay, now let’s officially enter the production phase: Step 1: Simulation After the schematic diagram is drawn, the minimum system of the single-chip microcomputer onl
[Microcontroller]
51 single chip microcomputer drives LCD1602 liquid crystal display system
C51 Programming 25-Application (MCU and computer realize WiFi communication)
This article implements data communication between the microcontroller and the computer using the ESP-01S wifi module.  Set the baud rate of the WiFi module  Since the default baud rate of the ESP-01S wifi module is 115200, and the baud rate of the 51 microcontroller is usually set at 9600, it is necessary to set
[Microcontroller]
C51 Programming 25-Application (MCU and computer realize WiFi communication)
Keil5 installation tutorial (including C51 and MDK coexistence) WIN10 tested and available
System environment: WIN10, tested and available. Friends who encounter problems with installation are welcome to harass my personal public account. As a low-level hardware worker, I often need to use stm32 and 51 microcontrollers, so I switch compilers back and forth between keil for C51 and mdk. It's really suffoca
[Microcontroller]
Keil5 installation tutorial (including C51 and MDK coexistence) WIN10 tested and available
C51 serial port input and output functions
*---------------------------------------- ComFun.c C51 serial port input and output functions External declaration ComFun.h Copyright 2003 http://www.cdle.net All rights reserved. Minghao E-mail: pnzwzw@cdle.net ----------------------------------------*/ #include reg51.h //Serial port initializes the crystal to 1
[Microcontroller]
Latest Microcontroller Articles
  • Download from the Internet--ARM Getting Started Notes
    A brief introduction: From today on, the ARM notebook of the rookie is open, and it can be regarded as a place to store these notes. Why publish it? Maybe you are interested in it. In fact, the reason for these notes is ...
  • Learn ARM development(22)
    Turning off and on interrupts Interrupts are an efficient dialogue mechanism, but sometimes you don't want to interrupt the program while it is running. For example, when you are printing something, the program suddenly interrupts and another ...
  • Learn ARM development(21)
    First, declare the task pointer, because it will be used later. Task pointer volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • Learn ARM development(20)
    With the previous Tick interrupt, the basic task switching conditions are ready. However, this "easterly" is also difficult to understand. Only through continuous practice can we understand it. ...
  • Learn ARM development(19)
    After many days of hard work, I finally got the interrupt working. But in order to allow RTOS to use timer interrupts, what kind of interrupts can be implemented in S3C44B0? There are two methods in S3C44B0. ...
  • Learn ARM development(14)
  • Learn ARM development(15)
  • Learn ARM development(16)
  • Learn ARM development(17)
Change More Related Popular Components

EEWorld
subscription
account

EEWorld
service
account

Automotive
development
circle

About Us Customer Service Contact Information Datasheet Sitemap LatestNews


Room 1530, 15th Floor, Building B, No.18 Zhongguancun Street, Haidian District, Beijing, Postal Code: 100190 China Telephone: 008610 8235 0740

Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号