📄 main.c
字号:
//***********************************************************
//***********12864LCD多功能液晶时钟********************
//*本系统采用4个按键,人性化的菜单显示.
//主界面显示的参数:阳历,阴历干支年,星期,时分秒,闹钟,温度,公共节日,节气;
//功能参数:密码,232通信输出,红外控制,阳历,阴历,读U盘;
//作者:陈志伟
//设计日期:2007年11月~2007年12月;
//交流QQ:871993824
/***************************************************************/
#include <sfr.h>
#include <Calendar.h>
//typedef unsigned char uchar; //自定义关键字
//typedef unsigned int uint;
//LCD接口定义
sbit BUSY_FLAG=P2^7; //液晶模块忙标志
sbit RS =P0^0; //模式位,为0输入指令,为1输入数据
sbit RW =P0^1; //读写位,为0读,为1写
sbit E =P0^2; //使能位
sbit PSB=P0^3;
#define LCD_DATA P2 //液晶数据口
//LCD指令集定义
#define ClearDisplay 0x01 //清显示指令
#define EntryModeSet 0x06 //设置输入模式
#define DisplayOnCtrl 0x0c //设置开显控制
#define FunctionSetB 0x30 //功能设定(基本指令)
#define FunctionSetE 0x34 //功能设定(扩充指令)
#define FuncDrawOn 0x36 //设置绘图功能
//内存定义
uchar lcdPosX, lcdPosY; //X,Y坐标
uchar halfScr, halfLineCnt, basicBlock; //半屏,半屏行数,N*8块
uchar yy,mo,dd,xq,hh,mm,ss; //定义时间映射全局变量
uchar keys,state,cishu; //键值keys,状态state,次数time
bit setting;
//定义累加器A中的各位
sbit a7 = ACC ^ 7;
//键盘引脚定义
sbit key_1 =P1^0; //功能:设置兼返回
sbit key_2 =P1^1; //功能:调整位加1
sbit key_3 =P1^2; //功能:指向下一项
sbit key_4 =P1^3; //功能:确定当前操作
//定义DS1302时钟接口
sbit clock_clk = P3^1; //ds1302_clk(时钟线)
sbit clock_dat = P3^0; //ds1302_dat(数据线)
sbit clock_Rst = P1^4; //ds1302_Rst(复位线
//温度传感器定义
sbit DQ = P1^5; //ds18B20)
//灯与扬声器定义
sbit led_secd =P3^3; //秒闪烁灯
sbit BEEP =P1^6; //扬声器
//表格2的格式:键码+次态+执行模块
uchar fun_zero[4]={1,1,0,0};
uchar fun_one[7]={1,1,0,0};
/***************************************************************/
//功能:延时ms毫秒
void delayMs (uchar ms)
{ uchar i;
while (--ms)
{ for(i=0; i<125; i++);}
}
/***************************************************************/
//功能:蜂鸣器响一声
void beepBl (void)
{
uchar i;
for(i=0; i<100; i++)
{ delayMs(2);BEEP = !BEEP; }
BEEP = 1;
}
/***************************************************************/
//功能:延时sec秒
void delaySec (uchar sec)
{
uchar i;
while(--sec)
{ for(i=0; i<200; i++)
{delayMs(6);}
}
}
/***************************************************************/
//功能:LCD检测忙信号
void checkLcdBusy (void)
{ LCD_DATA = 0xff;
RS = 0;
RW= 1;
E = 1;
while (BUSY_FLAG);
E= 0;
}
/***************************************************************/
//功能:LCD写命令
//输入参数:控制命令Command
void lcdWriteCommand (uchar Command)
{ checkLcdBusy();
RS = 0;
RW = 0;
LCD_DATA = Command;
E = 1;
delayMs(1);
E = 0;
}
/***************************************************************/
//功能:清除液晶屏幕
void lcdClear (void)
{ lcdWriteCommand(ClearDisplay); }
/***************************************************************/
//功能:液晶初始化
void lcdInit (void)
{ lcdWriteCommand(FunctionSetE);
lcdWriteCommand(FunctionSetB);
lcdClear();
lcdWriteCommand(EntryModeSet);
lcdWriteCommand(DisplayOnCtrl);
}
/***************************************************************/
//功能:LCD写数据
//输入参数:显示的单个字节Data
void lcdWriteData (uchar Data)
{ checkLcdBusy();
RS = 1;
RW= 0;
LCD_DATA = Data;
E= 1;
delayMs(1);
E= 0;
}
/***************************************************************/
//功能:向LCD写入坐标
void wrPosition (void)
{ lcdWriteCommand(FunctionSetE);
lcdWriteCommand(lcdPosY);
lcdWriteCommand(lcdPosX);
lcdWriteCommand(FunctionSetB);
}
/***************************************************************/
//功能:显示自定义的图形
//输入参数:图形数据bmp,Cls=清除图形屏幕选项(OFF为不清屏,即显示图形,ON为清屏)
void displayPhoto (uchar *bmp, uchar bmpCls)
{
lcdPosX = 0x80;
halfScr = 2;
for (;halfScr != 0; halfScr--)
{ lcdPosY = 0x80; halfLineCnt = 32;
for (;halfLineCnt != 0; halfLineCnt--)
{ basicBlock = 16; wrPosition ();
for (; basicBlock != 0; basicBlock--)
{ if (bmpCls == 0) { lcdWriteData (*bmp++);}
else if(bmpCls==1){ lcdWriteData (0x00);}
}
lcdPosY++;
}
lcdPosX = 0x88;
}
lcdWriteCommand(FuncDrawOn);
lcdWriteCommand(FunctionSetB);
}
/***************************************************************/
//功能:字符反白显示
//输入参数:反白字符的行cx,列cy,长度width
void convertChar (uchar CX, CY, width)
{
displayPhoto(0,1);
lcdPosY = 0x80;
if (CX == 0)
{ CX = 0x80;halfLineCnt = 16; }
else if (CX == 1){CX = 0x80;halfLineCnt = 32;}
else if (CX == 2){CX = 0x88;halfLineCnt = 16;}
else if (CX == 3){CX = 0x88;halfLineCnt = 32;}
lcdPosX = CX + CY;
for (; halfLineCnt != 0; halfLineCnt--)
{ basicBlock = width;
wrPosition();
for (;basicBlock != 0; basicBlock--)
{ if (halfLineCnt > 16) {lcdWriteData(0x00); }
else {lcdWriteData (0xff);}
}
lcdPosY++;
}
lcdWriteCommand(FuncDrawOn);
lcdWriteCommand(FunctionSetB);
}
/***************************************************************/
//功能:向LCD写一个字符串
//输入参数:行x,列y,每一位显示时间speed,显示字符串首地址msg
void lcdword (uchar X, Y, speed, uchar *msg)
{
if (X==0){ X=0x80;}
else if (X==1){ X=0x90;}
else if (X==2){ X=0x88;}
else if (X==3){ X=0x98;}
Y = X + Y;
lcdWriteCommand(Y);
while (*msg)
{ lcdWriteData(*msg++);delayMs(speed);}
}
/***************************************************************/
//DS1302时钟芯片相关的驱动程序
/***************************************************************/
//功能:DS1302写入字节
void clock_out(uchar dd)
{ uchar i,temp;
for ( i=8; i>0; i-- ) //循环8次移位
{ temp=dd;
clock_dat=(bit)(temp&0x01); //每次传输低字节
dd>>=1; //右移一位
clock_clk=1; clock_clk=0;
}
}
/***************************************************************/
//功能:DS1302读入字节
uchar clock_in(void)
{ uchar i;
clock_dat=1;
for(i=8;i>0;i-- )
{ ACC>>=1;a7=clock_dat;
clock_clk=1; clock_clk=0;
}
return(ACC);
}
/***************************************************************/
//功能:DS1302读数据
uchar read_clock(uchar ord)
{ uchar dd=0;
clock_clk=0;
clock_Rst=0;
clock_Rst=1;
clock_out(ord);
dd=clock_in();
clock_Rst=0;
clock_clk=1;
return(dd);
}
/***************************************************************/
//功能:DS1302写数据
void write_clock(uchar ord, uchar dd)
{ clock_clk=0;
clock_Rst=0;
clock_Rst=1;
clock_out(ord);
clock_out(dd);
clock_Rst=0;
clock_clk=1;
}
/***************************************************************/
//功能:年月日星期小时分秒的时钟数据读取
void read_clockS(void)
{ ss = read_clock(0x81);//读取秒数据
mm = read_clock(0x83);//读取分钟数据
hh = read_clock(0x85);//小时
dd = read_clock(0x87);//日
mo = read_clock(0x89);//月
xq = read_clock(0x8b);//星期
yy = read_clock(0x8d);//年
}
/***************************************************************/
//功能:设置1302的初始时间(2008年1月1日00时00分00秒星期二)
void Init_1302(void)
{ uchar f;
if(read_clock(0xc1) != 0xaa)
{ write_clock(0x8e,0x00);//允许写操作
write_clock(0x8c,0x08);//年
write_clock(0x8a,0x02);//星期
write_clock(0x88,0x01);//月
write_clock(0x86,0x01);//日
write_clock(0x84,0x00);//小时
write_clock(0x82,0x00);//分钟
write_clock(0x80,0x00);//秒
write_clock(0x90,0xa5);//充电
write_clock(0xc0,0xaa);//写入初始化标志RAM(第00个RAM位置)
for(f=0;f<60;f=f+2)
{ write_clock(0xc2+f,0x00); }//清除闹钟RAM位为0
write_clock(0x8e,0x80);//禁止写操作
}
}
/***************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -