LCD1602时钟(暂停、开始、修改)

来源:互联网 发布:网络教育统考成绩查询 编辑:程序博客网 时间:2024/05/18 02:38
/*-----------------------------------------------  名称:LCD1602  论坛:www.doflye.net  编写:shifang  日期:2009.5  修改:无  内容:通过标准程序动态显示字符  引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<intrins.h>sbit RS = P2^6;   //定义端口 sbit RW = P2^5;sbit EN = P2^7;sbit Beep = P3^0;sbit KEY1 = P1^0;   //暂停sbit KEY2 = P1^1;   //开始sbit KEY3 = P1^2;   //选择哪一位操作sbit KEY4 = P1^3;   //++sbit KEY5 = P1^4;   //--sbit KEY6 = P1^5;#define RS_CLR RS=0 #define RS_SET RS=1#define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0unsigned char hour,min,sec;unsigned int kkk;unsigned char flag = 1;unsigned char num = 0;unsigned char local = 0;unsigned char weizhi;//unsigned char hour1[] = "change hour";//unsigned char min1[]  = "change min";//unsigned char sec1[]  = "change sec";unsigned char KeyScan(void);/*------------------------------------------------ uS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时 长度如下 T=tx2+5 uS ------------------------------------------------*/void DelayUs2x(unsigned char t){    while(--t);}/*------------------------------------------------ mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t){ while(t--) {     //大致延时1mS     DelayUs2x(245);     DelayUs2x(245); }}/*------------------------------------------------              判忙函数------------------------------------------------*/ bit LCD_Check_Busy(void)  {  DataPort= 0xFF;  RS_CLR;  RW_SET;  EN_CLR;  _nop_();  EN_SET; return (bit)(DataPort & 0x80); }/*------------------------------------------------              写入命令函数------------------------------------------------*/ void LCD_Write_Com(unsigned char com)  {  // while(LCD_Check_Busy()); //忙则等待 DelayMs(5); RS_CLR;  RW_CLR;  EN_SET;  DataPort= com;  _nop_();  EN_CLR; }/*------------------------------------------------              写入数据函数------------------------------------------------*/ void LCD_Write_Data(unsigned char Data)  {  //while(LCD_Check_Busy()); //忙则等待 DelayMs(5); 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);         } else     {         LCD_Write_Com(0xC0 + 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);         }     else     {         LCD_Write_Com(0xC0 + 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 Delay(unsigned char i){    while(i--);}/*------------------------------------------------                    主函数------------------------------------------------*/ void main(void) { //unsigned char i; //unsigned char *p; LCD_Init(); /*while (1)  {   i = 1;   p = "1234567890";   LCD_Clear();   LCD_Write_String(2,0,"Welcome to");   DelayMs(250);    while (*p)     {       LCD_Write_Char(i,1,*p);       i ++;       p ++;       DelayMs(250);       }    DelayMs(250);   } */    TMOD = 0x01;    TH0 = 0x3c;    TL0 = 0xb0;    EA = 1;    ET0 = 1;    TR0 = 1;    hour = 12;    min = 59;    sec = 55;    //Beep= 0;    while(1)    {         num = KeyScan();         if(num == 1)         {            flag = 0;         }         if(num == 2)         {            flag = 1;         }         if(num == 3)         {            local++;            if(local == 6)            {                local = 0;            }            switch(local)            {                case 5://LCD_Clear();                       LCD_Write_String(2,1,"change sec01");                       break;                case 4://LCD_Clear();                       LCD_Write_String(2,1,"change sec10");                       break;                case 3://LCD_Clear();                       LCD_Write_String(2,1,"change min01");                       break;                case 2://LCD_Clear();                       LCD_Write_String(2,1,"change min10");                       break;                case 1://LCD_Clear();                       LCD_Write_String(2,1,"change hou01");                       break;                case 0://LCD_Clear();                       LCD_Write_String(2,1,"change hou10");                       break;            }            //LCD_Clear();         }         if(num == 4)         {            switch(local)            {                case 5:sec++;                       if(sec >= 60)                       {                            min++;                            sec = 0;                       }break;                case 4:sec += 10;                       if(sec >= 60)                       {                            min++;                            sec = 0;                       }                        break;                case 3:min++;                       if(min >= 60)                       {                           hour++;                           min = 0;                       }break;                case 2:min += 10;                       if(min >= 60)                       {                           hour++;                           min = 0;                       }break;                case 1:hour++;                       if(hour >= 24)                       {                           sec = 0;                           min = 0;                           hour = 0;                       }break;                case 0:hour += 10;                       if(hour >= 24)                       {                           sec = 0;                           min = 0;                           hour = 0;                       }break;              }         }         if(num == 5)         {             switch(local)            {                case 5:sec--;                       if(sec <= 0)                       {                            min--;                            sec = 0;                       }break;                case 4:sec -= 10;                       if(sec <= 0)                       {                            min--;                            sec = 0;                       }break;                case 3:min--;                       if(min <= 0)                       {                           hour--;                           min = 59;                       }break;                case 2:min -= 10;                       if(min <= 0)                       {                           hour--;                           min = 59;                       }break;                case 1:hour--;                       if(hour <= 0)                       {                           sec = 0;                           min = 0;                           hour = 0;                       }break;                case 0:hour -= 10;                       if(hour <= 0)                       {                           sec = 0;                           min = 0;                           hour = 0;                       }break;            }         }         LCD_Write_Char(1,0,(hour/10)+ '0');         LCD_Write_Char(2,0,(hour%10)+ '0');         LCD_Write_Char(3,0,':');         LCD_Write_Char(4,0,(min/10)+ '0');         LCD_Write_Char(5,0,(min%10)+ '0');         LCD_Write_Char(6,0,':');         LCD_Write_Char(7,0,(sec/10)+ '0');         LCD_Write_Char(8,0,(sec%10)+ '0');         if(sec >= 60)         {            sec = 0;            min++;            for(kkk = 0;kkk < 100;kkk++)            {                Beep = !Beep;                Delay(50);            }         }         if(min >= 60)         {            min = 0;            hour++;            /*for(kkk = 0;kkk < 100;kkk++)            {                Beep = !Beep;                Delay(50);            }*/         }         if(hour >= 24)         {            hour = 0;            min = 0;            sec = 0;         }    }}void ISR_T0(void) interrupt 1{    unsigned char i;    TH0 = 0x3c;    TL0 = 0xb0;    if(flag == 1)    {        i++;        if(i == 20)        {            i = 0;            sec++;        }    }}unsigned char KeyScan(void){     if(!KEY1)  //如果检测到低电平,说明按键按下    {         Delay(10); //延时去抖,一般10-20ms         if(!KEY1)     //再次确认按键是否按下,没有按下则退出         {             while(!KEY1);//如果确认按下按键等待按键释放,没有则退出             {                 return 1;             }         }    }    else if(!KEY2)  //如果检测到低电平,说明按键按下    {         Delay(10); //延时去抖,一般10-20ms         if(!KEY2)     //再次确认按键是否按下,没有按下则退出         {             while(!KEY2);//如果确认按下按键等待按键释放,没有则退出             {                 return 2;             }         }    }    else if(!KEY3)  //如果检测到低电平,说明按键按下    {         Delay(10); //延时去抖,一般10-20ms         if(!KEY3)     //再次确认按键是否按下,没有按下则退出         {             while(!KEY3);//如果确认按下按键等待按键释放,没有则退出             {                 return 3;             }         }    }    else if(!KEY4)  //如果检测到低电平,说明按键按下    {         Delay(10); //延时去抖,一般10-20ms         if(!KEY4)     //再次确认按键是否按下,没有按下则退出         {             while(!KEY4);//如果确认按下按键等待按键释放,没有则退出             {                 return 4;             }         }    }    else if(!KEY5)  //如果检测到低电平,说明按键按下    {         Delay(10); //延时去抖,一般10-20ms         if(!KEY5)     //再次确认按键是否按下,没有按下则退出         {             while(!KEY5);//如果确认按下按键等待按键释放,没有则退出             {                 return 5;             }         }    }    else if(!KEY6)  //如果检测到低电平,说明按键按下    {         Delay(10); //延时去抖,一般10-20ms         if(!KEY6)     //再次确认按键是否按下,没有按下则退出         {             while(!KEY6);//如果确认按下按键等待按键释放,没有则退出             {                 return 6;             }         }    }    else         return 0;}
0 0
原创粉丝点击