找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1519|回复: 0
打印 上一主题 下一主题
收起左侧

1602液晶显示始终

[复制链接]
跳转到指定楼层
楼主
ID:205348 发表于 2017-5-27 21:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式



#include<stc12.h>    //共需要三个按键 一个是功能选择键(时,分。秒的选择) 一个加 一个减
#define uint unsigned int  //我并没用时钟芯片 只使用的定时器中断
#define uchar unsigned char
uchar code table[]={"0123456789:"};
uchar shi,fen,miao;    // 全局变量
sbit beep1=P3^1;    // 蜂鸣器 按键是响
sbit key1=P3^4;     // 功能选择按键
sbit key2=P3^3;     // 时间加按键
sbit key3=P3^2;     //  时间减按键
sbit lcden=P1^2;     // 使能信号
sbit RW=P1^1;     // 读/写选择端
sbit lcdrs=P1^0;     //  数据或者命令选择端
void delay(uint);    // 延时函数
void key();      // 按键扫描
void beep();     // 蜂鸣器
void show();     // 显示函数
void init_T1();     // 定时器初始函数
void init_1602();    // 1602初始函数
void write_com(uchar com);  //  命令选择端
void write_data(uchar date); //  数据选择端
void main()      //  主函数
{
init_1602();
init_T1();
while(1)
{
  key();
  show();
}
}
//##############定时器1的使用############
void init_T1()
{
TMOD=0x10;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1;
ET1=1;
TR1=1;
}
void ser_50() interrupt 3
{
uchar a;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
a++;
if(a>=20)      //用>=比用==好
{miao++;a=0;}
if(miao>=60)
{fen++;miao=0;}
if(fen>=60)
{fen=0;shi++;}
if(shi>=24)
shi=0;
}
//###############显示时间##########
void show()
{ uchar shi1,ge1,shi2,ge2,shi3,ge3;
shi1=shi/10;
ge1=shi%10;
shi2=fen/10;
ge2=fen%10;
shi3=miao/10;
ge3=miao%10;
write_com(0x80);
write_data(table[shi1]);
write_data(table[ge1]);
write_data(table[10]);
write_data(table[shi2]);
write_data(table[ge2]);
write_data(table[10]);
write_data(table[shi3]);
write_data(table[ge3]);
}
//###############按键扫描###################
void key()
{
uchar num;
if(key1==0)
{
  delay(20);
  if(key1==0)
  {
   num++;
   while(!key1);
   beep();
   if(num==1)
   {
    TR1=0;     //关定时器 否则会无法调节
    write_com(0x80+7);
    write_com(0x0f);
   }
   if(num==2)
   write_com(0x80+4);
   if(num==3)
   write_com(0x80+1);
   if(num==4)
   {
    num=0;
    write_com(0x0c);   //关光标
    TR1=1;
   }
  }
}
if(num!=0)    //只有功能按键按下去的时候才可以调节
{
  if(key2==0)      //加时间
  {
   delay(5);
   if(key2==0)
   {
    while(!key2);
    beep();
    if(num==1)
    {
     miao++;
     if(miao==60)
     miao=0;
     show();
     write_com(0x80+7);
    }
    if(num==2)
    {
     fen++;
     if(fen==60)
     fen=0;
     show();
     write_com(0x80+4);
    }
    if(num==3)
    {
     shi++;
     if(shi==24)
     shi=0;
     show();
     write_com(0x80+1);
    }
   }
  }
  if(key3==0)      //减时间
  {
   delay(5);
   if(key3==0)
   {
    while(!key3);
    beep();
    if(num==1)
    {
     miao--;
     if(miao==-1)
     miao=59;
     show();
     write_com(0x80+7);
    }
    if(num==2)
    {
     fen--;
     if(fen==-1)
     fen=59;
     show();
     write_com(0x80+4);
    }
    if(num==3)
    {
     shi--;
     if(shi==-1)
     shi=23;
     show();
     write_com(0x80+1);
    }
   }
  }
}
}
//###########################1602部分###############
void write_com(uchar com)//写命令的状态
{
lcdrs=0;//选择写命令模式
P0=com; // 将要写入的命令送到数据总线上
delay(5);// 稍作延时以待数据稳定
lcden=1; //
delay(5);//
lcden=0; //
}
void write_data(uchar date)//写数据的状态
{
lcdrs=1;        // 写数据
P0=date;        // p0使显示数据总线
delay(5);   
lcden=1;     
delay(5);   
lcden=0;      
}
void init_1602()  // 初始化的状态
{  RW=0;
   lcden=0;//
   write_com(0x38);  // 设置16*2显示,5*7点阵,8位数据接口
   write_com(0x0c);  // 设置开显示,不显示光标
   write_com(0x06);  // 写一个字符后地址自动加1
   write_com(0x01);  // 清除所有
   write_com(0x80);
}
//蜂鸣器
void beep()
{
beep1=0;
delay(100);
beep1=1;
}
//延时函数
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表