简单12864电子钟无时钟芯片.docx
- 文档编号:6936760
- 上传时间:2023-01-12
- 格式:DOCX
- 页数:26
- 大小:20.42KB
简单12864电子钟无时钟芯片.docx
《简单12864电子钟无时钟芯片.docx》由会员分享,可在线阅读,更多相关《简单12864电子钟无时钟芯片.docx(26页珍藏版)》请在冰豆网上搜索。
简单12864电子钟无时钟芯片
/*********液晶显示ST7920自建字库***********/
//文件名:
LCD_12864.C
//日期:
2012/11/9
//版本:
00
//作者:
JLM
//程序参数说明:
//晶振:
11.0592M
//功能:
/******************************************/
#include
#defineucharunsignedchar
#defineuintunsignedint
/********定义变量********/
#defineLCD_dataP0
ucharflag_1s;
ucharflag_50ms;
ucharsec,min,hour,week,day,yue;
ucharyear_H,year_L;//定义年月日时分秒
uchartime_hour,time_min,time_sec;
ucharkey_counter;//模式按键按下次数
ucharkey_clock_counter;
ucharkey_mode_num_flag;
/********位定义********/
sbitLCD_EN=P2^7;//液晶使能
sbitLCD_RD=P2^6;//RD=0为命令;RD=1为数据
sbitLCD_RW=P2^5;//RW=0为读状态;RW=1为写状态
sbitLCD_PSB=P3^2;//选择并行或者是串行
sbitLCD_RST=P3^7;//液晶复位
sbitKey_Mode=P1^4;//模式按键
sbitKey_Add=P1^5;//加数据按键
sbitKey_Sub=P1^6;//减数据按键
sbitKey_clock=P1^7;//向上调试按键
//sbitKey_Down=P1^8;//向下调试按键
ucharcodeNUM[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x00,0x2d};//密码数字
ucharcodeHanZi_3[]={0xc1,0xfa,0xc4,0xea,0xb4,0xf3,0xbc,0xaa};//龙年大吉
ucharcodeHanZi_4[]={0xc4,0xea,0xd4,0xc2,0xc8,0xd5,0xca,0xb1,0xb7,0xd6,0xc3,0xeb,0xa1,0xaa};//年月日时分秒-
/********函数声明********/
voiddelay_us(uintus);
voiddelay_ms(uintms);
voidTIME_PAGE0(void);
voidScan_key(void);
voidScan_key_add(void);
voidScan_key_sub(void);
voidININT_DAT(void);
voidTIME_0();
voidTIME_PAGE0(void);
voidTIME_PAGE1(void);
voidClock_PAGE2(void);
/*******判忙程序*******/
//原函数:
voidread_LCDbus(void)
//功能:
判断液晶是否在传输数据
//时间:
//入口参数:
//出口参数:
/***********************/
voidread_LCDbus(void)
{
LCD_data=0x00;//先清空数据
LCD_RD=0;//选择命令
LCD_RW=1;
LCD_EN=0;//写
while(LCD_data&0x80);//判断液晶工作
LCD_EN=1;//开使能
delay_us(10);
LCD_EN=0;//关使能;
}
/********写指令*********/
//原函数:
voidWrite_Comd(ucharvalue)
//功能:
写指令
//时间:
//入口参数:
//出口参数:
/***********************/
voidWrite_Comd(ucharvalue)
{
read_LCDbus();//读忙标志
LCD_RD=0;//选择指令
LCD_RW=0;//选择写方式
delay_us(10);
LCD_data=value;//写入Value指令值
LCD_EN=1;//使能位置一
delay_us
(1);
LCD_EN=0;
}
/*********写数据*********/
//原函数:
voidWrite_LcdData(ucharD_value)
//功能:
写指令
//时间:
//入口参数:
//出口参数:
/************************/
voidWrite_LcdData(ucharD_value)
{
read_LCDbus();//读忙标志
LCD_RD=1;//选择数据
LCD_RW=0;//选择写方式
delay_us(10);
LCD_data=D_value;//写入Value指令值
LCD_EN=1;//使能位置一
delay_us
(1);
LCD_EN=0;
}
/*********读RAM数据*********/
//原函数:
ucharRead_LcdData(void)
//功能:
写指令
//时间:
//入口参数:
//出口参数:
/************************/
//ucharRead_LcdData()
//{
//}
/*********初始化LCD*********/
//原函数:
voidINIT_LCD(void)
//功能:
写指令
//时间:
//入口参数:
//出口参数:
/***************************/
voidINIT_LCD(void)
{
delay_ms(10);
LCD_PSB=1;//选择并行口
LCD_RST=0;//复位
delay_us
(1);
LCD_RST=1;//复位开
Write_Comd(0x30);//功能字控制
delay_us(10);
Write_Comd(0x30);
delay_us(10);
Write_Comd(0x02);//地址归为
delay_us(10);
Write_Comd(0x0C);//开显示与游标
delay_us(10);
Write_Comd(0x01);//清显示
delay_us(100);
Write_Comd(0x80);//设置DDRAM地址起始地址
}
/*********清零LCD*********/
//原函数:
voidClearLCD(void)
//功能:
清屏LCD
//时间:
//入口参数:
//出口参数:
/***************************/
//voidClearLCD(void)
//{
//
//}
/**************************显示无字库汉字*************************/
//原函数:
voidWrite_LcdHz(void)
//功能:
写指令
//时间:
//入口参数:
x数组su[x][col];xaddr=显示的地址
//出口参数:
/****************************************************************/
/***************************显示字库汉字*************************/
//原函数:
//功能:
//时间:
//入口参数:
定义形参数组uchars[],显示地址XADDR,数组指针N
//出口参数:
/****************************************************************/
/***************显示数字或者字符单个字节***************/
//显示单个字符
/*voidWriteLcd_Displaybits(uchars[],ucharxaddr,ucharn)
{
Write_Comd(xaddr);//输入显示地址
Write_LcdData(*(s+n));//*(s+n)=s[n];
delay_us(10);
}*/
//显示双个字符
voidWriteLcd_Display_2bits(uchars[],ucharxaddr,ucharn1,ucharn2)
{
Write_Comd(xaddr);//输入显示地址
Write_LcdData(*(s+n1));//*(s+n)=s[n];
delay_us(500);
Write_LcdData(*(s+n2));//*(s+n)=s[n];
delay_us(500);
}
/******************显示汉字2个字节********************/
//显示单个汉字
voidLCD_Display_HZ(uchars[],ucharxaddr,ucharn)
{
uchari;
Write_Comd(xaddr);
for(i=0;i { s++; s++; } Write_LcdData(*(s++));//指向数组的S Write_LcdData(*s);//指向数组的S+1 delay_us(500); } //显示单个汉字 /*voidLCD_DisplayHanZi(uchars[],ucharxaddr,ucharn1) { uchari; Write_Comd(xaddr); for(i=0;i { Write_LcdData(*(s++));//指向数组的S Write_LcdData(*(s++));//指向数组S } }*/ /*********按键模式扫描********/ //原函数: voidScan_key_mode(void) //功能: 按键模式扫描 //时间: //入口参数: Key_Mode=P1^1; //出口参数: /*****************************/ voidScan_key(void) { if(Key_Mode==0)//模式按键扫描 { delay_us(2500); while(! Key_Mode); delay_us(2500); TR0=0; key_counter++; TIME_PAGE0();//调用调整时间界 while (1) { if(Key_Mode==0) { delay_us(2500); while(! Key_Mode); delay_us(2500); key_counter++; TIME_PAGE0();//调用调整时间界 } switch(key_counter) { case1: WriteLcd_Display_2bits(NUM,0x91,year_H/10,year_H%10);//20 Write_Comd(0x10);//光标返回 delay_ms(100); Scan_key_add(); Scan_key_sub(); break; case2: WriteLcd_Display_2bits(NUM,0x92,year_L/10,year_L%10);//20 Write_Comd(0x10); delay_ms(100); Scan_key_add(); Scan_key_sub(); break; case3: WriteLcd_Display_2bits(NUM,0x94,yue/10,yue%10);//12 Write_Comd(0x10); delay_ms(100); Scan_key_add(); Scan_key_sub(); break;//月份 case4: WriteLcd_Display_2bits(NUM,0x96,day/10,day%10);//12 Write_Comd(0x10); delay_ms(100); Scan_key_add(); Scan_key_sub(); break;//日 case5: WriteLcd_Display_2bits(NUM,0x89,hour/10,hour%10);//12 Write_Comd(0x10); delay_ms(100); Scan_key_add(); Scan_key_sub(); break;//时 case6: WriteLcd_Display_2bits(NUM,0x8b,min/10,min%10);//12 Write_Comd(0x10); delay_ms(100); Scan_key_add(); Scan_key_sub(); break;//分 case7: WriteLcd_Display_2bits(NUM,0x8d,sec/10,sec%10);//12 Write_Comd(0x10); delay_ms(100); Scan_key_add(); Scan_key_sub(); break;//秒 case8: key_counter=0; Write_Comd(0x0c);//关闭游标显示反白 Write_Comd(0x01);//清LCD显示 TR0=1;//启动定时器 break; } if(key_counter==0) { Write_Comd(0x0c);//关闭游标显示反白 Write_Comd(0x01);//清LCD flag_1s=0; break; } flag_1s=0; } } } /*********加按键扫描*********/ //原函数: voidScan_key_add(void) //功能: 加按键扫描 //时间: //入口参数: Key_Add==P1.4 //出口参数: /***************************/ voidScan_key_add(void) { if(Key_Add==0) { delay_us(1500); while(! Key_Add); delay_us(1500); if(key_counter==1)//判断是不是年修改 { year_H++; if(year_H==99) { year_H=0; } } if(key_counter==2)//判断是不是年修改 { year_L++; if(year_L==99) { year_L=0; } } if(key_counter==3)//判断是不是月修改 { yue++; if(yue==13) { yue=0; } } if(key_counter==4)//判断是不是日修改 { day++; if(day==32) { day=1; } } if(key_counter==5)//判断是不是时修改 { hour++; if(hour==25) { hour=0; } } if(key_counter==6)//判断是不是分修改 { min++; if(min==60) { min=0; } } if(key_counter==7)//判断是不是秒修改 { sec++; if(sec==60) { sec=0; } } } } /*********减按键扫描*********/ //原函数: voidScan_key_sub(void) //功能: 减按键扫描 //时间: //入口参数: //出口参数: /***************************/ voidScan_key_sub(void) { if(Key_Sub==0) { delay_us(2500); while(! Key_Sub); if(key_counter==1)//判断是不是年修改 { if(year_H>0) { year_H--; if(year_H==0) { year_H=99; } } } if(key_counter==2)//判断是不是年修改 { if(year_L>0) { year_L--; if(year_L==0) {year_L=99;} } } if(key_counter==3)//判断是不是月修改 { if(yue>0) { yue--; if(yue==0) yue=12; } } if(key_counter==4)//判断是不是日修改 { if(day>0) { day--; if(day==0) day=31; } } if(key_counter==5)//判断是不是时修改 { if(hour>0) { hour--; if(hour==0) hour=24; } } if(key_counter==6)//判断是不是分修改 { if(min>0) { min--; if(min==0) min=59; } } if(key_counter==7)//判断是不是秒修改 { if(sec>0) { sec--; if(sec==0) sec=59; } } } } /*********初始时钟页面*********/ //原函数: voidTIME_PAGE0(void) //功能: 时钟显示页 //时间: //入口参数: //出口参数: /******************************/ voidTIME_PAGE() { Write_Comd(0x01);//清LCD显示 delay_us(100); LCD_Display_HZ(HanZi_3,0x82,0);//龙 LCD_Display_HZ(HanZi_3,0x83,1);//年 LCD_Display_HZ(HanZi_3,0x84,2);//大 LCD_Display_HZ(HanZi_3,0x85,3);//吉 Write_Comd(0x01);//清LCD显示 Write_Comd(0x0c);//关闭游标显示反白 delay_us(100); } /*********可调时钟页面*********/ //原函数: voidTIME_PAGE0(void) //功能: 时钟显示页 //时间: //入口参数: //出口参数: /***************************/ voidTIME_PAGE0(void) { Write_Comd(0x01);//清LCD显示 delay_us(100); WriteLcd_Display_2bits(NUM,0x91,year_H/10,year_H%10);//20 WriteLcd_Display_2bits(NUM,0x92,year_L/10,year_L%10);//20 Wri
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简单 12864 电子钟 时钟 芯片