基于51的LCD1602四数据线驱动

发布者:悠闲自在最新更新时间:2016-11-21 来源: eefocus关键字:LCD1602  四数据线驱动 手机看文章 扫描二维码
随时随地手机看文章

/这个程序已经调试过了 
//下面调用实例 
//////////////////////////////////
//LCD1602读写头文件
//四线驱动方式
//////////////////////////////////
#include  
#include "LCD1602.h" 
/*----------- 
管脚定义在液晶头文件中 
-----------*/ 
void main(void){ 
LCD_init(); 
p=LCD_PutStr("Hello Lcd1602!\n",-1); //显示一段文字 
p=LCD_PutNum(1234,2,p); //显示12.34这个数 
while(1); 
}
/*---------------------------------------------------------
液晶LCD1602C 使用4条数据线(D4~D7)
-----------------------------------------------------------*/
/*-------------------------------------------------------------
LCD引脚定义
1---GND 
2---VCC
3---VO
4---RS
5---RW
6---EN
7到14--D0-D7
15--背景灯+
16--背景灯-
-----------------------------------------------------------------*/
#include
#include


#define LCD_DATA P2
sbit LCD1602_RS=P2^2;
sbit LCD1602_EN=P2^3;

int p=0;

/*--------------------------------------------------------------------------------------------------
函数说明
--------------------------------------------------------------------------------------------------*/
void LCD_init(void);
void LCD_en_write(void);
void LCD_write_command(unsigned char command) ;
void LCD_write_data(unsigned char Recdata);
void LCD_set_xy (unsigned char x, unsigned char y);
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);
void LCD_write_char(unsigned char X,unsigned char Y,unsigned char Recdata);
void delay_nus(unsigned int n);
void delay_nms(unsigned int n);

void delay_1us(void)                 //1us延时函数
{
   _nop_();
}

