⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.c

📁 51控制LM368 驱动芯片 c语言的STC单片机
💻 C
字号:
//2行X16个字符位LCD驱动程序
//P0接LCD MODULE D0~D7,

#include "reg51.h"
#include "typedef.h"
#include "lcd.h"
#include "key.h"

uchar gLCDstr[LCDMaxChar];
uchar sec;
uchar min;
uchar hour;
uchar date=1;            
uchar month=1;
uchar year=6;
uchar day_of_week;   //2006-01-01 Sun 00:00:00
uchar clk_hour=8;    
uchar clk_min=0;     //-08:00-

typedef struct clk_month 
{         
    uchar  MonthDays;        // Number of days in each month
    //char  *MonthName;        Name of the month
    uchar  MonthVal;         //Value used to compute day of the week 
} CLK_MONTH;

CLK_MONTH code ClkMonthTbl[]={    // MONTHS TABLE                                       
    {0,  /*"", */          0},   // Invalid month                               
    {31, /*"January ",*/   6},   // January                                     
    {28, /*"February ",*/  2},   // February (note leap years are handled by code) 
    {31, /*"March ",*/     2},   // March                                          
    {30, /*"April ",*/     5},   // April                                          
    {31, /*"May ", */      0},   // May                                            
    {30, /*"June ", */     3},   // June                                           
    {31, /*"July ", */     5},   // July                                           
    {31, /*"August ",*/    1},   // August                                         
    {30, /*"September ",*/ 4},   // September                                      
    {31, /*"October ",  */ 6},   // October                                        
    {30, /*"November ",*/  2},   // November                                       
    {31, /*"December ", */ 4}    // December                                       
};


uchar code *ClkDOWTbl[] = {  // NAME FOR EACH DAY OF THE WEEK
    "Sun",
    "Mon",
    "Tue",
    "Wed",
    "Thu",
    "Fri",
    "Sat"
};


uchar code hex2bcd[] = {
    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,	/* 00-09 */
    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,	/* 10-19 */
    0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,	/* 20-29 */
    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,	/* 30-39 */
    0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,	/* 40-49 */
    0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,	/* 50-59 */
    0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,	/* 60-69 */
    0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,	/* 70-79 */
    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,	/* 80-89 */
    0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,	/* 90-99 */
};

uchar code bcd2hex[] = {
     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 0, 0, 0, 0, 0, 0,	/* 00-09 */
    10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0,	/* 10-19 */
    20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0,	/* 20-29 */
    30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 0, 0, 0, 0, 0, 0,	/* 30-39 */
    40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 0, 0, 0, 0, 0, 0,	/* 40-49 */
    50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 0, 0, 0, 0, 0, 0,	/* 50-59 */
    60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 0, 0, 0, 0, 0, 0,	/* 60-69 */
    70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 0, 0, 0, 0, 0, 0,	/* 70-79 */
    80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 0, 0, 0, 0, 0, 0,	/* 80-89 */
    90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 0, 0, 0, 0, 0, 0,	/* 90-99 */
};

/*函数名称:LCD Module 地址发送*/
void send_cmd(uchar lcd_cmd)
{
    uchar i;
    rs_lcd = 0;
    rw_lcd = 0;
    P0 = lcd_cmd;
    en_lcd=1;
    for(i=0;i<2;i++);
    en_lcd=0;
}

/*函数名称:LCD Module 数据发送*/
void send_data(uchar lcd_data)
{
    uchar  i;

    rs_lcd = 1;
    rw_lcd = 0;
    P0 = lcd_data;
    en_lcd=1;
    for(i=0;i<2;i++);
    en_lcd=0;
}

/*函数名称:读LCD Module 忙状态*/
uchar read_status()
{
    uchar port_status=0;
    rs_lcd = 0;
    rw_lcd = 1;
    port_status = P0;
    return (port_status&0x80);
}

/*函数名称:判断LCD Module 是否忙状态,若是,延时*/
void check_ready(void)
{
    uchar  i;
    i=read_status();
    if(i) for(i=0;i<50;i++);
}

void lcd_task(void)
{
  uchar i,address,a0=128;
	for(i=0;i<32;i++)
  {
  	check_ready();
    if(a0<0x90)
    	address = 0x80;
    else
    	address = 0xC0;
    send_cmd(address+i%16);
    check_ready();
    send_data(gLCDstr[i]);
    a0=a0+1;
 	}
}

void cpy_time_str(uchar *st1, uchar *st2)
{
	uchar i;
	for(i=0;i<8;i++)
		st2[i+24]=st1[i];
}

void cpy_dow_str(uchar *st1, uchar *st2)
{
	uchar i,blank=0;
	for(i=0;i<5;i++)
	{
		if(st1[i]=='\0')
			blank=1;
    if(blank==0)
      st2[i+11] = st1[i];
    else
    	st2[i+11] = ' ';
	}
}

void cpy_year_str(uchar *st1, uchar *st2)
{
	uchar i;
	for(i=0;i<11;i++)
		st2[i]=st1[i];
}

