文档库 最新最全的文档下载
当前位置:文档库 › 可调电子时钟程序_单片机课程设计

可调电子时钟程序_单片机课程设计

#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include
unsigned char TempData[8]={'0','0',':','0','0',':','0','0'}; //存储显示值的全局变量
sbit RS = P2^5; //定义液晶屏端口
sbit RW = P2^6;
sbit EN = P2^7;
unsigned char hour,minute,second;//定义时分秒
unsigned char num;
unsigned char keykey; //键盘扫描值
#define RS_CLR RS=0 //表示写指令
#define RS_SET RS=1 //表示写数据
bit UpdateTimeFlag;//定义读时间标志
#define RW_CLR RW=0 //液晶屏写数据
#define RW_SET RW=1 //液晶屏读数据

#define EN_CLR EN=0
#define EN_SET EN=1

#define DataPort P0



void DelayUs2x(unsigned char t)
{
while(--t);
}

void DelayMs(unsigned char t)
{

while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}

/*------------------------------------------------
写入命令函数
------------------------------------------------*/
void LCD_Write_Com(unsigned char com)
{
DelayMs(3);
RS_CLR; //指令
RW_CLR; // 写
EN_SET; //使能高电平
DataPort= com; // 指令内容
_nop_(); // 延时
EN_CLR; //使能端低电平
}
/*------------------------------------------------
写入数据函数
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data)
{
DelayMs(3);
RS_SET; //数据
RW_CLR; //写
EN_SET; //使能高电平
DataPort= Data; //数据内容
_nop_();
EN_CLR; //使能下降沿有效
}

/*------------------------------------------------
清屏函数
------------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}
/*------------------------------------------------
写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{
if (y == 0)
{
LCD_Write_Com(0x80 + x); //第一行,位置为x
}
else
{
LCD_Write_Com(0xC0 + x); //第二行,位置为x
}
while (*s) //写字符串,位置指针加一,直到字符串中所有字符显示完成
{
LCD_Write_Data( *s);
s ++;
}
}
/*------------------------------------------------
写入字符函数
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{
if (y == 0)
{
LCD_Write_Com(0x80 + x); //第一行,位置为x 列
}
else
{
LCD_Write_Com(0xC0 + x); //第二行,位置为x 列
}
LCD_Write_Data( Data); //写入数据
}
/*------------------------------------------------
初始化函数
-----------------------------------------------

-*/
void LCD_Init(void)
{
LCD_Write_Com(0x38); /*显示模式设置*/
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08); /*显示关闭*/
LCD_Write_Com(0x01); /*显示清屏*/
LCD_Write_Com(0x06); /*显示光标移动设置*/
DelayMs(5);
LCD_Write_Com(0x0C); /*显示开及光标设置*/
}



/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=(65536-2000)/256; //赋值 2ms
TL0=(65536-2000)%256;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}

/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
static unsigned int num,i;
TH0=(65536-2000)/256;//重新赋值 2ms
TL0=(65536-2000)%256;

i++;
if(i==10) //20ms更新一次
{
i=0;
UpdateTimeFlag=1; //更新时间志位置1
}
num++;
if(num==500) //大致1s
{
num=0;
second++;
if(second==60) //秒到60,分钟加1
{
second=0;
minute++;
if(minute==60)//分钟到60,小时加1
{
minute=0;
hour++;
if(hour==24)//小时到24,回零
hour=0;
}
}

}
}



sbit HC165_nPL = P3^7;
sbit HC165_CK = P3^6;
sbit HC165_OUT = P3^5;

//------------------------------------------------------


unsigned char HC165(void)
{
unsigned char i;
unsigned char Temp;
HC165_CK= 1;
HC165_nPL=0; //HC165读按键
HC165_nPL=1; //暂停HC165读按键
Temp = 0; // 第一位预先假设为0 ,下一句判断是否为1,如果是1则置1,否则假设成立第一个值为0
if(HC165_OUT == 1) Temp |= 0x01; //如果是1则设为1,否则之前的置0生效
for(i = 0;i < 7;i++)
{
HC165_CK = 0; //clk上升沿
HC165_CK = 1;
Temp <<= 1; // Temp=Temp<<1 ,Temp 左移1位
if(HC165_OUT == 1) //如果输出是1最后1位置1
{
Temp |= 0x01;
}
}
HC165_CK = 0;
return(Temp);
}








unsigned char code ASCII[13] = "0123456789:-M";

unsigned char hour,minute,second;//定义时分秒
/*------------------------------------------------
主函数
------------------------------------------------*/
void main(void)
{


unsigned int j;
LCD_Init();


LCD_Clear();
LCD_Write_String(0,0,"Electronic clock");
DelayMs(250);
Init_Timer0();
for(j=0;j<=7;j++)
{ LCD_Write_Char(j,1,T

empData[j]);
}
while (1)
{


keykey=HC165();
P1=~keykey;
if(keykey!=0x00)
{
DelayMs(100);
if(keykey!=0x00)
{

DelayMs(200);
while(keykey!=0x00)
{
if(keykey==0x80)
{ num=1;
break;
}
if(keykey==0x40)
{ num=2;
break;
}
if(keykey==0x20)
{ num=3;
break;
}
if(keykey==0x10)
{ num=4;
break;
}
if(keykey==0x08)
{ num=5;
break;
}
if(keykey==0x04)
{ num=6;
break;
}
if(keykey==0x02)
{ num=7;
break;
}
if(keykey==0x01)
{ num=8;
break;
}

}
}
}
switch(num)
{
case 4:hour++;if(hour==24)hour=0;num=0;UpdateTimeFlag=1; //正常时间 小时 加1
break;
case 3:hour--;if(hour==255)hour=23;num=0;UpdateTimeFlag=1; //正常时间 小时减1
break;
case 2:minute++;if(minute==60)minute=0;num=0;UpdateTimeFlag=1; //分钟加1
break;
case 1:minute--;if(minute==255)minute=59;num=0;UpdateTimeFlag=1; //分钟减1
break;
case 6:second--;if(second==255)second=59;num=0;UpdateTimeFlag=1; //分钟减1
break;
case 5:second++;if(second==60)second=0;num=0;UpdateTimeFlag=1; //分钟减1
break;
case 8:EA=1;num=0;
break;
case 7:EA=0;num=0;
break;
default: break;
}

if(UpdateTimeFlag==1)
{
UpdateTimeFlag=0;

TempData[0]=ASCII[hour/10]; //时 /
TempData[1]=ASCII[hour%10];
TempData[2]=ASCII[10];
TempData[3]=ASCII[minute/10];//分
TempData[4]=ASCII[minute%10];
TempData[5]=ASCII[10];
TempData[6]=ASCII[second/10];//秒
TempData[7]=ASCII[second%10];
for(j=0;j<=7;j++)
{ LCD_Write_Char(j,1,TempData[j]);
}


}



}
}

相关文档
相关文档 最新文档