时钟程序 51单片机 时间可设定Word文档格式.docx
《时钟程序 51单片机 时间可设定Word文档格式.docx》由会员分享,可在线阅读,更多相关《时钟程序 51单片机 时间可设定Word文档格式.docx(17页珍藏版)》请在冰点文库上搜索。
0x00,0x7F,0x09,0x09,0x09,0x01,//F17
0x00,0x3E,0x41,0x49,0x49,0x7A,//G18
0x00,0x7F,0x08,0x08,0x08,0x7F,//H19
0x00,0x00,0x41,0x7F,0x41,0x00,//I20
0x00,0x20,0x40,0x41,0x3F,0x01,//J21
0x00,0x7F,0x08,0x14,0x22,0x41,//K22
0x00,0x7F,0x40,0x40,0x40,0x40,//L23
0x00,0x7F,0x02,0x0C,0x02,0x7F,//M24
0x00,0x7F,0x04,0x08,0x10,0x7F,//N25
0x00,0x3E,0x41,0x41,0x41,0x3E,//O26
0x00,0x7F,0x09,0x09,0x09,0x06,//P27
0x00,0x3E,0x41,0x51,0x21,0x5E,//Q28
0x00,0x7F,0x09,0x19,0x29,0x46,//R29
0x00,0x46,0x49,0x49,0x49,0x31,//S30
0x00,0x01,0x01,0x7F,0x01,0x01,//T31
0x00,0x3F,0x40,0x40,0x40,0x3F,//U32
0x00,0x1F,0x20,0x40,0x20,0x1F,//V33
0x00,0x3F,0x40,0x38,0x40,0x3F,//W34
0x00,0x63,0x14,0x08,0x14,0x63,//X35
0x00,0x07,0x08,0x70,0x08,0x07,//Y36
0x00,0x61,0x51,0x49,0x45,0x43,//Z37
0x00,0x20,0x54,0x54,0x54,0x78,//a38
0x00,0x7F,0x48,0x44,0x44,0x38,//b39
0x00,0x38,0x44,0x44,0x44,0x20,//c40
0x00,0x38,0x44,0x44,0x48,0x7F,//d41
0x00,0x38,0x54,0x54,0x54,0x18,//e42
0x00,0x08,0x7E,0x09,0x01,0x02,//f43
0x00,0x18,0xA4,0xA4,0xA4,0x7C,//g44
0x00,0x7F,0x08,0x04,0x04,0x78,//h45
0x00,0x00,0x44,0x7D,0x40,0x00,//i46
0x00,0x40,0x80,0x84,0x7D,0x00,//j47
0x00,0x7F,0x10,0x28,0x44,0x00,//k48
0x00,0x00,0x41,0x7F,0x40,0x00,//l49
0x00,0x7C,0x04,0x18,0x04,0x78,//m50
0x00,0x7C,0x08,0x04,0x04,0x78,//n51
0x00,0x38,0x44,0x44,0x44,0x38,//o52
0x00,0xFC,0x24,0x24,0x24,0x18,//p53
0x00,0x18,0x24,0x24,0x18,0xFC,//q54
0x00,0x7C,0x08,0x04,0x04,0x08,//r55
0x00,0x48,0x54,0x54,0x54,0x20,//s56
0x00,0x04,0x3F,0x44,0x40,0x20,//t57
0x00,0x3C,0x40,0x40,0x20,0x7C,//u58
0x00,0x1C,0x20,0x40,0x20,0x1C,//v59
0x00,0x3C,0x40,0x30,0x40,0x3C,//w60
0x00,0x44,0x28,0x10,0x28,0x44,//x61
0x00,0x1C,0xA0,0xA0,0xA0,0x7C,//y62
0x00,0x44,0x64,0x54,0x4C,0x44,//z63
0x00,0x00,0x60,0x60,0x00,0x00,//.64
0x00,0x00,0x36,0x36,0x00,0x00,//:
65
0x00,0x00,0x41,0x22,0x14,0x08,//>
66
0x00,0x00,0x00,0x2f,0x00,0x00,//!
67
0x00,0x00,0x07,0x00,0x07,0x00,//"
68
0x00,0x14,0x7f,0x14,0x7f,0x14,//#69
0x00,0x24,0x2a,0x7f,0x2a,0x12,//$70
0x00,0x62,0x64,0x08,0x13,0x23,//%71
0x00,0x36,0x49,0x55,0x22,0x50,//&
72
0x00,0x00,0x05,0x03,0x00,0x00,//'
73
0x00,0x00,0x1c,0x22,0x41,0x00,//(74
0x00,0x00,0x41,0x22,0x1c,0x00,//)75
0x00,0x14,0x08,0x3E,0x08,0x14,//*76
0x00,0x08,0x08,0x3E,0x08,0x08,//+77
0x00,0x00,0x00,0xA0,0x60,0x00,//,78
0x00,0x08,0x08,0x08,0x08,0x08,//-79
0x00,0x40,0x40,0x40,0x40,0x40,//_80
0x00,0x20,0x10,0x08,0x04,0x02,///81
0x00,0x00,0x7F,0x41,0x41,0x00,//[82
0x00,0x00,0x41,0x41,0x7F,0x00,//]82
0x00,0x04,0x02,0x01,0x02,0x04,//^84
};
/*-------------------------------------
wr_LCD_byte:
通过SPI端口向LCD5110写入数据
输入参数:
dat(byte):
写入的数据
cmd(0、1):
指令0,数据1
-------------------------------------*/
voidWr_LCD_byte(u8dat,u8cmd)
{
unsignedchari;
SCE=0;
DC=cmd;
for(i=0;
i<
8;
i++)
{
if(dat&
0x80)
SDIN=1;
else
SDIN=0;
dat=dat<
<
1;
SCLK=0;
SCLK=1;
}
DC=1;
SCE=1;
SDIN=1;
}
/*---------------------------
set_LCD_XY:
设置光标位置
X(0-83)、Y(0-5)
---------------------------*/
voidSet_LCD_XY(u8X,u8Y)
Wr_LCD_byte(0x40|Y,0);
Wr_LCD_byte(0x80|X,0);
/*------------------
clr_LCD:
LCD5110清屏
------------------*/
voidClr_LCD(void)
unsignedcharc,r;
Set_LCD_XY(0,0);
for(r=0;
r<
6;
r++)
for(c=0;
c<
84;
c++)
{
Wr_LCD_byte(0x00,1);
}
}
/*-------------------------------------------
wr_LCD_chr:
显示8*16大小的半角字符
输入函数:
col(0-9):
显示位置-列
row(0-5):
显示位置-行
ch:
(0-39):
字符位置(位于数组chr中)
-------------------------------------------*/
voidWr_LCD_chr(u8col,u8row,u8ch)
Set_LCD_XY(col*6,row);
i++)
Wr_LCD_byte(chr[ch*6+i],1);
/*----------------------
LCD_init:
LCD5110初始化
----------------------*/
voidLCD_Init(void)
Wr_LCD_byte(0x21,0);
//初始化LCD,功能设定使用扩充指令
Wr_LCD_byte(0xc8,0);
//设定液晶偏置电压
Wr_LCD_byte(0x20,0);
//使用基本指令
Wr_LCD_byte(0x0C,0);
//设定显示模式,正常显示
voiddelayms(unsignedintm)//延时程序
unsignedinti;
while(--m)
372;
i++);
/*------------------------------------------------
键盘扫描程序
------------------------------------------------*/
ucharkeyscan(void)//键盘扫描函数,使用行列反转扫描法
ucharcord_h,cord_l;
//行列值中间变量
P3=0x0f;
//行线输出全为0
cord_h=P3&
0x0f;
//读入列线值
if(cord_h!
=0x0f)//先检测有无按键按下
delayms(10);
//去抖
=0x0f)
P3=cord_h|0xf0;
//输出当前列线值
cord_l=P3&
0xf0;
//读入行线值
return(cord_h+cord_l);
//键盘最后组合码值
}return(0xff);
//返回该值
#defineSETUPCTRL0xF7
#definePLUSCTRL0xFB
#defineNONE0xFD
#defineMENUCTRL0xFE
ucharscreen[6][14]={0};
//6×
14列屏幕内容数组
uchartime1Counter=0;
//定时器1计数器
uintdpyCounter=0;
//用于控制光标处闪烁
ucharhour=23;
//小时初始化
ucharminute=59;
//分钟初始化
ucharsecond=0;
//秒初始化
ucharcol;
ucharrow=2;
//显示在第3行
ucharsetupFlag=0;
//设置标志
sbitLED0=P0^0;
sbitLED1=P0^1;
sbitLED2=P0^2;
sbitLED3=P0^4;
sbitLED=P0^7;
定时器1初始化子程序
voidInit_Timer1(void)//定时50ms
TMOD|=0x10;
//使用模式1,16位定时器
TH1=(65536-50000)/256;
//给定初值,定时器计数50ms溢出
TL1=(65536-50000)%256;
EA=1;
//总中断打开
ET1=1;
//定时器中断打开
TR1=1;
//定时器开关打开
定时器1中断子程序
voidTimer1_isr(void)interrupt3using2
//重新赋值
if(1==setupFlag)//设置时钟时
{
time1Counter=0;
//定时器1计数器要清零
return;
}
time1Counter++;
//定时器1计数器加1
if(20==time1Counter)//1s更新一次
time1Counter=0;
//定时器1计数器清零
second++;
//秒加1
if(60==second)
second=0;
minute++;
if(60==minute)
{
minute=0;
hour++;
if(24==hour)
hour=0;
}
screen[row][5]=hour/10+2;
//更新小时显示内容
screen[row][6]=hour%10+2;
screen[row][8]=minute/10+2;
//更新分钟显示内容
screen[row][9]=minute%10+2;
screen[row][11]=second/10+2;
//更新秒显示内容
screen[row][12]=second%10+2;
外部中断0子程序
voidExternal_isr(void)interrupt0using1
ucharhourH;
ucharhourL;
ucharminuteH;
ucharminuteL;
ucharctrl;
LED=0;
ctrl=P2;
//按键从P2口输入
switch(ctrl)
caseSETUPCTRL:
//按下设置键
LED3=0;
if(0==setupFlag)
{
setupFlag=1;
col=4;
dpyCounter=0;
col++;
if(7==col)//第7列已显示“:
”
if(10==col)//以完成设置
setupFlag=0;
//设置标志清零
break;
casePLUSCTRL:
//按下加1键
LED2=0;
if(1==setupFlag)
{
switch(col)//光标所在列数
case5:
//小时十位处
hour+=10;
if(hour>
23)
hour%=10;
break;
case6:
//小时个位处
hourH=hour/10;
hourL=hour%10;
hourL++;
if(2==hourH)
{
if(4==hourL)
hourL=0;
}
else
if(10==hourL)
hour=hourH*10+hourL;
case8:
//分钟十位处
minute+=10;
if(minute>
59)
minute%=10;
case9:
//分钟个位处
minuteH=minute/10;
minuteL=minute%10;
minuteL++;
if(10==minuteL)
minuteL=0;
minute=minuteH*10+minuteL;
default:
}
caseNONE:
LED1=0;
caseMENUCTRL:
LED0=0;
default:
while(!
(0xFF==ctrl))//等待按键释放
voidmain()
ucharr,c;
Init_Timer1();
//初始化定时器1
EX0=1;
//开外部中断0
IT0=0;
//设置低电平可引起外部中断0
LCD_Init();
//LCD初始化
Clr_LCD();
//LCD清屏
screen[row][0]=31;
//T
screen[row][1]=46;
//i
screen[row][2]=50;
//m
screen[row][3]=42;
//e
screen[row][7]=65;
//:
screen[row][10]=65;
//计算小时显示的内容
//计算分钟显示的内容
screen[row