LCD1602的C8051驱动

发布者:theta18最新更新时间:2016-01-13 来源: eefocus关键字:LCD1602  C8051  驱动 手机看文章 扫描二维码
随时随地手机看文章
//--------------------lcd1602.c------------------------------
//**********************************************
// 功能:C8051F(330) LCD1602(4线驱动)
//**********************************************
#include
#include "delay.h"
//
//1          10 11 12 13 14  15 16
//                    |
//|---| |     |---------------------|   |--|
//VSS VDD VL RS RW E  D0 D1 D2 D3 D4 D5 D6 D7   B+ B-

//
//连接:
//RS->P0.1
//RW->P0.2
//E->P0.3
//D4~D7->P1.4~P1.7
//VL根据不同型号,可能要接VSS或VDD
//B+/B-->+5/GND
//VSS/VDD->GND/+3.3

sbit lcd_rs=P0^1;
sbit lcd_rw=P0^2;
sbit lcd_e=P0^3;
#define LCD_DAT P1
//HD44780指令
#define LCD_CLEAR 0x01
//清屏
#define LCD_HOME 0x02
//光标复位
#define LCD_SET_INPUT 0x06
//输入模式:AC+1,显示不移
#define LCD_DISPLAY_OFF 0x80
#define LCD_DISPLAY_ON 0x0c
#define LCD_SHIFT 0x14
//显示屏和光标移动:AC+1,光标右移1格
#define LCD_MODE_8 0x38
#define LCD_MODE_4 0x28
//unsigned char lcd_add=0x00;
void lcd_write_cmd(unsigned char dat)
{
lcd_rs=0;
lcd_rw=0;
lcd_e=1;
LCD_DAT=dat;
delay_us(1);
lcd_e=0;
//delay_us(50);
delay_us(1);
lcd_e=1;
LCD_DAT=dat<<4;
delay_us(1);
lcd_e=0;
delay_us(50);
}
void lcd_sendchar(unsigned char dat)
{
lcd_rs=1;
lcd_rw=0;
lcd_e=1;
LCD_DAT=dat;
delay_us(1);
lcd_e=0;
//delay_us(50);
delay_us(1);
lcd_e=1;
LCD_DAT=dat<<4;
delay_us(1);
lcd_e=0;
delay_us(50);
}
//
//void lcd_wait_busy(void)
//{
//lcd_rs=0;
//lcd_rw=1;
//lcd_e=1;
//while(LCD_DAT&0x80);
//lcd_e=0;
//delay_us(50);
//}

void lcd_init(void)
{
lcd_e=0;
delay_ms(15);
lcd_write_cmd(LCD_MODE_8);
delay_ms(5);
lcd_write_cmd(LCD_MODE_8);
delay_ms(5);
lcd_write_cmd(LCD_MODE_8);
lcd_write_cmd(LCD_MODE_4);
//delay_us(50);
lcd_write_cmd(LCD_DISPLAY_ON);
//delay_us(50);
lcd_write_cmd(LCD_CLEAR);
delay_ms(2);
lcd_write_cmd(LCD_SET_INPUT);
//delay_us(50);
}
void lcd_reset(void)
{
lcd_write_cmd(LCD_CLEAR);
delay_ms(2);
lcd_write_cmd(LCD_HOME);
delay_ms(2);
}
void lcd_setadd(unsigned char add)
{
if(add>0x0f)add+=0x30;
lcd_write_cmd(add|0x80);
}
void lcd_sendstr(unsigned char add,unsigned char *dat)
{
lcd_setadd(add);
while(*dat)
{
  lcd_sendchar(*dat++);
}
}
//-----------------------------------------------------------------
//----------------------lcd1602.h---------------------------------
#ifndef _LCD_1602
#define _LCD_1602
extern void lcd_write_cmd(unsigned char dat);
extern void lcd_sendchar(unsigned char dat);
extern void lcd_wait_busy(void);
extern void lcd_init(void);
extern void lcd_sendstr(unsigned char add,unsigned char *dat);
extern void lcd_setadd(unsigned char add);
extern void lcd_reset(void);
#endif
//-------------------------------------------------------------------
//----------------delay.c-------------------------------------------
//**********************************************
// 功能:C8051F(330)精确延时 24.5M
// 作者:July
// Blog: http://blog.sina.com.cn/mcuworld
// 最后更新:2008-12-31
// 尊重劳动成果,引用请勿删除本信息谢谢!
//**********************************************
#include
#include
//----------------------------------------------
//----------------------------
// 微秒级精确延时
// 仿真:(24.5M)
// delay_us(1);   //1.72us
// delay_us(10);  //10.89us
// delay_us(100); //102.74us
//----------------------------
void delay_us(unsigned char k)
{
while(k--)
{
  _nop_();_nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();_nop_();
}
}
//----------------------------------------------
// 毫秒级精确延时
// 仿真:(24.5M)
// delay_ms(1);   //1001.75us
// delay_ms(10);  //10.008ms
// delay_ms(100); //老机太慢出不来鸟~自己测吧:)
//----------------------------------------------
void delay_1ms()
{
    unsigned int j ;
    for(j=3060;j>0;j--);
}
void delay_ms(unsigned int i)
{
    for(;i>0;i--)delay_1ms();
}
//------------------------------------------
//----------------delay.h-----------------
#ifndef _DELAY_H
#define _DELAY_H
extern void delay_us(unsigned char k);
extern void delay_ms(unsigned int i);
#endif
//---------------------------------------
//---------------------main.c--------------
//**********************************************
// 功能:C8051F(330)精确延时+UART0+LCD1602(4线)
// 作者:July
// Blog: http://blog.sina.com.cn/mcuworld
// 最后更新:2009-5-12
// 尊重劳动成果,引用请勿删除本信息谢谢!
//**********************************************
//
//AVR/AVR32群:78613373
//C8051F/STC/MPC群:78614293
//Cortex-M3/M0(STM32)群:78612895
//PIC/PIC32群:78614030
//LabWindows/CVI群:20328398
//WinCE/C#群:74373749
//
//使用F330,串口为P0.4(TX0),P0.5(RX0);
#include
//#include
#include "uart0.h"
#include "delay.h"
#include "lcd1602.h"
void SYSCLK_Init(void);
void PORT_Init(void);