void delay_nus(unsigned int n)       //N us延时函数
{
   unsigned int i=0;
   for (i=0;i   delay_1us();
}

void delay_1ms(void)                 //1ms延时函数
{
   unsigned int i;
   for (i=0;i<1140;i++);
}

void delay_nms(unsigned int n)       //N ms延时函数
{
   unsigned int i=0;
   for (i=0;i   delay_1ms();
}


void LCD_init(void)         //液晶初始化
{

LCD_write_command(0x28);
delay_nus(40); 
LCD_write_command(0x28);
delay_nus(40); 
LCD_write_command(0x28);
delay_nus(40); 

LCD_en_write();
delay_nus(40);
LCD_write_command(0x28); //4位显示
LCD_write_command(0x0c); //显示开
LCD_write_command(0x01); //清屏
delay_nms(2);
}

void LCD_en_write(void) //液晶使能
{
LCD1602_EN=1;
delay_nus(1);
LCD1602_EN=0;
}

void LCD_write_command(unsigned char command) //写指令
{
delay_nus(16);
LCD1602_RS=0;        //RS=0
LCD_DATA&=0X0f;         //清高四位
LCD_DATA|=command&0xf0; //写高四位
LCD_en_write();
command=command<<4;          //低四位移到高四位
LCD_DATA&=0x0f;         //清高四位
LCD_DATA|=command&0xf0; //写低四位
LCD_en_write();

}

void LCD_write_data(unsigned char Recdata) //写数据
{
delay_nus(16);
LCD1602_RS=1;       //RS=1
LCD_DATA&=0X0f;       //清高四位
LCD_DATA|=Recdata&0xf0; //写高四位
LCD_en_write();
Recdata=Recdata<<4;               //低四位移到高四位
LCD_DATA&=0X0f;        //清高四位
LCD_DATA|=Recdata&0xf0;   //写低四位
LCD_en_write();
}


void LCD_set_xy( unsigned char x, unsigned char y ) //写地址函数
{
    unsigned char address;
    if (y == 0) address = 0x80 + x;
    else address = 0xc0 + x;
    LCD_write_command(address);
}

void LCD_write_char(unsigned char X,unsigned char Y,unsigned char Recdata) //列x=0~15,行y=0,1
{
LCD_set_xy(X, Y); //写地址
LCD_write_data(Recdata);
}

int LCD_PutStr(unsigned char *DData,int pos){ 
unsigned char i; 
if(pos==-1){  
   LCD_write_command(0x01); //清屏
   delay_nms(2);
   pos=0; 
   } 
while((*DData)!='\0'){  
switch(*DData){   
     case '\n': //如果是\n,则换行   
     {    
     if(pos<17){     
       for(i=pos;i<16;i++)
         LCD_write_char(i%16, i/16, ' ');
         pos=16;
         }
         else{     
         for(i=pos;i<32;i++) LCD_write_char(i%16, i/16, ' ');
         pos=32;
         }    
     break;   
     }
   
     case '\b': //如果是\b,则退格   
     {
     if(pos>0) pos--;   
     LCD_write_char(pos%16, pos/16, ' ');    
     break;   
     }
   
     default:   
     {    
    
     if((*DData)<0x20){
     *DData=' ';
     }
    
     LCD_write_char(pos%16, pos/16,*DData);
     pos++;    
     break;   
     }  
      }  
      DData++; 
       } 
       return(pos);
       }

//----------------------------以下函数用于输出数字---------------------
int LCD_PutNum(unsigned long num,int XS,int pos){    //从右边数,保留几位小数
unsigned long tmp=0; 
unsigned char numbits=0; 
if(pos==-1){  
LCD_write_command(0x01);
delay_nms(2);  
pos=0; 

if(num==0){  
   LCD_write_char(pos%16, pos/16, '0');
   pos++;
   }
   else{  
   if(num<0){   
   LCD_write_char(pos%16, pos/16, '-');   
   num*=(-1);   
   pos++;  
   }  
   while(num){   
   tmp=tmp*10+(num%10);   
   num=num/10;   
   numbits++;
   }  
   while(tmp){   
   LCD_write_char(pos%16, pos/16, (tmp%10)+48);
   tmp=tmp/10;
   pos++;
   numbits--;
   if(numbits==XS) pos=LCD_PutStr(".",pos); //显示小数点
   }
   while(numbits--){
   LCD_write_char(pos%16, pos/16, '0');
   pos++;
   }
   }
   return(pos);
}


关键字:LCD1602  四数据线驱动 引用地址:基于51的LCD1602四数据线驱动

上一篇:使用89C52来做定时记数器
下一篇:8052 T2 用法详解

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

一种基于TPS65105的TFT-LCD电源设计
TPS65105  是一个混合式DC/DC变换器集成电路芯片。它专门为薄膜式晶体管(TFT)LCD 显示器供电而设计的,针对LCD 的供电要求能够提供三路输出电压。该芯片内部辅助式线性稳压器能够从5 V 的输入电源中为供电系统提供3.3 V的总线电源电压输出。 其内部的主输出Vol 是一个工作频率高达1.6 MHz的固定频率PWM升压式DC/DC变压器,它能够为LCD显示器的驱动源提供一个供电电压。该芯片内部还集成了一个具有不同功率开关电流极限值的DC/DC变换器控制器。 TPS65105  的功率开关电流极限典型值为2.3A.集成在芯片内部的完整的电荷泵除输出电压可以调节以外,还可以为LCD正栅极驱动器提供2倍压/3倍压的输出
[电源管理]
一种基于TPS6<font color='red'>51</font>05的TFT-LCD电源设计
基于DS1302与AT89C2051的红外遥控LED电子钟制作
自制LED电子钟在很多电子报刊杂志上都可以见到,但大多数在断电后都要重新设置时间等 参数,给使用带来很多不便。也有用后备电池作为备用电源的,但往往体积较大。本文介绍 的LED电子钟克服了以往的弊端,而且采用了家电通用的红外遥控器进行控制,方便使用。 有一路闹铃输出,可以通过遥控器设置闹铃时间及允许与否。 电子钟的正面 电子钟的背面 一.工作原理 DS1302为达拉斯公司的一种实时时钟芯片,主要特点是采用串行数据传输,可为掉电保护电 源提供可编程的充电功能,并且可以关闭充电功能。采用普通32768Hz晶振。 AT89C2051作为主控芯片,一是对接收到的红外遥控编码进行判断识别,并执行相应的处 理;第二就是定期的读取时
[单片机]
Keil C51对C语言的关键词扩展之十: pdata
外部ram通过一个地址指针寄存器来间接访问,读写效率要低于内部ram。 外部ram容量最大可位64KB。 Keil C51提供两种外部数据存储方式,pdata和xdata。 1)xdata存储类型,指示变量可存储在外部ram 64KB地址范围内任意位置。large内存模型下,变量即为此种默认存储类型。 2)pdata存储类型,指示变量可存储在外部ram 256字节页范围内任意位置。compact内存模型下,变量即为此种存储类型。 外部ram通过movx指令存取。
[单片机]
C51单片机学习笔记(一)——搭建开发环境及烧写工具
1.搭建软件开发环境及使用(Keil uVision) 目前常用的有Keil uVision2、Keil uVision3、Keil uVision4,这些软件可以很方便的在网络上下载,我这里使用的是Keil uVision4. ** 1. 创建一个工程:(以点亮一个发光二极管为例) 菜单点击Project - New uVision Project ,给工程命名、选择储存位置然后保存 选芯片,根据自己的单片机型号选择对应的芯片,我使用的是AT89C52 之后弹出 是否将系统自带的初始化文件添加到工程?一般选择是,这是主界面左边Project面板会显示新建的工程。 新建源程序文件 点击File - New ,在软件
[单片机]
C<font color='red'>51</font>单片机学习笔记(一)——搭建开发环境及烧写工具
[stm32] 利用uc-gui封装画图和画线函数移植51上的模拟动画
_ :这里的动画是黄色矩形区域中一个模仿俯视图的起重机运作动画,一个是模仿主视图的吊钩的运动。通过改变初始Init函数中的数据b_x,b_y实现矩形区域的移动。当实时采集时要首先根据起重机的实际情况改变比例,当传感器传来数据时就相当于这里的run函数,只要把传感器数据接收函数和相关函数结合即可。 _ :main code: 1 #include stdlib.h 2 #include GUI.H 3 /* 4 颜色 5 */ 6 #define Black 0x000000 7 #define White 0xFFFFFF 8 #define Blue 0xFF0000 9 #define R
[单片机]
基于C8051F040的CAN总线智能节点设计
引言 “X型火控系统”根据实际需要采用了CAN总线方式来实现其内部单体间的通信。CAN总线是一种用于各种设备检测及控制的现场总线,它是一种多主总线,在高速网络和低成本的节点系统中应用都很广泛。CAN总线与一般的通信总线相比,它的数据通信具有突出的可靠性、实时性和灵活性。其特点如下: *可以多主方式工作。 *CAN节点只需对报文的标识符滤波即可实现点对点、一点对多点及全局广播方式发送和接收数据。 *CAN总线通信格式采用短帧格式。 *采用非破坏性总线仲裁技术。 *直接通信距离最大可达10km (速率5kb/s以下),最高通信速率可达1Mb/s (此时距离最长为40m),节点数可达110个,通信介质可以是双绞线、同轴电缆或光导纤维。
[工业控制]
51单片机---定时器/计数器的配置
1.CPU时序 振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期)。比如开发板的时钟电路上的12MHZ晶振,它就提供了单片机的振荡周期。周期T=1/12M,单位为秒。 状态周期: 两个振荡周期为1个状态周期,用S表示。振荡周期又称为S周期或时钟周期。 机器周期:6个状态周期,即12个振荡周期。以12MHZ晶振为例,机器周期=12*(1/12M)=1/M=1us. 指令周期:完成一条指令所占用的全部时间,以机器周期为单位。以12MHZ为例,指令周期为1~4us. 2.定时器绪论 51单片机有2组定时器/计数器,既可以定时又可以计数。 定时器/计数器和单片机的CPU是相互独立的,定时器/计数器工作时不需要C
[单片机]
<font color='red'>51</font>单片机---定时器/计数器的配置
使用51单片机设计一个带语音报数功能的抢答器原理图
现在市面上的抢答器类型很多,带有语音功能的抢答器不是很多且其价格较贵。本文介绍一款带有语音报数功能的抢答器。抢答器由单片机(AT89S52)、语音芯片(ISD2560)、20cm的LED及少数外围元件构成。由于采用单片机,外围电路非常简单,但是功能不比一般的抢答器少。 此抢答器具有防作弊功能、语音报数功能、两组显示功能 。
[单片机]
使用<font color='red'>51</font>单片机设计一个带语音报数功能的抢答器原理图
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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