单片机制作的12864液晶万年历C语言程序.docx
《单片机制作的12864液晶万年历C语言程序.docx》由会员分享,可在线阅读,更多相关《单片机制作的12864液晶万年历C语言程序.docx(25页珍藏版)》请在冰豆网上搜索。
![单片机制作的12864液晶万年历C语言程序.docx](https://file1.bdocx.com/fileroot1/2023-1/14/8c980b88-36c1-4630-8968-d506b4fede9b/8c980b88-36c1-4630-8968-d506b4fede9b1.gif)
单片机制作的12864液晶万年历C语言程序
#include
#include
#include
////////////////////////////////////////DS18B20
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P1^0;//定义DS18B20的单总线
#defineLcd_BusP0
sbitLCD_RS=P2^7;//数据/命令选择
sbitLCD_RW=P2^6;//读写控制
sbitLCD_EN=P2^5;//片选信号
#defineLCD_DATAP0//8bit数据线
#defineLOW0
#defineHIGH1
//初始化指令
#defineCLEAR_SCREEN0x01//清屏指令:
清屏且AC值为00H
#defineAC_INIT0x02//将AC设置为00H。
且游标移到原点位置
#defineCURSE_ADD0x06//设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动)
#defineFUN_MODE0x30//工作模式:
8位基本指令集
#defineDISPLAY_ON0x0c//显示开,显示游标,且游标位置反白
#defineDISPLAY_OFF0x08//显示关
#defineCURSE_DIR0x14//游标向右移动:
AC=AC+1
#defineSET_CG_AC0x40//设置AC,范围为:
00H~3FH
#defineSET_DD_AC0x80
#defineFUN_MODEK0x36//扩展指令集,8位指令
#defineX1address0x80//上半屏X轴起始地址
#defineX2address0x88//下半屏X轴起始地址
#defineYaddress0x80//Y轴起始地址
#defineSet_Column0x40
#defineSet_Page0xB8
ucharcodeshu[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
ucharcodexingqi[]="星期";
ucharcodehanzishu[]="一二三四五六日";
unsignedcharTempData=0;
doubleDS18B20Data;
uintjiemian=0;
//////////////////////////////////////////DS1302
sbitDS1302_RST=P1^4;
sbitDS1302_IO=P1^3;
sbitDS1302_SCK=P1^2;
unsignedchartable[]={0X00,0X18,0X0c,0X15,0X06,0X01,0X0a};//0s24min12hour14ri5yue5zhou2010nian
unsignedchardatatable1[7];
//ucharcodetable2[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
ucharcodeshuzi[]={
0x00,
0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,
0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,
0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,
0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,
0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,
0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,
};
unsignedcharaa,bb;
ucharmiaoge,miaoshi,fenge,fenshi,shige,shishi,rige,rishi,yuege,yueshi,zhou,niange,nianshi;
ucharshezhinum=0;
//unsignedcharshi,ge;
////////////////////////////////////////////////键盘扫描
sbitkey_mnue=P3^7;
sbitkey_jia=P2^0;
sbitkey_jian=P2^1;
sbitkey_enter=P2^2;
ucharkey_number=0;
//intnian,yue,ri,shi,fen;
/////////////////////////////////////////////////红外
sbitHW_IRQ=P3^2;//定义38KHz一体化红外接收头与CPU的连接
unsignedcharDT;
staticunsignedchardataIRCode[3],IRCON,IRCON2;
//////////////////////////////////////////////////蜂鸣器
sbitBEEP=P1^1;
/********************************************************************************************
*函数名称:
DS18B20_Delay()
*功能:
DS18B20软件延时专用
*入口参数:
count延时参数,值越大,延时越长
*出口参数:
无
*********************************************************************************************/
voidDS18B20_Delay(uintcount)//延时函数
{
while(count--);
}
/********************************************************************************************
*函数名称:
DS18B20_Init()
*功能:
DS18B20初始化
*入口参数:
无
*出口参数:
返回值为1则初始化成功
*返回值为0则初始化失败
*********************************************************************************************/
ucharDS18B20_Init(void)
{
ucharx=0;
DQ=1;//DQ复位
DS18B20_Delay(8);//稍做延时
DQ=0;//单片机将DQ拉低
DS18B20_Delay(80);//精确延时,大于480us
DQ=1;//拉高总线
DS18B20_Delay(14);//稍做延时后
x=DQ;//若x=0则初始化成功,若x=1则初始化失败
DS18B20_Delay(20);
return(~x);
}
/********************************************************************************************
*函数名称:
DS18B20_Read1Byte()
*功能:
从DS18B20读一个字节
*入口参数:
无
*出口参数:
从DS18B20读出的一个字节
*********************************************************************************************/
ucharDS18B20_Read1Byte(void)
{
uchari=0;
uchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)dat|=0x80;
DS18B20_Delay(4);
}
return(dat);
}
/********************************************************************************************
*函数名称:
DS18B20_Write1Byte()
*功能:
向DS18B20写一个字节
*入口参数:
dat要写入DS18B20的一字节数据
*出口参数:
无
*********************************************************************************************/
voidDS18B20_Write1Byte(uchardat)
{
uchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
DS18B20_Delay(5);
DQ=1;
dat>>=1;
}
}
/********************************************************************************************
*函数名称:
Read_Disp_Temperature()
*功能:
读取并显示温度
*入口参数:
无
*出口参数:
无
*********************************************************************************************/
doubleRead_Disp_Temperature(void)
{
uinta=0,b=0,c=0,d=0,e=0,t=0;
doublett=0;
DS18B20_Init();
DS18B20_Write1Byte(0xCC);//跳过读序号列号的操作
DS18B20_Write1Byte(0x44);//启动温度转换
DS18B20_Init();
DS18B20_Write1Byte(0xCC);//跳过读序号列号的操作
DS18B20_Write1Byte(0xBE);//读取温度寄存器
a=DS18B20_Read1Byte();
b=DS18B20_Read1Byte();
t=b;
t<<=8;
t=t|a;
//tt=t*0.0625;
returnt;
}
//*****************************************************************
//函数名称:
delay(uintt)延时函数。
对于12M晶振大约延时1ms
//入口参数:
t
//出口参数:
无
//*****************************************************************
voiddelay(uintt)
{
uinti;
while(t--)
{
for(i=0;i<125;i++)
;
}
}
////////////////////////////////////////////////////////////////蜂鸣器鸣叫
voidFM()
{
BEEP=0;
delay(100);
BEEP=1;
}
//*****************************************************************
//函数名称:
write_cmd(uintlcd_cmd)写指令
//入口参数:
lcd_cmd
//返回参数:
无
//*****************************************************************
voidWriteCmd12864(ucharlcd_cmd)
{
LCD_RS=LOW;
LCD_RW=LOW;
LCD_EN=HIGH;
LCD_DATA=lcd_cmd;
LCD_EN=LOW;
}
//****************************************************************
//函数名称:
write_data(uintlcd_data)写数据
//入口参数:
current_data
//返回参数:
无
//****************************************************************
voidWriteData12864(ucharlcd_data)
{
LCD_RS=HIGH;
LCD_RW=LOW;
LCD_EN=HIGH;
LCD_DATA=lcd_data;
LCD_EN=LOW;
}
/****************************************************************
函数名称:
Write12864(uint)写数据
入口参数:
cmd,data
返回参数:
无
****************************************************************/
voidWrite12864(ucharlcd_cmd,ucharlcd_data)
{
WriteCmd12864(lcd_cmd);
WriteData12864(lcd_data);
}
//****************************************************************
//函数名称:
ReadBusy()判忙
//入口参数:
无
//返回参数:
"1"忙;"0"不忙
//****************************************************************
voidReadBusy(void)
{
uchari=5;
while(i--);
}
/****************************************************************
函数名称:
LcdInit()初始化
入口参数:
无
返回参数:
无
****************************************************************/
voidLcdInit()
{
delay(50);
WriteCmd12864(FUN_MODE);
delay
(1);
//WriteCmd12864(FUN_MODE);
//delay
(1);
WriteCmd12864(DISPLAY_ON);
delay
(1);
//WriteCmd12864(AC_INIT);
//delay
(1);
WriteCmd12864(CLEAR_SCREEN);
delay(20);
WriteCmd12864(CURSE_ADD);
delay
(1);
}
/****************************************************************
函数名称:
LcdClear()清屏
入口参数:
无
返回参数:
无
****************************************************************/
voidLcdClear(void)
{
ReadBusy();
WriteCmd12864(CLEAR_SCREEN);
delay(3);
}
voidwrite_date(uchardate)
{
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P0=date;
delay(5);
LCD_EN=1;
delay(5);
LCD_EN=0;
}
voidinput1byte(unsignedchardate)
{
unsignedchari;
for(i=0;i<8;i++)
{
DS1302_IO=date&0x01;
DS1302_SCK=0;
DS1302_SCK=1;
date>>=1;
}
}
unsignedcharread1byte()
{
unsignedchari,date=0;
for(i=0;i<8;i++)
{
date>>=1;
DS1302_SCK=1;
DS1302_SCK=0;
DS1302_IO=1;
if(DS1302_IO)date=date|0x80;
}
returndate;
}
voidwrite1302(unsignedcharaddress,unsignedchardate)
{
DS1302_RST=0;
DS1302_SCK=0;
DS1302_RST=1;
input1byte(address);
input1byte(date);
DS1302_RST=0;
DS1302_SCK=1;
}
unsignedcharread1302(unsignedcharaddress)
{
unsignedcharucdat;
DS1302_RST=0;
DS1302_SCK=0;
DS1302_RST=1;
input1byte(address);
ucdat=read1byte();
DS1302_RST=0;
DS1302_SCK=1;
returnucdat;
}
voidset1302(unsignedcharaddress,unsignedchartable[],unsignedcharn)
{
unsignedchari;
write1302(0x8e,0x00);
for(i=0;i{
write1302(address,table[i]);
address+=2;
}
write1302(0x8e,0x80);
}
voidread1302xulie(unsignedcharaddress,unsignedcharn)
{
unsignedchari;
for(i=0;i{
table1[i]=read1302(address);
address+=2;
}
}
voidinit1302()
{
DS1302_RST=0;
DS1302_SCK=0;
write1302(0x8e,0x00);//取消写保护
write1302(0x90,0x00);//清零涓流充电寄存器
}
voidchuli()
{
unsignedcharaa,bb,i;
for(i=0;i<7;i++)
{
aa=table[i]/10;
bb=table[i]%10;
table[i]=(aa<<4)|bb;
}
}
voidchuli2(unsignedcharz)
{
aa=table1[z]&0x0f;//年
bb=(table1[z]&0xf0)>>4;
table1[z]=bb*10+aa;
}
voidjiashijian()
{
switch(key_number)
{
case0:
break;
case1:
table1[6]++;
//if(table1[6]==10)table1[6]=5;
write1302(0x8e,0x00);
write1302(0x8c,table[6]);
write1302(0x8e,0x80);
_nop_();
_nop_();break;
case2:
table1[4]++;
if(table1[4]==13)table1[4]=1;
write1302(0x8e,0x00);
write1302(0x88,table1[4]);
write1302(0x8e,0x80);
_nop_();
_nop_();break;
case3:
table1[3]++;
if(table1[3]==31)table1[3]=1;
write1302(0x8e,0x00);
write1302(0x86,table1[3]);
write1302(0x8e,0x80);
_nop_();
_nop_();break;
case4:
table1[5]++;
if(table1[5]==8)table1[5]=1;
write1302(0x8e,0x00);
write1302(0x8a,table1[5]);
write1302(0x8e,0x80);
_nop_();
_nop_();break;
case5:
table1[2]++;
if(table1[2]==24)table1[2]=0;
write1302(0x8e,0x00);
write1302(0x84,table1[2]);
write1302(0x8e,0x80);
_nop_();
_nop_();break;
case6:
table1[1]++;
if(table1[1]==61)table1[1]=0;
write1302(0x8e,0x00);
write1302(0x82,table1[1]);
table1[0]=0;
write1302(0x80,0);
write1302(0x8e,0x80);
_nop_();
_nop_();break;
}
}
voidjianshijian()
{
switch(key_number)
{
case0:
b