void main(void)
{
    unsigned char dat=0x20;
unsigned char address=0;
PCA0MD&=~0x40 ;
    // 禁止看门狗
    PORT_Init();
    // 初始化端口I/O
    SYSCLK_Init();
    // 初始化系统时钟
    UART0_Init();
    // 串口初始化

    EA=1 ;
    ES0=1 ;
P0|=0x01;
lcd_init();
lcd_reset();
lcd_sendstr(0,"1234567890abcdef");
lcd_sendstr(16,"ghijklmnopqrstuv");
sendstr("Welcome to July's Hut! ");
    while(1)
    {
        delay_ms(200);
  P0^=0x01;
  Uart0_Transmit(dat);
  lcd_setadd(address++);
  if(address>31)address=0;
  lcd_sendchar(dat++);
  if(dat>=0x7f)dat=0x20;
        //Uart0_Transmit(0x00);
    }
}
//-----------------------------------------------------------------------------
// 端口初始化
//-----------------------------------------------------------------------------
//
// 配置交叉开关和通用IO
//
// P0.4 - UART TX0
// P0.5 - UART RX0
void PORT_Init(void)
{
    P0MDOUT|=0x10 ;
    // 使能 UTX 为推挽输出
P0MDOUT|=0x01;
    XBR0=0x01 ;
    // 使能 UART0 占用 P0.4(TXD) 和 P0.5(RXD)
    XBR1=0x40 ;
    //使能交叉开关
}
//-----------------------------------------------------------------------------
// 系统时钟初始化
//-----------------------------------------------------------------------------
void SYSCLK_Init(void)
{
    OSCICN|=0x03 ;
    // 配置内部振荡器的的最大频率
    RSTSRC=0x04 ;
    // 使能始终丢失检测寄存器
}
//----------------------------------------------------
//-------------main.h----------------------
#ifndef _MAIN_H
#define _MAIN_H
// 系统工作频率
#define SYSCLK 24500000
// 串口工作波特率
#define BAUDRATE 9600
#endif
//----------------------------------------
//----------uart0.c-----------------------
//**********************************************
// 功能:C8051F(330) UART0
// 作者:July
// Blog: http://blog.sina.com.cn/mcuworld
// 最后更新:2009-5-12
// 尊重劳动成果,引用请勿删除本信息谢谢!
//**********************************************
#include
#include "main.h"
unsigned char temp ;
void UART0_Init(void);
void Uart0_Transmit(unsigned char tmp);
void sendstr(unsigned char*tmp);
//-----------------------------------------------------------------------------
// 串口UART0初始化
//-----------------------------------------------------------------------------
void UART0_Init(void)
{
    SCON0=0x10 ;
    if(SYSCLK/BAUDRATE/2/256<1)
    {
        TH1=-(SYSCLK/BAUDRATE/2);
        CKCON&=~0x0B ;
        CKCON|=0x08 ;
    }
    else if(SYSCLK/BAUDRATE/2/256<4)
    {
        TH1=-(SYSCLK/BAUDRATE/2/4);
        CKCON&=~0x0B ;
        CKCON|=0x09 ;
    }
    else if(SYSCLK/BAUDRATE/2/256<12)
    {
        TH1=-(SYSCLK/BAUDRATE/2/12);
        CKCON&=~0x0B ;
    }
    else
    {
        TH1=-(SYSCLK/BAUDRATE/2/48);
        CKCON&=~0x0B ;
        CKCON|=0x02 ;
    }
    
    TL1=TH1 ;
    TMOD&=~0xf0 ;
    TMOD|=0x20 ;
    TR1=1 ;
    // TI0 = 1;
}
//-----------------------------------------------------------
// 串口UART0中断
//-----------------------------------------------------------
//中断向量0x0023
void UATR0_ISR(void)interrupt 4
{
    //Rx、Tx共用中断
    //接收中断
    if(!TI0)
    {
        RI0=0 ;
        temp=SBUF0 ;
        Uart0_Transmit(temp);
    }
    //发送中断
    else TI0=0 ;
}
//-----------------------------------------------------------
// 串口UART0发送
//-----------------------------------------------------------
void Uart0_Transmit(unsigned char tmp)
{
    ES0=0 ;
    //关UART0中断
    EA=0 ;
    //关全局中断
    SBUF0=tmp ;
    while(TI0==0);
    //TI0=0 ;
    ES0=1 ;
    //开UART0中断
    EA=1 ;
    //开全局中断
    
}
//-----------------------------------------------------------
// 发送字符串
//-----------------------------------------------------------
void sendstr(unsigned char*tmp)
{
    while(*tmp)
    {
        Uart0_Transmit(*tmp++);
    }
}