void cpy_clock_str(uchar *st1, uchar *st2)
{
	uchar i,blank=0;
	for(i=0;i<8;i++)
	{
		if(st1[i]=='\0')
			blank=1;
    if(blank==0)
      st2[i+16] = st1[i];
    else
    	st2[i+16] = ' ';
	}
}

/*函数功能:判断是否为润年*/
bit ClkIsLeapYear(uint year)
{
  if (!(year%4)&&(year%100)||!(year%400))
  	return true;
  else
    return false;
}

void lcd_disp_time(void)
{
	uchar TimeString[8];
	if((flash_flag==true)&&(function_count==3))
	{
		TimeString[0]=' ';
		TimeString[1]=' ';
	}
	else
	{
		TimeString[0]=hex2bcd[hour/10]+0x30;  //hour 十位
		TimeString[1]=hex2bcd[hour%10]+0x30;;//hour 个位
	}
	TimeString[2]=':';
	if((flash_flag==true)&&(function_count==2))
	{
		TimeString[3]=' ';
		TimeString[4]=' ';
	}
	else
	{
  	TimeString[3]=hex2bcd[min/10] + 0x30;		//min 十位
  	TimeString[4]=hex2bcd[min%10] + 0x30;	//min 个位
  }
	TimeString[5]=':';
	if((flash_flag==true)&&(function_count==1))
	{
		TimeString[6]=' ';
		TimeString[7]=' ';
	}
	else
	{
		TimeString[6]=hex2bcd[sec/10] + 0x30;			//sec 十位
		TimeString[7]=hex2bcd[sec%10] + 0x30;			//sec 个位
	}
	cpy_time_str(TimeString,gLCDstr);
}

void lcd_disp_dow(void)
{
	uint dow;	//Day of week
  dow = date + ClkMonthTbl[month].MonthVal;
  if (month < 3)
  {
  	if(ClkIsLeapYear(year))
    	dow--;
  }
  dow+=(year+2000)+((year+2000) / 4);
  dow+=((year+2000)/400)-((year+2000)/100);
  dow%=7;
  cpy_dow_str(ClkDOWTbl[dow], gLCDstr);
}

void lcd_disp_year(void)
{
	uchar YearString[11];
	YearString[0]=0x32;
	YearString[1]=0x30;
	if((flash_flag==true)&&(function_count==8))
	{
		YearString[2]=' ';
		YearString[3]=' ';
	}
	else
	{
		YearString[2]=hex2bcd[year/10]+0x30;
		YearString[3]=hex2bcd[year%10]+0x30;
	}
	YearString[4]='-';
	if((flash_flag==true)&&(function_count==7))
	{
		YearString[5]=' ';
		YearString[6]=' ';
	}
	else
	{
		YearString[5]=hex2bcd[month/10]+0x30;
		YearString[6]=hex2bcd[month%10]+0x30;
	}
	YearString[7]='-';
	if((flash_flag==true)&&(function_count==6))
	{
		YearString[8]=' ';
		YearString[9]=' ';
	}
	else
	{
		YearString[8]=hex2bcd[date/10]+0x30;
		YearString[9]=hex2bcd[date%10]+0x30;
	}
	YearString[10]=' ';
	cpy_year_str(YearString,gLCDstr);
}

void lcd_disp_clock(void)
{
	uchar TimeString[8];
	if(alarm_flag==false)
	{
		TimeString[0]='A';
		TimeString[1]='R';
		TimeString[2]='M';
		TimeString[3]=' ';
		TimeString[4]='O';
		TimeString[5]='F';
		TimeString[6]='F';
		TimeString[7]=' ';
	}
	else
	{
  	TimeString[0]='-';
  	if((flash_flag==true)&&(function_count==5))
  	{
  		TimeString[1]=' ';
  		TimeString[2]=' ';
  	}
  	else
  	{
  		TimeString[1]=hex2bcd[clk_hour/10]+0x30;
  		TimeString[2]=hex2bcd[clk_hour%10]+0x30;
  	}
  	TimeString[3]=':';
  	if((flash_flag==true)&&(function_count==4))
  	{
  	TimeString[4]=' ';
  	TimeString[5]=' ';
  	}
  	else
  	{
  		TimeString[4]=hex2bcd[clk_min/10]+0x30;
  		TimeString[5]=hex2bcd[clk_min%10]+0x30;
  	}
  	TimeString[6]='-';
  	TimeString[7]=' ';
	}
	cpy_clock_str(TimeString,gLCDstr);
}

/*函数名称:LCD Module 初始化*/
void lcd_init(void)
{
    uchar i;
    for(i=0;i<250;i++);
    en_lcd=1;
    send_cmd(0x38);		//function set,8bit,2-line mode,5X7 dots
    check_ready();
  	send_cmd(0x38);
    check_ready();
		send_cmd(0x38);
    check_ready();
    send_cmd(0x38);
    check_ready();

    send_cmd(0x0c);		//display off
    check_ready();

    send_cmd(0x01);		// clear display
    check_ready();

    send_cmd(0x06); 	//enter mode set
    check_ready();
}









⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -