原创 HT1621驱动程序显示

2009-7-11 20:54 10080 5 6 分类: MCU/ 嵌入式

HT1621驱动程序有32个物理地址,一个物理地址含4BIT,即两个物理地址为8BIT刚好一个字节


#ifndef __timer__h_
#define __timer__h_
    //*硬件连接:段选码P0.0~P0.7(a,b,c,d,e,f,g,h,dp),位选码P2.0~P2.5(高到低)
 // K1--P3.5;K2--P3.4;K3--P3.3;K4--P3.2*/


#include "reg52.h"
#include "intrins.h"
#define uchar unsigned char
#define uint  unsigned int


#define Hidden 0; //消隐字符在字形码中的位置
uchar code BitTab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};


//         ****A****
//         *               *
//         *               *
//         F               B
//         *               *
//         ****G****
//         *              *
//         *              *
//         E             C
//         *              *
//         *              *
//         ****D****
uchar code DispTab[]={
       //F     E        G      D     C    B      A
0xCF,  //0
0x06, //1
0x6D,  //2
0x2F,  //3
0xA6,  //4
0xAD, //5
0xF2, //6
0x07, //7
0xEF, //8
0xBF,  //9
0XFF};//,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};
//uchar DispBuf[6]; //6字节的显示缓冲区
//uchar s1,s2,m1,m2,h1,h2;
bit Sec;   //1s到的标记
bit Minute;   //1m到的标记
bit Hour;   //1h到的标记
bit H_up;
bit H_down;
bit M_up;
bit M_down;
sbit P2_7=P2^7;  //周期测试位
uchar SecValue;  //秒计数
uchar MinuteValue; //分计数
uchar HourValue; //时计数


uchar code TH0Val=63075/256;
uchar code TL0Val=63075%256;//晶振为12M,定时2.5ms定时器初值(计算值为63036,校准值为63075)



void Timer0() interrupt 1
{// uchar tmp;
// static uchar dCount; //计数器,显示程序通过它得知现在显示那个数码管
 static uint Count;  //秒计数器
 const uint CountNum="400"; //预置值(400*2.5ms=1minute)
 P2_7=~P2_7;       //外部测试位,用于调整定时器初值
 TH0=TH0Val;
 TL0=TL0Val;
// tmp="BitTab"[dCount];  //根据当前的计数值取位值
 //P2=P2|0x3f;    //P2与00111111相或,将低6位置1
 //P2=P2&tmp;    //P2与取出的值相与,将某一位清0
 //tmp=DispBuf[dCount]; //根据当前的计数值,取显示缓冲区的待显示值
 //tmp=DispTab[tmp];  //取字形码
 //P0=tmp;     //送出字形码
 //dCount++;    //计数值加1
 //if(dCount==6)   //如果计数值为6,归0
 // dCount="0";
//以下为秒计数
 Count++;    //计数值加1
 if(Count>=CountNum)  //到达预置计数值
 { Count="0";   //清零
  Sec="1";    //置1秒到标志位
  SecValue++;    //秒值加1
  if(SecValue>=60)
  { SecValue="0";  
   Minute="1";   //置1分到标志位
   MinuteValue++;  //分值加1
  }
  if(MinuteValue>=60)
    { Hour="1";     //置1小时到标志位
   MinuteValue="0";
    HourValue++;   //小时值加1
    }
  }
 
}


void Init()
{
 TMOD=0x01;
 TH0=TH0Val;
 TL0=TL0Val;
 ET0=1;    //开T0中断
 EA=1;    //开总中断
 TR0=1;    //T0开始运行
}


void mDelay(unsigned int Delay)  //延时程序,用于键盘消抖
{ unsigned int i;
 for(;Delay>0;Delay--)
 { for(i=0;i<124;i++)
  {;}
 }
}