//-----------------------------------
//-----------------------uart0.h-------------------
#ifndef _UART0_H
#define _UART0_H
extern void UART0_Init(void);
extern void Uart0_Transmit(unsigned char tmp);
extern void sendstr(unsigned char*tmp);
#endif

//------------------------------------- 
关键字:LCD1602  C8051  驱动 引用地址:LCD1602的C8051驱动

上一篇:C8051F(330)精确延时程序(24.5M)
下一篇:LCD12864(ST7920)的C8051驱动(并行)

推荐阅读最新更新时间:2024-03-16 14:43

IBM发布赛道内存:百倍于闪存容量
  在IBM(NYSE: IBM)科学家小组的研发下,兼具闪存的高性能、可靠性以及硬盘的低成本、高容量特性的计算机内存已经指日可待。   2008年4月11日出版的《科学》杂志发表了两篇论文,文中介绍了由IBM院士Stuart Parkin先生及IBM Almaden研究中心(位于圣何塞市)同事共同研发的一种名为“赛道”内存的技术基础原理以及该技术发展过程中的一项极具里程碑意义的成果。该成果可使得电子设备在同样的空间内存储远多于今天的数据,同时拥有闪电般的启动速度、低得多的成本以及前所未有的稳定性和耐久性。未来的十年内,赛道内存(因数据延线“道”运动而命名)可使得固态电子设备——由于没有运动部件因此更加耐用,能够在同样的空间内容
[新品]
Swissbit工业级USB闪存驱动器‘U-50n’,写入数据速率没得说
Swissbit宣布推出小巧且坚固的USB 3.1闪存驱动器U-50n(Nano),容量从8到64GB,专为物联网和工业应用所打造。 新的U-50n可满足苛刻应用所有的特性需求。它具有-40至85°C的工业级工作温度范围、机械稳定性高的金属外壳、可承受频繁插拔的30µ”金连接器、具有良好抗冲击和抗振动的模制COB(板载芯片)封装。Nano是在Swissbit在德国柏林的生产基地生产和测试的,它是体现该公司先进封装能力的一个典型案例。 快速且耐用 U-50n具有复杂的基于页面的固件,该固件可显著降低写入放大率,并加速随机写入操作。在性能方面,顺序读/写访问可达135/65 MB/s,随机操作表现出色,IOPS
[嵌入式]
Swissbit工业级USB闪存<font color='red'>驱动</font>器‘U-50n’,写入数据速率没得说
Diodes全新车规级降压 LED驱动器问市,可简化回馈回路
Diodes 公司 宣布推出 AL8843Q 与 AL8862Q 两款符合汽车规格的直流对直流 (DC-DC) 降压转换器,适用于驱动汽车内外部单一的 LED 或多重 LED 灯条。产品应用包含目前许多制造商已设为标准配备的日行灯 (DRL),亦包含雾灯、方向灯、煞车/停止灯。 AL8843Q 与 AL8862Q 的供应电压皆从 4.5V 到至少 40V (AL8862Q 达 55V),可承受相当严重的电压变动,例如怠速启动或熄火/启动操作时的负载突降,不会产生对应的 LED 驱动器电流衰减问题。 高整合度不仅带来高效能,亦减少物料清单。两款皆内建功率 MOSFET:AL8843Q 为 40V/0.2Ω,AL8862
[汽车电子]
Diodes全新车规级降压 LED<font color='red'>驱动</font>器问市,可简化回馈回路
东芝推出电机驱动器IC,可在待机模式实现零电流
东京—东芝公司(TOKYO:6502)今天宣布推出一种全桥直流电机驱动器集成电路“TB67H301FTG”,可用于打印机、售货机和游戏机等消费与工业设备。该产品于今天投入量产。 该集成电路整合了待机功能,可在待机模式实现零电源电流 。它采用了紧凑的无铅WQFN24封装,安装面积降为同类产品的1/3,有助于缩小设备体积,降低PCB成本。 主要特性 内置省电功能 待机模式下,新整合的关断电路可将电流降至零 。 小型封装 WQFN24封装具有很好的导热性,可与同类产品实现相同的绝对最大额定 电压与电流值 。该小型无铅封装可减少安装面积。 内置异常检测功能 TB67H301FTG整合了过流关断电路、欠压锁止电路和过热关断
[工业控制]
东芝推出电机<font color='red'>驱动</font>器IC,可在待机模式实现零电流
基于ARM芯片S3C2410的TFT-LCD驱动方法
S3C2410是三星公司生产的基于ARM920T内核的RISC微处理器,主频率可达203MHz,适用于信息家电、Smart Phone、Tablet、手持设备、移动终端等领域。其中,集成的LCD控制器具有通用性,可与大多数的LCD显示模块接口。 PD064VT5是一种用非晶硅TFT作为开关器件的有源矩阵液晶显示器,该模块包括TFT-LCD显示屏、驱动电路和背光源,其接口为TTL电平。分辨率为640 x480像素,可通过18bit数据信号显示262 144种色彩。 1 S3C2410的LCD控制器 S3C2410中的LCD控制器可用于传输视频数据并产生必要的控制信号(像VFRAME、VLINE、VCLK、VM等
[单片机]
基于ARM芯片S3C2410的TFT-LCD<font color='red'>驱动</font>方法
基于S3C2440的嵌入式Linux驱动——SPI子系统解读(四)
本文属于第四部分。 7. write,read和ioctl综述 在spi设备驱动层提供了两种数据传输方式。一种是半双工方式,write方法提供了半双工读访问,read方法提供了半双工写访问。另一种就是全双工方式,ioctl调用将同时完成数据的传送与发送。 在后面的描述中,我们将对write和ioctl方法做出详细的描述,而read方法和write极其相似,将不多做介绍。 接下来首先看看write方法是如何实现的。 8. write方法 8.1 spidev_write 在用户空间执行open打开设备文件以后,就可以执行write系统调用,该系统调用将会执行我们提供的write方法。代码如下: 下列代码位于d
[单片机]
基于S3C2440的嵌入式Linux<font color='red'>驱动</font>——SPI子系统解读(四)
51单片机LCD1602两行移动显示
第一行:My name is Eagal 第二行:Music film Games #include reg52.h #define uchar unsigned char #define uint unsigned int sbit lcden=P3^4; sbit rs=P3^5; sbit rw=P3^6; sbit dula=P2^6; sbit wela=P2^7; uchar table1 = My name is Eagal ; uchar table2 = Music Flim Games ; void delay(uint x) { uint a,b; for(a=x;a 0;a--) f
[单片机]
51单片机lcd1602
{ Uchar i; for (i=0;i 16;i++) { DispOneChar(i,1,dd++); dd &= 0x7f; if (dd 32) dd=32; } } // 显示光标定位 void LocateXY( char posx,char posy) { Uchar temp; temp = posx & 0xf; posy &= 0x1; if ( posy )temp |= 0x40; temp |= 0x80; LcdWriteCommand(temp,0); } // 按指定位置显示数出一个字符 void DispOneChar(Uchar x,Uchar y,Uchar Wd
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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