📄 lcd.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 + -