📄 ht1621.c
字号:
/*************************************************
File name:ht1621.c
Author:Chen ZhiWei
Version:czw2008.2
Date:8/10/2008.
Description:本文件HT1621的驱动文件,负责界面的显示
Other:
Funtion list:
History:
1.Date:8/10/2008
Author:Chen ZhiWei
Modification:
***************************************************/
#include <iom16v.h>
#include <macros.h>
#include <eeprom.h>
//此头文件包含位操作的宏
#define uchar unsigned char
#define uint unsigned int
//定义HT1621的命令
#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控制位(液晶模块接口定义,根据自已的需要更改)
#define DATA PORTA3 //HT1621数据引脚
#define CS PORTA0 //HT1621使能引脚
#define WR PORTA1 //HT1621时钟引脚
#define HT1621_DAT1 PORTA|=BIT(DATA)
#define HT1621_DAT0 PORTA&=~BIT(DATA)
#define HT1621_CS1 PORTA|=BIT(CS)
#define HT1621_CS0 PORTA&=~BIT(CS)
#define HT1621_WR1 PORTA|=BIT(WR)
#define HT1621_WR0 PORTA&=~BIT(WR)
//全局变量
uchar g_k;
uchar g_ht1621_code1=0xa7;
//g_ht1621_code1中的每一位代表"K1.有.无.电量.K2.K3.D3.h1."的是否显示
uchar g_ht1621_code2=0x77;
//g_ht1621_code2中每一位代表"K5.KW.功.h2.kvar.K4.D5.D2"
uchar g_ht1621_code3=0xde;
//g_ht1621_code3中每一位代表"时间.表号.D4.D1"
const uchar Ht1621Tab[]=
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
const uchar Ht1621Tab2[]=
{0xbe,0x06,0x7c,0x5e,0xc6,0xda,0xfa,0x0e,0xfe,0xde,0xee,0xf2,0xb8,0x76,0xf8,0xe8,0x00};
//0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, NOP
//8位显示的缓冲
char ht1621_show[8];
//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_WR0;
NOP();//NOP();NOP();NOP();
if(Data&0x80)
HT1621_DAT1;
else HT1621_DAT0;
NOP();//NOP();NOP();NOP();
HT1621_WR1;
NOP();//NOP();NOP();NOP();
Data<<=1;
}
}
/********************************************************
函数名称:void Ht1621WrCmd(uchar Cmd)
功能描述: HT1621命令写入函数
全局变量:无
参数说明:Cmd为写入命令数据
返回说明:无
说 明:写入命令标识位100
********************************************************/
void Ht1621WrCmd(uchar Cmd)
{
HT1621_CS0;
NOP();//NOP();NOP();NOP();
Ht1621Wr_Data(0x80,4); //写入命令标志100
Ht1621Wr_Data(Cmd,8); //写入命令数据
HT1621_CS1;
NOP();//NOP();NOP();NOP();
}
/********************************************************
函数名称:void Ht1621WrOneData(uchar Addr,uchar Data)
功能描述: HT1621在指定地址写入数据函数
全局变量:无
参数说明:Addr为写入初始地址,Data为写入数据
返回说明:无
说 明:因为HT1621的数据位4位,所以实际写入数据为参数的后4位
********************************************************/
void Ht1621WrOneData(uchar Addr,uchar Data)
{
HT1621_CS0;
Ht1621Wr_Data(0xa0,3); //写入数据标志101
Ht1621Wr_Data(Addr<<2,6); //写入地址数据
Ht1621Wr_Data(Data<<4,4); //写入数据
HT1621_CS1;
NOP();//NOP();NOP();NOP();
}
/********************************************************
函数名称:void Ht1621WrAllData(uchar Addr,uchar *p,uchar cnt)
功能描述: HT1621连续写入方式函数
全局变量:无
参数说明:Addr为写入初始地址,*p为连续写入数据指针,
cnt为写入数据总数
返回说明:无
说 明:HT1621的数据位4位,此处每次数据为8位,写入数据
总数按8位计算
********************************************************/
/*
void Ht1621WrAllData(uchar Addr,const uchar *p,uchar cnt)
{
uchar i;
HT1621_CS0;
Ht1621Wr_Data(0xa0,3); //写入数据标志101
Ht1621Wr_Data(Addr<<2,6); //写入地址数据
for (i=0;i<cnt;i++)
{
Ht1621Wr_Data(*p,8); //写入数据
p++;
}
HT1621_CS1;
NOP(); NOP();NOP();NOP();
}*/
/********************************************************
函数名称:void Ht1621WrAllData(uchar Addr,uchar *p,uchar cnt)
功能描述: HT1621连续写入方式函数
全局变量:无
参数说明:Addr为写入初始地址,*p为连续写入数据指针,
cnt为写入数据总数
返回说明:无
说 明:HT1621的数据位4位,此处每次数据为8位,写入数据
总数按8位计算.
写一个数的低四位的时候,应判别g_ht1621_code相应位的状态,若是1,则应该或上0x01,
********************************************************/
void Ht1621WrAllData(uchar Addr,uchar *p,uchar cnt)
{
uchar i,j,k;
HT1621_CS0;
Ht1621Wr_Data(0xa0,3); //写入数据标志101
Ht1621Wr_Data(Addr<<2,6); //写入地址数据
if(g_ht1621_code1==0xa7)PORTC=0x70;
for (i=0;i<cnt;i++)
{
Ht1621Wr_Data((*p)&0xf0,4); //写入数据拆成2个数
j=*p&0x0f;//取写一个数的低四位的值
//j=j<<4;
k=1<<(7-i);
if(g_ht1621_code1&k)
j|=0x01;
j=j<<4;
Ht1621Wr_Data(j,4);
p++;
}
HT1621_CS1;
NOP(); NOP();NOP();NOP();
}
/********************************************************
函数名称:void Ht1621_Init(void)
功能描述: HT1621初始化
全局变量:无
参数说明:无
返回说明:无
说 明:初始化后,液晶屏所有字段均显示
********************************************************/
void Ht1621_Init(void)
{
HT1621_CS1;
HT1621_WR1;
HT1621_DAT1;
DelayMS(4000); //延时使LCD工作电压稳定
Ht1621WrCmd(BIAS);
//Ht1621WrCmd(XTAL); //使用外部振荡器
Ht1621WrCmd(RC256);
Ht1621WrCmd(SYSDIS);
Ht1621WrCmd(WDTDIS);
Ht1621WrCmd(SYSEN);
Ht1621WrCmd(LCDON);
}
/****************************************
//功能描述:LED显示程序
//PD0-各位,PD1-十位,PA2-百位,PD3-千位
****************************************/
void led_display(void)
{
uchar i,j;
for (i=0;i<=7;i++) //取得显示码
{
j=ht1621_show[i];
ht1621_show[i]=Ht1621Tab2[j];
}
Ht1621WrAllData(0,ht1621_show,8);//显示1621内存的1到16位
Ht1621WrOneData(16,g_ht1621_code2>>4);//显示1621内存的17位
Ht1621WrOneData(17,g_ht1621_code2&0x0f);//显示1621内存的18位
Ht1621WrOneData(18,g_ht1621_code3>>4);//显示1621内存的19位
//while(1);
}
/****************************************
//功能描述:定时器2中断服务-数码管显示
*****************************************/
#pragma interrupt_handler timer2_ovf_isr:iv_TIMER2_OVF
void timer2_ovf_isr(void)
{
//SEI();
TCCR2 = 0x00; //关T2
/*
g_T2_time++;
if(g_T2_time==1200) //g_T2_time=100就是1S
g_T2_time=0;*/
led_display(); //LED显示
TCNT2 = 0xb2; //重新赋初值
TCCR2 = (1<<CS22)|(1<<CS20)|(1<<CS21); //重新开启1024分频
}
/****************************************
//功能描述:定时器2初始化
*****************************************/
void timer2_init(void)
{
TCNT2 = 0xb2;//定时10ms
TCCR2 = (1<<CS22)|(1<<CS20)|(1<<CS21); //分频比1024
TIMSK |=1<<TOIE2;//开放T2的溢出中断
}
void main(void)
{
uchar i,j,t,k;
DDRA=0xff;
PORTA=0x00;
DDRC=0xff;
PORTC=0xff;
ht1621_show[0]=1;ht1621_show[1]=2;ht1621_show[2]=3;ht1621_show[3]=4;
ht1621_show[4]=5;ht1621_show[5]=6;ht1621_show[6]=7;ht1621_show[7]=8;
Ht1621_Init(); //上电初始化LCD
//timer2_init();
SEI(); //开放总中断
//Ht1621WrAllData(0,Ht1621Tab,23);//清除1621寄存器数据,暨清屏
//Ht1621WrAllData(0,Ht1621Tab2,19);
//DelayMS(1000); //延时一段时间
led_display();
while(1)
{
g_k=0xff;
DelayMS(60000);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -