专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

1602液晶测试程序-模拟时钟跑秒

作者:佚名   来源:本站原创   点击数:  更新时间:2009年11月13日   【字体:

/************************************************
焊接上插针,然后插入学习板,切记不可插错位
跳线设置:默认跳线位
晶振:12M
硬件结构框架:
 1,1602字符液晶(可显示2行数字或者英文)
显示效果:
 1,MCU模拟时钟显示跑秒并在液晶屏上显示
相关知识点:
 1,字符型液晶的操作显示
注意事项:
 1,此程序版权归51hei.com所有,可随意修改,不得用于任何商业目的.
 2,注意方向,不可插反或者插错,当液晶在初次连接上开发板后可能会出现显示不全的现象,MCU复位即可
************************************************/

#include"AT89x52.h"
#include"51hei.h"
#include"math.h"

#define uchar unsigned char
#define uint unsigned int

sbit rs=P3^5;
sbit rw=P2^7;
sbit cs=P3^4;
sbit DUAN=P2^6;     //74HC573的LE端  U1  LED的段选端
sbit WEI=P2^7;      //74HC573的LE端  U2  LED的位选端

uchar lcd_data_1[]={"   2009-04-24"};
uchar lcd_data_2[]={"   :  :  "};
uchar shi,fen,miao;

void wei_1()
{
 WEI=1;
 P0=0;
 WEI=0;
}

void duan_1()
{
 DUAN=1;
 P0=0;
 DUAN=0;
}

void nop(){}  //延时一会

//=函数原型:delay
//=功    能:1ms延时
//=参    数:z
//=返 回 值:
//=函数性质:私有函数
void delay(uchar z)
{
 uchar t1,y;
 for(t1=z;t1>0;t1--)
  for(y=110;y>0;y--);
}

//=函数原型:lcd_busy
//=功    能:忙标志
//=参    数:
//=返 回 值:lcd_start&0x01值
//=函数性质:私有函数
uchar lcd_busy()
{
 register uchar lcd_start;
 rs=0;
 rw=1;
 cs=1;
 nop();
 lcd_start=P0;
 cs=0;
 return(lcd_start&0x80);
}

//=函数原型:write_cmd
//=功    能:写命令
//=参    数:cmd
//=返 回 值:
//=函数性质:私有函数
void write_cmd(uchar cmd)
{
 uchar CMD;
 CMD=cmd;
 while(lcd_busy());
 rs=0;
 rw=0;
 cs=1;
 nop();
 P0=CMD;
 cs=0;
}

//=函数原型:write_data
//=功    能:写数据
//=参    数:data1
//=返 回 值:
//=函数性质:私有函数
void write_data(uchar data1)
{
 uchar DATA;
 DATA=data1;
 while(lcd_busy());
 rs=1;
 rw=0;
 cs=1;
 nop();
 P0=DATA;
 cs=0;
}

//=函数原型:lcdinit
//=功    能:LCD初始化
//=参    数:
//=返 回 值:
//=函数性质:
void lcdinit()
{
 delay(30);       //延时30ms
 write_cmd(0x38); //设定8位操作格式,2行显示,5*7点阵
 delay(5);
 write_cmd(0x38); //设定8位操作格式,2行显示,5*7点阵
 delay(5);
 write_cmd(0x38); //设定8位操作格式,2行显示,5*7点阵
 delay(5);
 write_cmd(0x0c); //整体显示,关光标,不闪烁
 write_cmd(0x06); //输入方式设定(增量不移位)
 write_cmd(0x01); //清屏且光标回原位
 write_cmd(0x0d); //开显示开光标
}

//=函数原型:init
//=功    能:MCU初始化
//=参    数:
//=返 回 值:
//=函数性质?
void init()                              //初始化,开定时器0
{
  TMOD=0x01;
   TCON=0x10;  
    TH0=(65536-50000)/256;    
   TL0=(65536-50000)%256;
   IE=0x82;
}

//=函数原型:time
//=功    能:时间调节
//=参    数:
//=返 回 值:
//=函数性质:
void time()
{
 uchar i,a,b,c,d,e,f;
 a=miao%10;
 b=miao/10;
 c=fen%10;
 d=fen/10;
 e=shi%10;
 f=shi/10;
 write_cmd(0x80);       //地址指针的设置
 for(i=0;i<13;i++)
 {
  write_data(lcd_data_1[i]);
 }
 write_cmd(0xc0+0x04); //地址指针的设置
 for(i=0;i<8;i++)
 {
  write_data(lcd_data_2[i]);
 }
 write_cmd(0xc0+0x0c); //秒个位地址指针的设置
 write_data(0x30+a);
 write_cmd(0xc0+0x0b); //秒十位地址指针的设置
 write_data(0x30+b);
 write_cmd(0xc0+0x09); //分个位地址指针的设置
 write_data(0x30+c);
 write_cmd(0xc0+0x08); //分十位地址指针的设置
 write_data(0x30+d);
 write_cmd(0xc0+0x06); //时个位地址指针的设置
 write_data(0x30+e);
 write_cmd(0xc0+0x05); //时十位地址指针的设置
 write_data(0x30+f);
    
}

void main(void)
{
 wei_1();
 duan_1();
 guandz();//防止点阵干扰
 guanled();//防止led数码管干扰
 init();
 lcdinit(); 
 while(1)
 {
  time();
 }

}


void timer0() interrupt 1                  //定时器0
{
 uchar i;
 if(i++>10)
 {
  i=0;
  if(miao++>58)
  {
   miao=0;
   if(fen++>58)
   {
    fen=0;
    if(shi++>23)
    {
     shi=0;
    } 
   }
  }
 }
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
}

关闭窗口

相关文章