⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ht1621.c

📁 AX1621 驱动程序, 采用汇编语言编写
💻 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 + -