注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
fa0103185的个人空间 https://home.eeworld.com.cn/space-uid-288856.html [收藏] [复制] [分享] [RSS]
日志

LCD1602

已有 1735 次阅读2011-6-1 21:53 |个人分类:MSC-51

//*********************************************************//
//main.c
//*********************************************************//
//需要函数的头文件
#include "../delay/delay.h"
#include "../lcd1602/lcd1602.h"
#include "../config/config.h"

//LCD1602显示缓存定义
uint8 code code_my_dat[]=".";
uint8 code code_table2[]="V";
uint8 code code_table[]="VOL:";
uint8 code code_tab_char[]="0123456789"; //相当于把变量转换成字符进行显示
uint8 data data_dat_tab[7]={0,0,0,0,0,0,0};//显示缓存
uint8 data dat_a,dat_b,dat_c,dat_d,dat_e,dat_f;
//将一个32位的变量dat转为字符串
void u32tostr(unsigned long dat,char *str)
{
 char temp[20];
 unsigned char i=0,j=0;
 i=0;
 while(dat)
 {
  temp[i]=dat%10+0x30;
  i++;
  dat/=10;
 }
 j=i;
 for(i=0;i<j;i++)
 {
  str[i]=temp[j-i-1];
 }
 if(!i) {str[i++]='0';}
 str[i]=0;
}

/********************************************
*函数名称:main
*输    入:无
*输    出:无
*说    明:
********************************************/
void main()
{
unsigned char temp[20];
uint32 dat=99999; //试验变量
LCD_INIT();       //LCD1602初始化
//P2=1;  //闲置的I/O要保持高电平,高电平可以降低整机功耗
//P3=1;  //当I/O为低的时候,MCU内部I/O的上拉电阻会有消耗              
   while(1)
   {
   u32tostr(dat,temp);
/*------------------数值转换--------------------------*/
   dat_a=data_dat_tab[0]=code_tab_char[dat/10000+'\0'];
   dat_b=data_dat_tab[1]='\0';
   dat_c=data_dat_tab[2]=code_tab_char[dat/1000%10+'\0'];
   dat_d=data_dat_tab[3]=code_tab_char[dat/100%10+'\0'];
   dat_e=data_dat_tab[4]=code_tab_char[dat/10%10+'\0'];
   dat_f=data_dat_tab[5]=code_tab_char[dat%10+'\0'];
/*++++++++++++++++++++++++++++++++++++++++++++++++++++*/
//从第一行第一个位置起,写入‘VOL:’四个字符
LCD1602_output_String(0,0,code_table);

LCD1602_output_String(0,1,temp);
//数据从第一行第四个位置顺序写入
LCD1602_SET_X_Y(5,0);
LCD_Rite_DAT(dat_a);
LCD_Rite_DAT(dat_c);
LCD_Rite_DAT(dat_d);
LCD_Rite_DAT('.');
LCD_Rite_DAT(dat_e);
LCD_Rite_DAT(dat_f);

//写入‘V’字符在第一行第16个位置
LCD1602_SET_X_Y(12,0);
LCD_Rite_DAT(code_table2[0]);
}
}

/*--------------------------END-----------------------------------*/
//***************************************************************//
//CONFIG.H
//************************************************************//
#ifndef   _CONFIG_H__
#define   _CONFIG_H__

//单片机特殊功能寄存器定时头文件引用
#include  <reg52.h>

//数据类型重定义
typedef unsigned char  uint8;
typedef unsigned int   uint16;
typedef unsigned long  uint32;

//LCD_1602借口定义
#define LCD_DAT_PORT    P1
sbit LCD_RS=P0^5;
sbit LCD_RW=P0^6;
sbit LCD_EN=P0^7;

#endif

//*****************************************************//
//DELAY.C
//***************************************************//
#include "delay.h"
#include  "../config/config.h"

void delay1ms(uint16 ms)   
{
uint16 i,j;

for(i=0;i<ms;i++)
for(j=122;j>0;--j);
}

void delay50ms(uint16 ms)   
{
uint16 j;
for(;ms>0;ms--)
for(j=6245;j>0;j--);
}
void delay50us(uint16 ms)   
{
uint16 j;
for(;ms>0;ms--)
for(j=19;j>0;j--);
}

void delay500us(void)      
{
    uint8 a,b;
    for(b=70;b>0;b--)
    for(a=2;a>0;a--);
}

//****************************************//
//LCD1602.C
//***************************************//
//需要函数的头文件
#include "LCD1602.H"
#include "../delay/delay.h" //..表示本工程的跟文件目录
                            //delay表示根目录下的delay文件夹
/*****************************************************************
*函数名称:LCD_wait *
*输    入:无 *
*输    出:无 *
*说    明:检测1602是否空闲 *
******************************************************************/
void LCD_wait(void)      
{   
uint8 i;
    LCD_DAT_PORT=0xff;
    LCD_RS=0;            //LCD_RS=0 LCD_RW=1 E=高电平
    LCD_RW=1;
    LCD_EN=1;
    for(i=0;i<20;i++)
    if((P2&0x80) == 0) break; //D7=0 表示LCD控制器空闲,则退出检测
    LCD_EN=0;
}
/****************************************************************
*函数名称:LCD_Write_CMD *
*输    入:无 *
*输    出:无 *
*说    明:LCD写指令 *
****************************************************************/
void LCD_Write_CMD(uint8 cmd)
{
LCD_wait();
LCD_EN=0;
LCD_RS=0;
LCD_RW=0;
LCD_DAT_PORT=cmd;
LCD_EN=1;
delay50us(10);
LCD_EN=0;
}
/****************************************************************
*函数名称:LCD_Rite_DAT *
*输    入:无 *
*输    出:无 *
*说    明:LCD写数据 *
****************************************************************/
void LCD_Rite_DAT(uint8 dat)  
{
LCD_wait();
LCD_EN=0;
LCD_RS=1;
LCD_RW=0;
LCD_DAT_PORT=dat;
LCD_EN=1;
delay50us(10);
LCD_EN=0;
}
/****************************************************************
*函数名称:LCD_Read_Condition *
*输    入:无 *
*输    出:无 *
*说    明:LCD读状态 *
****************************************************************/
void LCD_Read_Condition(uint8 zt)  
{
LCD_wait();
LCD_EN=0;
LCD_RS=0;
LCD_RW=1;
delay50us(10);
LCD_EN=1;
delay500us();
zt=LCD_DAT_PORT;
LCD_EN=0;
}
/****************************************************************
*函数名称:LCD_Read_DAT *
*输    入:无 *
*输    出:无 *
*说    明:LCD读数据 *
****************************************************************/
void LCD_Read_DAT(uint8 dat)
{
LCD_wait();
LCD_EN=0;
LCD_RS=1;
LCD_RW=1;
delay50us(10);
LCD_EN=1;
delay50us(10);
dat=LCD_DAT_PORT;
LCD_EN=0;
}
/***************************************************************
*函数名称:LCD1602_SET_X_Y   *
*输    入:x 横坐标 y 纵坐标   *
*输    出:无   *
*说    明:设置LCD1602的显示位置,Y=0第一行显示 Y=1第二行显示  *                                   
***************************************************************/
void LCD1602_SET_X_Y(uint8 x,uint8 y)
{
uint8  temp;
if(y==0)  
{
temp=0x80+x; //LCD1602第二行
}
else
{
temp=0xc0+x; //LCD1602第一行
}
LCD_Write_CMD(temp);
}
/**************************************************************
*函数名称:LCD1602_print_String  *
*输   入:x为横坐标,y为纵坐标,s字符串  *
*输   出:无  *
*说   明:LCD1602 打印字符串  *
***************************************************************/
void LCD1602_output_String(uint8 x,uint8 y,uint8 *s)
{
LCD1602_SET_X_Y(x,y);

while(s && *s)
{
LCD_Rite_DAT(*s);
s++;
}
}
/***************************************************************
*函数名称:LCD_INIT   *
*输    入:无   *
*输    出:无   *
*说    明:LCD初始化   *
****************************************************************/
void LCD_INIT()
{
delay50us(300);
LCD_Write_CMD(0x38);
delay50us(100);
LCD_Write_CMD(0x38);
delay1ms(100);
LCD_Write_CMD(0x38);
LCD_Write_CMD(0x38);
LCD_Write_CMD(0x08);
LCD_Write_CMD(0x01);
LCD_Write_CMD(0x06);
LCD_Write_CMD(0x0c);
}
/*--------------------------END----------------------------------*/

LCD1602程序 - Free51 - FreeWorld
全部作者的其他最新日志
发表评论 评论 (1 个评论)
回复 fa0103185 2011-7-1 17:02
我的程序结构有问题,#include  里面不应该加入绝对地址;在应用时会有些意想不到的错误

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章