uchar Key()      //键盘程序,获得键值
{
 uchar KValue;
 uchar tmp;
 P3|=0x3c;     //将P3口接键盘的4位置1
 KValue=P3;
 KValue|=0xc3;  //将未接的四位置1
 if(KValue==0xff) //中间4位均为1,无键按下
  return(0);  //返回
 mDelay(10);   //延时10mS消抖
 KValue=P3;
 KValue|=0xc3;   //再次读键盘
 if(KValue==0xff)
 return(0);
 for(;;)
 { tmp="P3";
  if((tmp|0xc3)==0xff)   //等待按键释放
  break;
 }
 return(KValue);
}


void KProce(uchar KValue)    //键值处理程序
{ if((KValue&0x20)==0)    //K1
 H_up=1;
 if((KValue&0x10)==0)    //K2
 H_down=1;
 if((KValue&0x08)==0)    //K3
 M_up=1;
 if((KValue&0x04)==0)    //K4
 M_down=1;
}


 


//void display1()
//{
//Ht1621WrOneData(18,DispBuf[4]);
//Ht1621WrOneData(18,DispBuf[4]<<4);
//Ht1621WrOneData(19,DispBuf[5]);
//Ht1621WrOneData(19,DispBuf[4]);
//Ht1621WrOneData(20,DispBuf[4]);
//Ht1621WrOneData(20,DispBuf[4]<<4);
//Ht1621WrOneData(21,DispBuf[5]);
//Ht1621WrOneData(21,DispBuf[5]<<4);
 //} 
#endif


 


//*********************************************


//*********************************************


//*****************HT1621驱动*****************


#ifndef __ht1621__h_


#define __ht1621__h_


