LCD显示时钟

来源:互联网 发布:淘宝曝光量是什么意思 编辑:程序博客网 时间:2024/05/02 02:02
#include<reg52.h> #define uchar unsigned char #define uint unsigned int #define KEY_IO P3 #define LCD_IO P0 sbit LCD_RS = P2^0; sbit LCD_RW = P2^1; sbit LCD_EN = P2^2; sbit SPK = P1^2; sbit LED = P2^4;  bit new_s, modify = 0;  char t0, sec = 50, min = 59, hour = 23;  char code LCD_line1[] = "Clock!"; char code LCD_line2[] = " 00:00:00 "; char Timer_buf[] = "23:59:50";  //--------------------------------------------------- void delay(uint z) {      uint  x, y;      for(x = z; x > 0; x--)  for(y = 100; y > 0; y--);}  //--------------------------------------------------- void W_LCD_Com(uchar com)      //写指令 {      LCD_RS = 0;  LCD_IO = com; // LCD_RS和R/W都为低电平时,写入指令     LCD_EN = 1;  delay(5); LCD_EN = 0; //用EN输入一个高脉冲 }  //--------------------------------------------------- void W_LCD_Dat(uchar dat)      //写数据 {      LCD_RS = 1;  LCD_IO = dat; // LCD_RS为高、R/W为低时,写入数据     LCD_EN = 1;  delay(5); LCD_EN = 0; //用EN输入一个高脉冲 }  //---------------------------------------------------  void W_LCD_STR(uchar *s)       //写字符串 {      while(*s)  W_LCD_Dat(*s++); }  //---------------------------------------------------  void W_BUFF(void)              //填写显示缓冲区 {      Timer_buf[7] = sec % 10 + 48; Timer_buf[6] = sec / 10 + 48;     Timer_buf[4] = min % 10 + 48; Timer_buf[3] = min / 10 + 48;     Timer_buf[1] = hour % 10 + 48;Timer_buf[0] = hour / 10 + 48;     W_LCD_Com(0xc0 + 7); W_LCD_STR(Timer_buf);}  //--------------------------------------------------- uchar read_key(void) {      uchar  x1, x2;     KEY_IO = 255;     x1 = KEY_IO;     if (x1 != 255) {       delay(100);       x2 = KEY_IO;        if (x1 != x2)  return 255;        while(x2 != 255) x2 = KEY_IO;       if(x1 == 0x7f)  return 0;       else if (x1 == 0xbf)  return 1;       else if (x1 == 0xdf)  return 2;       else if (x1 == 0xef)  return 3;       else if (x1 == 0xf7)  return 4;     }      return 255;}  //--------------------------------------------------- void Init() {      LCD_RW = 0;      W_LCD_Com(0x38); delay(50);     W_LCD_Com(0x0c);     W_LCD_Com(0x06);     W_LCD_Com(0x01);      W_LCD_Com(0x80); W_LCD_STR(LCD_line1);     W_LCD_Com(0xC0); W_LCD_STR(LCD_line2);     TMOD = 0x01;   //T0定时方式1     TH0 = 0x4c;      TR0 = 1;       //启动T0      PT0 = 1;       //高优先级, 以保证定时精度     ET0 = 1;     EA = 1; }  //--------------------------------------------------- void main() {       uint i, j;     uchar Key;     Init();       while(1)   {  //-------------------------------        if (new_s) { //如果出现了新的一秒, 修改时间         new_s = 0;    sec++;  sec %= 60;         if(!sec)        {           min++;         min %= 60;           if(!min)  { hour++; hour %= 24;}         }          W_BUFF();  //写显示//-------------------------------          if (!sec && !min) { //整点报时           for (i = 0; i < 200; i++) {              SPK = 0; for (j = 0; j < 100; j++);             SPK = 1; for (j = 0; j < 100; j++);         } }       }  //-------------------------------        Key = read_key();  //读出按键        switch(Key) {      //分别处理四个按键       case  0: modify = 1; break;        case  1: if(modify) {min++; min %= 60;  W_BUFF(); break;}  case  2: if(modify) {hour++; hour %= 24; W_BUFF(); break;}       case  3: modify = 0; break;     } } }  //---------------------------------------------------  void timer0(void) interrupt 1  //T0中断函数, 50ms执行一次 {      TH0 = 0x4c;      t0++; t0 %= 20;   //20, 一秒钟      if(t0 == 0)  {new_s = 1; LED = ~LED;}     if(modify)  LED = 0; }
0 0
原创粉丝点击