用C51写的1602字符型LCD程序

发布者:BlissfulJourney最新更新时间:2016-12-13 来源: eefocus关键字:C51  字符型LCD 手机看文章 扫描二维码
随时随地手机看文章

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

#define TRUE   1
#define FALSE   0
//设置波特率
#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
/********************************************************
**本开发板支持1602 字符型LCD
**这种LCD的接口资料可以用google找到很多
**引脚定义:
* 1---GND
* 2---VDD
* 3---VLCD:对比度调节
* 4---RS:寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器
* 5---R/W:读写信号线,高电平时进行读操作,低电平时进行写操作。
          当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平
          RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
* 6---E:使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
* 7~14---DB0~DB7数据线、
* 15---A:背光引脚,"A"接正
* 16---K:背光引脚,"K"接负

*********************************************************/
#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);
}



//设置显示模式
void lcd_set_mode(unsigned char  cursor, unsigned char text)
{
    unsigned char mode="0x04";
    if(cursor){//光标右移
        mode|=0x02;
    }
    else{//光标左移
        mode|=0x00;
    }
    if(text){//文字移动
        mode|=0x01;
    }
    else{//文字不移动
        mode|=0;
    }
    lcd_write_cmd(mode);
}


   
void lcd_init(void)
{
    P0=0;
    LCDE="1";
    delay_ms(500);
    lcd_clear();
    lcd_write_cmd(0x38);//设置lcd功能:8位总线,双行显示,5X7点阵字符
    lcd_write_cmd(0x0f);//显示开关控制:显示ON,光标ON,闪烁ON
    lcd_write_cmd(0x06);//光标输入方式增量移位
    lcd_write_cmd(0x80);
    //lcd_write_cmd(0x0c);
    //lcd_clear();
}
//读取状态,是否忙
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)
    {
    }
}


关键字:C51  字符型LCD 引用地址:用C51写的1602字符型LCD程序

上一篇:51单片机低功耗工作模式
下一篇:Keil C51编写的192*64液晶片驱动程序

推荐阅读最新更新时间:2024-03-16 15:25

智能汽车程序、c51做智能小车
简介:本文介绍了c51做智能小车 的程序代码 /**********飞思卡尔智能汽车程序***/ //资源分配如下 //舵机用定时器0频率为50HZ //直流用定时器1频率为10KHZ //测速用外部中断0周期为50ms #include AT89X52.h #defineucharunsigned char #defineuint unsigned int sbit PWM_Steer=P1^0; sbit PWM_IN1=P1^2; sbit PWM_IN2=P1^3; //****舵机控制量************ //====f=24MHz ucharangle=8; /* uchar Low_Angle_L =
[单片机]
keil C51环境下,液晶某些汉字无法显示
一个小项目,在 keilC51中编写程序,在一块带字库的12864液晶上显示菜单。当向液晶屏中写入 数 这个汉字时,液晶屏无法正常显示,换成其他汉字可以,多次调试未果,怀疑编译器有问题。忽然想起keil的oxfd这个著名bug, 数 的编码为CAFD,打上补丁后显示正常。
[单片机]
c51中断优先级c语言,51单片机的中断优先级及中断嵌套
说最基本的,老的51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套。现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了。 在说到中断之前,我先来定义一下优先级,明白了什么是优先级,后面的阐述就容易明白了。实际上很多人都是混淆了优先级的含义,所以才觉得糊里糊涂。 中断的优先级有两个:查询优先级和执行优先级。 什么是查询优级呢?我们从datasheet或书上看到的默认(IP寄存器不做设置,上电复位后为00H)的优先级: 外部中断0 定时/计数器0 外部中断1 定时/计数器1 串行中断 或 int0,timer0,int1,timer1,serial port 或 INT0、T
[单片机]
C51单片机串行口中断服务程序
//出入均设有缓冲区,大小可任意设置。 //可供使用的函数名: //char getbyte(void);从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。 //getline(char idata *line, unsigned char n); //获取一行数据回车结束,已处理backspce和delete,必须定义最大输入字符数 //putinbuf(uchar c);模拟接收到一个数据 //putbyte(char c);放入一个字节到发送缓冲区 //putbytes(unsigned char *outplace,j);放一串数据到发送缓冲区,自定义长度 //putstring(unsign
[单片机]
LCD1602_8 data
程序要写出自己的风格 ****************************************************** ** 这是学习 msp430g2553 单片机时写的 1602 的程序 ** ** 时间精确到us,基本不出乱码 ** ** P1为数据输出端口 ** ** rs 接 p2.1 ** ** rw 接地 ** ** en 接 p2.0 ** *************************************************
[单片机]
AD7705应用 C51源程序
源程序有很多不妥之处:1、程序中电压结果换算不好,没用 % 取余方法 2、没有对最小精度进行换,方法是2.5/65535=38.14uV,然后用T_Voltage*38.14uV。另有问题请指出;希望大家能共享自己的原创,谢谢!游客说AD7710源程序与此差不多,不知是否能帮得上忙。 #include reg52.h #include absacc.h #include intrins.h #include math.h sbit Number_BIT0 = P2^7; sbit Number_BIT1 = P2^6; sbit Number_BIT2 = P2^5; sbit Number_BIT3 = P2^4; sb
[单片机]
pic单片机 DS18B20采样 LCD1602显示
#include 18b20.h #include main.h //--------------产生复位脉冲--------------------// void tx_reset() { ADCON1=0X06; TR ISA 5=0; DQ=1; delay_us2(10,5); //65us while(!DQ); //判断总线是否忙 DQ=0; delay_us2(10,23); //730us } //----------------等待应答脉冲----------------// void tx_wait () { TRISA5=1; //设为输入方式后,DQ被
[单片机]
C51实现单片机的中文输入法
说明: 拼音输入法杳询函数: unsigned char code * py_ime(unsigned char input_py_val ); input_py_val为已输入的拼音码字符串头指针, 反回值为中文的起始地址,当为0时,杳询失败 应用举例: { unsigned char input_string ={"bang"}; unsigned char chines_string ; sprintf(chines_string,"%s",py_ime(input_string)); } C51程序: //"********************CCDC01采集器测试仪软件:拼音输入法模块****
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved