//*********************************************************//
//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----------------------------------*/