/********************************************************
功能描述: HT1621芯片程序
设计 人:yuanlu


版本:1.0

每一个字段
完成时间:2009年7月10日
********************************************************/
#include <REG52.H>
#include <intrins.h>
#include "timer.h"
//#define uchar unsigned char
#define uint unsigned int
#define _Nop() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_()
#define BIAS 0x52 //0b1000 0101 0010 1/3duty 4com
#define SYSDIS 0X00 //0b1000 0000 0000 关振系统荡器和LCD偏压发生器
#define SYSEN 0X02 //0b1000 0000 0010 打开系统振荡器
#define LCDOFF 0X04 //0b1000 0000 0100 关LCD偏压
#define LCDON  0X06 //0b1000 0000 0110 打开LCD偏压
#define XTAL 0x28 //0b1000 0010 1000 外部接时钟
#define RC256 0X30 //0b1000 0011 0000 内部时钟
#define TONEON 0X12 //0b1000 0001 0010 打开声音输出
#define TONEOFF 0X10 //0b1000 0001 0000 关闭声音输出
#define WDTDIS 0X0A //0b1000 0000 1010 禁止看门狗
//HT1621控制位(液晶模块接口定义,根据自已的需要更改)
sbit HT1621_DAT=P1^4; //HT1621数据引脚
sbit HT1621_CS=P1^2; //HT1621使能引脚
sbit HT1621_WR=P1^3; //HT1621时钟引脚
sbit  LCD="P0"^0;
sbit   speaker="P2"^4;
uchar code Ht1621Tab[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//delay us
void Delay(uchar us) //5,7,9
{
while(--us);
}
//delay ms
void DelayMS(uint iMs)
{
uint i,j;
for(i=0;i<iMs;i++)
for(j=0;j<65;j++) Delay(1);
}


/******************************************************
写数据函数,cnt为传送数据位数,数据传送为低位在前
*******************************************************/
void Ht1621Wr_Data(uchar Data,uchar cnt)
{
uchar i;
for (i=0;i<cnt;i++)
{
HT1621_WR=0;
_Nop();
HT1621_DAT=Data&0x80;
_Nop();
HT1621_WR=1;
_Nop();
Data<<=1;
}
}
/********************************************************
函数名称:void Ht1621WrCmd(uchar Cmd)
功能描述: HT1621命令写入函数
全局变量:无
参数说明:Cmd为写入命令数据
返回说明:无
设计 人:yuanlu
版本:1.0
说明:写入命令标识位100
********************************************************/
void Ht1621WrCmd(uchar Cmd)
{
HT1621_CS=0;
_Nop();
Ht1621Wr_Data(0x80,4); //写入命令标志100
Ht1621Wr_Data(Cmd,8); //写入命令数据
HT1621_CS=1;
_Nop();
}
/********************************************************
函数名称:void Ht1621WrOneData(uchar Addr,uchar Data)
功能描述: HT1621在指定地址写入数据函数
全局变量:无
参数说明:Addr为写入初始地址,Data为写入数据
返回说明:无
设计 人:yuanlu


版本:1.0
说明:因为HT1621的数据位4位,所以实际写入数据为参数的高4位
********************************************************/
void Ht1621WrOneData(uchar Addr,uchar Data)
{
HT1621_CS=0;
Ht1621Wr_Data(0xa0,3); //写入数据标志101
Ht1621Wr_Data(Addr<<2,6); //写入地址数据
Ht1621Wr_Data(Data,4); //写入数据的前四位 7  6  5  4
HT1621_CS=1;
_Nop();
}
/********************************************************
第 2 页
HT1621测试程序,2008-2-13, 22:41:43
函数名称:void Ht1621WrAllData(uchar Addr,uchar *p,uchar cnt)
功能描述: HT1621连续写入方式函数
全局变量:无
参数说明:Addr为写入初始地址,*p为连续写入数据指针,
cnt为写入数据总数
返回说明:无
设计 人:yuanlu
版本:1.0
说明:HT1621的数据位4位,此处每次数据为8位,写入数据
总数按8位计算
********************************************************/
void Ht1621WrAllData(uchar Addr,uchar *p,uchar cnt)
{
uchar i;
HT1621_CS=0;
Ht1621Wr_Data(0xa0,3); //写入数据标志101
Ht1621Wr_Data(Addr<<2,6); //写入地址数据
for (i=0;i<cnt;i++)
{
Ht1621Wr_Data(*p,8); //写入数据
p++;
}
HT1621_CS=1;
_Nop();
}
/********************************************************
函数名称:void Ht1621_Init(void)
功能描述: HT1621初始化
全局变量:无
参数说明:无
返回说明:无
设计 人:yuanlu


版本:1.0
说明:初始化后,液晶屏所有字段均显示
********************************************************/
void Ht1621_Init(void)
{
HT1621_CS=1;
HT1621_WR=1;
HT1621_DAT=1;
DelayMS(2000); //延时使LCD工作电压稳定
Ht1621WrCmd(BIAS);
Ht1621WrCmd(RC256); //使用内部振荡器
Ht1621WrCmd(SYSDIS);
Ht1621WrCmd(WDTDIS);
Ht1621WrCmd(SYSEN);
Ht1621WrCmd(LCDON);
}


#endif


//***********************************************


//***********************************************


//***********************主函数******************


#include<reg52.h>


#include<intrins.h>


#include "timer.h"


#include "ht1621.h"


//***************************//


void mian( )
{
uchar KValue;   //存放键值
uchar s1,s2,m1,m2,h1,h2;
 //Init();     //初始化
 s1=SecValue/10;
 s2=SecValue%10;
 //for(;;)
 //{


    
  m1=MinuteValue/10;
  m2=MinuteValue%10;


      //
   h1=HourValue/10;
   h2=HourValue%10;
//Ht1621WrOneData(1,DispTab[DispBuf[0]]);
//Ht1621WrOneData(1,DispTab[DispBuf[0]]<<4);
//Ht1621WrOneData(2,DispTab[DispBuf[1]]);
//Ht1621WrOneData(2,DispTab[DispBuf[1]]<<4);
    


  if(Sec)    //1s时间到
  {
   //DispBuf[4]=SecValue/10;
  // DispBuf[5]=SecValue%10;
 
  //if(s1==0)
   //s1=Hidden;  //高位0消隐
Ht1621WrOneData(22,DispTab[s1]);
Ht1621WrOneData(23,DispTab[s1]<<4);
Ht1621WrOneData(24,DispTab[s2]);
Ht1621WrOneData(25,DispTab[s2]<<4);
   Sec="0";   //清除1s到标志位
  }


  if(Minute)
  {  



 //// if(m1==0)
   // m1=Hidden;  //高位0消隐
Ht1621WrOneData(18,DispTab[m1]);
Ht1621WrOneData(19,DispTab[m1]<<4);
Ht1621WrOneData(20,DispTab[m2]);
Ht1621WrOneData(21,DispTab[m2]<<4);
   Minute="0";      //清除1m到标志位
   }


   if(Hour)
   {


   //if(h1==0)
  //  h1=Hidden;  //高位0消隐
Ht1621WrOneData(1,DispTab[h1]);
Ht1621WrOneData(2,DispTab[h1]<<4);
Ht1621WrOneData(3,DispTab[h2]);
Ht1621WrOneData(4,DispTab[h2]<<4);
   Hour="0";      //清除1h到标志位
   }


 


   KValue="Key"();   //调键盘程序获得键值
   if(KValue)    //该值不等于0
   { KProce(KValue);  //调键盘处理程序
   }
   if(H_up)      //小时值调整
   { HourValue++;
   if(HourValue>=24)
   { HourValue="0";
   }
    H_up=0;
   }
   if(H_down)
   { HourValue--;
    H_down=0;
   }
   if(M_up)       //分值调整
   { MinuteValue++;
    if(MinuteValue>=60)
   {MinuteValue=0;
   }
    M_up=0;
   }
   if(M_down)
   { MinuteValue--;
    M_down=0;
   }
 }


void main()
{
//uchar i,j,t;
Ht1621_Init(); //上电初始化LCD
DelayMS(1000); //延时一段时间
//while(1)
//{


LCD=0;
speaker=0;
Init();
Ht1621WrAllData(0,Ht1621Tab,16);//清除1621寄存器数据,暨清屏
Ht1621WrOneData(0,DispTab[10]);
Ht1621WrOneData(1,DispTab[10]<<4);
Ht1621WrOneData(2,DispTab[10]);
Ht1621WrOneData(3,DispTab[10]<<4);
while(1)
{
//for (i=0;i<32;i++)
//{
//t=0x01;
//for (j=0;j<4;j++)
//{
//Ht1621WrOneData(i,t);
//t<<=1;
//t++;
//P1_5=~P1_5;
//DelayMS(500);
//}
//}
//Ht1621Wr0neData(10,0x08);


//Ht1621WrOneData(18,DispBuf[4]);
//Ht1621WrOneData(18,DispBuf[4]<<4);
//Ht1621WrOneData(19,DispBuf[5]);
//Ht1621WrOneData(19,DispBuf[4]);


display();
//Ht1621WrOneData(7,0xe3);
//DelayMS(200);
}
}

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2015-6-7 12:11

非常感谢,你的无私奉献,
相关推荐阅读
用户1635721 2009-07-02 18:39
10种滤波方法(很实用)
在日常的项目设计中,经常要用到一些算法程序,假设对AD的取样函数为get_ad( )5种滤波方法(很实用)1、限幅滤波/*A值可以根据实际情况调整#define  A   10   //设置两次采样的...
用户1635721 2009-06-30 20:06
按键加减(按住连加)
//速度加减程序void speed_add_dec(){if(speedadd_flag)                   //查询到速度加键被按下{   x++;               ...
用户1635721 2009-06-28 19:49
主程序流程
#include<reg52.h>#include "__scankey__h_#include "__tongxin__h_void speaker(uchar time)   for(...
用户1635721 2009-06-28 19:22
LCD头文件、积存器、标志定义(电子表项目)
#ifndef __lcd__h__#define __lcd__h__#include<mcu.h>//*****************************************...
用户1635721 2009-06-28 19:01
74HC573扫描显示(电子表项目)
#ifndef __74hc573__h_#define __74hc573__h_//锁存74HC573信号为定义 扫描字符段。11脚当为高电平时移位,低电平锁存控制 9脚输出使能端,低电平有效sb...
EE直播间
更多
我要评论
1
5
关闭 站长推荐上一条 /3 下一条