專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

1602液晶測試程序-模擬時鐘跑秒

作者:佚名   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2009年11月13日   【字體:

/************************************************
焊接上插針,然后插入學(xué)習(xí)板,切記不可插錯位
跳線設(shè)置:默認(rèn)跳線位
晶振:12M
硬件結(jié)構(gòu)框架:
 1,1602字符液晶(可顯示2行數(shù)字或者英文)
顯示效果:
 1,MCU模擬時鐘顯示跑秒并在液晶屏上顯示
相關(guān)知識點:
 1,字符型液晶的操作顯示
注意事項:
 1,此程序版權(quán)歸51hei.com所有,可隨意修改,不得用于任何商業(yè)目的.
 2,注意方向,不可插反或者插錯,當(dāng)液晶在初次連接上開發(fā)板后可能會出現(xiàn)顯示不全的現(xiàn)象,MCU復(fù)位即可
************************************************/

#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(){}  //延時一會

//=函數(shù)原型:delay
//=功    能:1ms延時
//=參    數(shù):z
//=返 回 值:
//=函數(shù)性質(zhì):私有函數(shù)
void delay(uchar z)
{
 uchar t1,y;
 for(t1=z;t1>0;t1--)
  for(y=110;y>0;y--);
}

//=函數(shù)原型:lcd_busy
//=功    能:忙標(biāo)志
//=參    數(shù):
//=返 回 值:lcd_start&0x01值
//=函數(shù)性質(zhì):私有函數(shù)
uchar lcd_busy()
{
 register uchar lcd_start;
 rs=0;
 rw=1;
 cs=1;
 nop();
 lcd_start=P0;
 cs=0;
 return(lcd_start&0x80);
}

//=函數(shù)原型:write_cmd
//=功    能:寫命令
//=參    數(shù):cmd
//=返 回 值:
//=函數(shù)性質(zhì):私有函數(shù)
void write_cmd(uchar cmd)
{
 uchar CMD;
 CMD=cmd;
 while(lcd_busy());
 rs=0;
 rw=0;
 cs=1;
 nop();
 P0=CMD;
 cs=0;
}

//=函數(shù)原型:write_data
//=功    能:寫數(shù)據(jù)
//=參    數(shù):data1
//=返 回 值:
//=函數(shù)性質(zhì):私有函數(shù)
void write_data(uchar data1)
{
 uchar DATA;
 DATA=data1;
 while(lcd_busy());
 rs=1;
 rw=0;
 cs=1;
 nop();
 P0=DATA;
 cs=0;
}

//=函數(shù)原型:lcdinit
//=功    能:LCD初始化
//=參    數(shù):
//=返 回 值:
//=函數(shù)性質(zhì):
void lcdinit()
{
 delay(30);       //延時30ms
 write_cmd(0x38); //設(shè)定8位操作格式,2行顯示,5*7點陣
 delay(5);
 write_cmd(0x38); //設(shè)定8位操作格式,2行顯示,5*7點陣
 delay(5);
 write_cmd(0x38); //設(shè)定8位操作格式,2行顯示,5*7點陣
 delay(5);
 write_cmd(0x0c); //整體顯示,關(guān)光標(biāo),不閃爍
 write_cmd(0x06); //輸入方式設(shè)定(增量不移位)
 write_cmd(0x01); //清屏且光標(biāo)回原位
 write_cmd(0x0d); //開顯示開光標(biāo)
}

//=函數(shù)原型:init
//=功    能:MCU初始化
//=參    數(shù):
//=返 回 值:
//=函數(shù)性質(zhì)?
void init()                              //初始化,開定時器0
{
  TMOD=0x01;
   TCON=0x10;  
    TH0=(65536-50000)/256;    
   TL0=(65536-50000)%256;
   IE=0x82;
}

//=函數(shù)原型:time
//=功    能:時間調(diào)節(jié)
//=參    數(shù):
//=返 回 值:
//=函數(shù)性質(zhì):
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);       //地址指針的設(shè)置
 for(i=0;i<13;i++)
 {
  write_data(lcd_data_1[i]);
 }
 write_cmd(0xc0+0x04); //地址指針的設(shè)置
 for(i=0;i<8;i++)
 {
  write_data(lcd_data_2[i]);
 }
 write_cmd(0xc0+0x0c); //秒個位地址指針的設(shè)置
 write_data(0x30+a);
 write_cmd(0xc0+0x0b); //秒十位地址指針的設(shè)置
 write_data(0x30+b);
 write_cmd(0xc0+0x09); //分個位地址指針的設(shè)置
 write_data(0x30+c);
 write_cmd(0xc0+0x08); //分十位地址指針的設(shè)置
 write_data(0x30+d);
 write_cmd(0xc0+0x06); //時個位地址指針的設(shè)置
 write_data(0x30+e);
 write_cmd(0xc0+0x05); //時十位地址指針的設(shè)置
 write_data(0x30+f);
    
}

void main(void)
{
 wei_1();
 duan_1();
 guandz();//防止點陣干擾
 guanled();//防止led數(shù)碼管干擾
 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;
}

關(guān)閉窗口

相關(guān)文章