STC单片机之1602显示时钟

2019-05-20来源: eefocus关键字:STC单片机  1602  显示时钟

/****为了简单起见,调整时间是只添加了s1和s2,删除了s3的功能,若调过了可通过s2循环一圈 ****/

/****From Brandon 2016-09-17 ****/

/****关键点:按键扫描和定时器0的中断程序比较生疏,需再看 ****/

#include


sbit LCD_rs=P1^0;

sbit LCD_rw=P1^1;

sbit LCD_en=P2^5;

sbit s1=P3^0;

sbit rd=P3^7;

sbit wr=P3^6;

sbit s2=P3^1;

sbit s3=P3^2;


unsigned char code table[]="  2016-9-15 THU";

unsigned char code table1[]="    00:00:00";


unsigned char num,count,s1num;

char miao,shi,fen;  //


void Delay(unsigned char i)

{

unsigned char j,k;

for(j=i;j>0;j--)

for(k=110;k>0;k--);

}


void LCD_Write_com(unsigned char a)

{

LCD_rs=0;

Delay(5);

LCD_rw=0;

Delay(5);

P0=a;

Delay(5);

LCD_en=1;

Delay(5);

LCD_en=0;

}


void LCD_Write_data(unsigned char b)

{

LCD_rs=1;

Delay(5);

LCD_rw=0;

Delay(5);

P0=b;

LCD_en=1;

Delay(5);

LCD_en=0;

Delay(5);

}


void LCD_init()

{

Delay(15);

LCD_Write_com(0x38);

Delay(5);

LCD_Write_com(0x08);

Delay(5);

LCD_Write_com(0x01);

Delay(5);

LCD_Write_com(0x06);

Delay(5);

LCD_Write_com(0x0C);

Delay(5);

}


void Time0_init()

{

TMOD=0x01;  //定时器0工作在模式1,

TH0=(65536-50000)/256;  //高8位=60

TL0=(65536-50000)%256;  //低8位

TR0=1; //开定时器0

ET0=1; //使能定时器0中断

EA=1;  //开总中断

}


void Write_sfm(unsigned char add,unsigned char date)

{

unsigned char shi,ge;

shi=date/10;

ge=date%10;

LCD_Write_com(0x80+0x40+add);

LCD_Write_data(0x30+shi);   //0x30表示的是对应数字的ASC码

LCD_Write_data(0x30+ge);    //0x30表示的是对应数字的ASC码

}


void Keyscan()

{

rd=0;

if(s1==0)   //s1摁下

{

Delay(5);

if(s1==0)

{

       s1num++;

   while(!s1);//等待s1松开

   if(s1num==1)

     {

  TR0=0;  //关定时器0

  LCD_Write_com(0x80+0x40+10);//光标定位到1602第二行第11个字符处

 LCD_Write_com(0x0f);//开显示,显示光标,光标闪烁

                     }

}

if(s1num==2)

{

TR0=0;

LCD_Write_com(0x80+0x40+7);

LCD_Write_com(0x0f);

      }

if(s1num==3)

{

TR0=0;

LCD_Write_com(0x80+0x40+4);

LCD_Write_com(0x0f);

      }

if(s1num==4)

{

s1num=0;

LCD_Write_com(0x0c); //开显示,不显示光标

TR0=1;  //开定时器

      }


   }

if(s1num!=0)  //若s1num不等于0

{

if(s2==0)   //s2摁下

{

Delay(5);

if(s2==0)

{

while(!s2);  //s2松开后while循环结束

if(s1num==1)

{

miao++;

if(miao==60)

miao=0;

Write_sfm(10,miao);

LCD_Write_com(0x80+0x40+10);

         }

if(s1num==2)

{

fen++;

if(fen==60)

fen=0;

Write_sfm(7,fen);

LCD_Write_com(0x80+0x40+7);

         }

if(s1num==3)

{

shi++;

if(shi==24)

shi=0;

Write_sfm(4,shi);

LCD_Write_com(0x80+0x40+4);

          }

}

      }

    }

}


void main()

{

wr=0;

LCD_init();

LCD_Write_com(0x80);  //不能写到for函数里面,否则显示不正常

for(num=0;num<15;num++)

{

LCD_Write_data(table[num]);

Delay(5);

         }

LCD_Write_com(0x80+0x40);   //不能写到for函数里面,否则显示不正常

for(num=0;num<12;num++)

{

LCD_Write_data(table1[num]);

Delay(5);

         }

Time0_init();

while(1)      //试试此处加一个冒号,提示什么警告,感悟:调试时要会对警告进行分析

{

Keyscan();

         }

}


//以下程序待自己编写

void timer0() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;  //50000*(11.0592/12)ms定时,若晶振为12MHz,则为50ms

count++;

if(count==18)         //此处表示18个以上的数字,即1s,注意有误差

{

count=0;

miao++;

if(miao==60)

{

miao=0;

fen++;

if(fen==60)

{

fen=0;

shi++;

if(shi==24)

{

shi=0;

}

Write_sfm(4,shi);

}

Write_sfm(7,fen);

}

Write_sfm(10,miao);


}


关键字:STC单片机  1602  显示时钟 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic462275.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:为什么单片机不能直接驱动继电器和电磁阀
下一篇:C51 定时器 TL0=(65536-50000)%256是怎么推导出来的?

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STC单片机关于舵机pwm控制源程序(单个与多个速度控制都有)
单片机源程序如下:/******************************************************************************* 文件: main.c** 作者: Zheng23** 日期:                         ** 功能:产生8路PWM输出控制8路舵机,方法:将20毫秒分成8个2500微秒,即8个单元,先计算出第一个单元的舵机PWM控制线的脉冲宽度,因为控制舵机的脉冲宽度最大为2500微秒,剩余的(20000 - 2500
发表于 2020-02-27
STC单片机内置EEPROM读取与保存 函数调用 .c和.h文件
);Save_Flash_Message(ks_Addr,Temp_Buf, 3);//保存    函数是 :void Save_Flash_Message(unsigned int Addr,unsigned char *Buf,unsigned int Len);现在是  无法保存  调取的也不对//以下为.h文件//使用单片机内部的Flash,模拟EEPROM使用//STC15W4K48S4 单片机,可以使用IAP命令擦写内部Flash//起始地址 0X0000 结束 0X27FF  其中,512Byte一个扇区//一共20个扇区  一个扇区可以存储一组参数
发表于 2020-02-16
STC单片机+DM134实现LED多段控制
 单片机源程序如下://============================================================================//================翼芯科技 LED流星灯8段16段==软件生成生成数据=================//============================================================================   //  此源码版权属 翼芯科技 全权享有,如欲引用,敬请署名并告知//         
发表于 2020-02-08
STC单片机+DM134实现LED多段控制
一文看懂STC单片机冷启动和复位有什么区别
  STC单片机简介  STC单片机是一款增强型51单片机,完全兼容MCS-51,还增加了新的功能,比如新增两级中断优先级,多一个外中断,内置EEPROM,硬件看门狗,具有掉电模式,512B内存等。还支持ISP下载,不用编程器,只要一个MAX232和一些廉价的元件就能写程序,可擦写10万次。因此是一款很好用的单片机。    stc单片机的优缺点  stc单片机优点:  1、抗干扰能力强;  2、保密性能强悍,很难被破解;  3、单片机时钟有防外部电磁辐射功能;  stc单片机缺点:  1、功耗较高,5V供电;  2、8位,运行速度慢;  3、无硬件乘法器,乘除法运算都为4周期指令;  4、单片机内集成资源少。  为什么STC单片机
发表于 2020-02-01
一文看懂STC单片机冷启动和复位有什么区别
STC单片机74HC595驱动8个数码管
74HC595驱动8个数码管源程序:/*---------------------------------------------------------------------*//* --- STC MCU International Limited ----------------------------------*//* --- STC 1T Series MCU Demo Programme -------------------------------*//* --- Mobile: (86)13922805190
发表于 2020-01-29
STC单片机不重新加电烧写方法
= 0;        while(10000>CNT++);}void soft_reset_to_ISP_Monitor(void){        IAP_CONTR = 0x60; //0110,0000 soft reset system to run ISP monitor}以上是个例子,利用STC_ISP_V483是可以的,其他版本未证实无法上传照片记得把0 1 2 3 4 5 6 7 8 9 A B C D E F 10拷贝到自定义下载中。
发表于 2020-01-19
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved