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);
}
}
用户377235 2015-6-7 12:11