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

📄 ht1621.c

📁 单体电容测试仪源码程序 可测电压、有A/D转换等。
💻 C
字号:
#include <intrins.h>
#include "SM5964reg.h"
#include "ht1621.h"
#include "NewType.h"
#include "OS_CFG.H"


sbit HT1621SCL  = P0^0;
sbit HT1621DATA = P0^1;
sbit HT1621CS1 = P0^2;
sbit HT1621CS2 = P0^3;

bit RefreshDisplay;
unsigned char idata m_DisplayDriveBuf[2][16];

extern unsigned long ADC_counter;		//adc计数


//  液晶和HT1621对应表
//            A
//	    	 ---   
//	    F	| G |  B
//	     	 ---   
//	    E	|   |  C
//	    	 ---   
//            D

//  新主板第1种的字模表                 //  新主板第2种的字模表                   
//  字模表和液晶屏上实际的位置对应		//  字模表和液晶屏上实际的位置对应    
//  根据实际的连线调整了次序,p为特殊段  //  根据实际的连线调整了次序,p为特殊段                                
//       P C B A  D E G F          		//       A B C P  F G E D           
//  0 FD 1 1 1 1  1 1 0 1				//  0 FB 1 1 1 1  1 0 1 1           
//  1 E0 1 1 1 0  0 0 0 0				//  1 70 0 1 1 1  0 0 0 0           
//  2 BE 1 0 1 1  1 1 1 0				//  2 D7 1 1 0 1  0 1 1 1           
//  3 FA 1 1 1 1  1 0 1 0				//  3 F5 1 1 1 1  0 1 0 1           
//  4 E3 1 1 1 0  0 0 1 1				//  4 7C 0 1 1 1  1 1 0 0           
//  5 DB 1 1 0 1  1 0 1 1				//  5 BD 1 0 1 1  1 1 0 1           
//  6 DF 1 1 0 1  1 1 1 1				//  6 BF 1 0 1 1  1 1 1 1           
//  7 F0 1 1 1 1  0 0 0 0				//  7 F0 1 1 1 1  0 0 0 0           
//  8 FF 1 1 1 1  1 1 1 1				//  8 FF 1 1 1 1  1 1 1 1           
//  9 FB 1 1 1 1  1 0 1 1				//  9 FD 1 1 1 1  1 1 0 1           
//  - 82 1 0 0 0  0 0 1 0				//  - 14 0 0 0 1  0 1 0 0           
//  A F7 1 1 1 1  0 1 1 1				//  A FE 1 1 1 1  1 1 1 0           
//  B CF 1 1 0 0  1 1 1 1				//  B 3F 0 0 1 1  1 1 1 1           
//  C 9D 1 0 0 1  1 1 0 1				//  C 9B 1 0 0 1  1 0 1 1           
//  D EE 1 1 1 0  1 1 1 0				//  D 77 0 1 1 1  0 1 1 1           
//  E 9F 1 0 0 1  1 1 1 1				//  E 9F 1 0 0 1  1 1 1 1           
//  F 97 1 0 0 1  0 1 1 1         		//  F 9E 1 0 0 1  1 1 1 0           
//  N F5 1 1 1 1  0 1 0 1 				//  N FA 1 1 1 1  1 0 1 0           
//  L 8D 1 0 0 0  1 1 0 1 				//  L 1B 0 0 0 1  1 0 1 1           
//  K 8F 1 0 0 0  1 1 1 1 				//  K 1F 0 0 0 1  1 1 1 1           
//  o CE 1 1 0 0  1 1 1 1 				//  o 37 0 0 1 1  0 1 1 1           
//  r 86 1 0 0 0  0 1 1 0 				//  r 16 0 0 0 1  0 1 1 0           
//  P B7 1 0 1 1  0 1 1 1 				//  P DE 1 1 0 1  1 1 1 0           
//  H E7 1 1 1 0  0 1 1 1				//  H 7E 0 1 1 1  1 1 1 0           
//  U ED 1 1 1 0  1 1 0 1				//  U 7B 0 1 1 1  1 0 1 1           
//  J DB 1 1 1 0  1 0 0 0				//  J BD 0 1 1 1  0 0 0 1           
//************************************************************************
//  第1种的字模表
unsigned char code FontTab1[ 27 ]=
//  	   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F   10 11(-) 12(N) 13(|_) 14(o)  15(r) 16(P) 17(H) 18(U) 19(J) 1A(K)
		{0xFD,0xE0,0xBE,0xFA,0xE3,0xDB,0xDF,0xF0,0xFF,0xFB,0xF7,0xCF,0x9D,0xEE,0x9F,0x97,0x80,0x82,0xF5,  0x8D  ,0xCE, 0x86, 0xB7, 0xE7, 0xED, 0xE8,0x8F};
//  第2种的字模表
unsigned char code FontTab2[ 27 ]=
//  	   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F   10  11(-) 12(N) 13(|_) 14(o) 15(r) 16(P) 17(H) 18(U) 19(J) 1A(K)
		{0xFB,0x70,0xD7,0xF5,0x7C,0xBD,0xBF,0xF0,0xFF,0xFD,0xFE,0x3F,0x9B,0x77,0x9F,0x9E,0x10,0x14, 0xFA, 0x1B  ,0x37, 0x16, 0xDE, 0x7E, 0x7B, 0x71,0x1f};
//************************************************************************




//向HT1621发时钟。
void HT1621Clk(void)
{
	HT1621SCL = 0;
	_nop_();
	_nop_();
	_nop_();


	HT1621SCL = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();

	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	HT1621SCL = 0;
}
  
//送一个字节的命令。
void SendCommand(unsigned char Cmd)
{
	unsigned char i;
	for(i=0;i<9;i++) {
		HT1621DATA = (bit)(Cmd & 0x80);
		HT1621Clk();
		Cmd <<= 1;
	}
}
  
//送一个字节的数据。
void SendOneByte(unsigned char Data)
{
	unsigned char i;
	for(i=0;i<8;i++) {
		HT1621DATA = (bit)(Data & 0x01);
		HT1621Clk();
		Data >>= 1;
	}
}
//向HT1621送一个6位的址,先送高位(A5--A0)。
void SendAddress(unsigned char LcdRamAddress)
{
	unsigned char i;
	LcdRamAddress <<= 2;         
	for(i=0;i<6;i++) {
		HT1621DATA = (bit)(LcdRamAddress & 0x80);
		HT1621Clk();
		LcdRamAddress <<= 1;
	}

}
//向HT1621送数据头:101.
void SendDataHead(void)
{
	HT1621DATA = 1;	
	HT1621Clk();
	HT1621DATA = 0;
	HT1621Clk();	
	HT1621DATA = 1;
	HT1621Clk();
}
//向HT1621送命令头:100.
void SendCmdHead(void)
{
	HT1621DATA = 1;
	HT1621Clk();		//送了1
	HT1621DATA = 0;		//0
	HT1621Clk();		//送了0
	HT1621DATA = 0;	
	HT1621Clk();		//又送了0

}
/*
//向HT1621送命令头:100.
void SendCmdHead(void)
{
	HT1621DATA = 1;		//1
	HT1621SCL  = 1;
	HT1621CS_2 = 1;
	_nop_();
	_nop_();
	_nop_();
	HT1621CS_2 = 0;
	_nop_();
	_nop_();
	_nop_();
	HT1621Clk();		//送了1
	HT1621DATA = 0;		//0
	HT1621Clk();		//送了0
	HT1621DATA = 0;	
	HT1621Clk();		//又送了0

}
*/
void EnableFirstHT1621(void)
{
	HT1621DATA = 1;		//1
	HT1621SCL  = 1;
	HT1621CS1 = 1;
	_nop_();
	_nop_();
	_nop_();
	HT1621CS1 = 0;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
}

void EnableSecondHT1621(void)
{
	HT1621DATA = 1;
	HT1621SCL  = 1;
	HT1621CS2 = 1;
	_nop_();
	_nop_();
	_nop_();
	HT1621CS2 = 0;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
} 
void InitialHT1621(void)
{
	EnableFirstHT1621();
	EnableSecondHT1621();
	SendCmdHead();
	SendCommand(0x01);	// 0000 0001b	;Start the system clock
	SendCommand(0x18);	// 0x18=内部rc振荡,0x14=ext clc 32k
	//HT1621Clk();		// Send The "X"
	SendCommand(0x03);	// 0000 0011b	;Allows Light the LCD 
	//HT1621Clk();		// Send The "X"
	SendCommand(0x29);	// 0010 1001b	;1/3bias 4 commons option
	//HT1621Clk();		// Send The "X"
	//禁止HT1621
	HT1621CS1 = 1;
	SendCommand(0x0d);	// clr timer
//	SendCommand(0x07);	// clr timer
	SendCommand(0x06);	// timer en
	SendCommand(0x88);	// irq en 
	SendCommand(0xa3);	// irq en 
	Display_Exe(1, 1, 15);//显示电话机座
	HT1621CS2 = 1;
} 

//清屏
void ClearDisplay(void)
{
	unsigned char i;
	EnableFirstHT1621();
	EnableSecondHT1621();
	SendDataHead();//数据头命令
	SendAddress(0);//起始地址
	for(i=0;i<16;i++)
	{
		//m_DisplayDriveBuf[0][i] = 0;
		m_DisplayDriveBuf[0][i] = 0;
		if(i != 5)
		{
			m_DisplayDriveBuf[1][i] = 0;
		}
		else
		{
			m_DisplayDriveBuf[1][i] = (m_DisplayDriveBuf[1][i] & 0x08);
		}
		SendOneByte(0);//清掉1621两个ram数据
	}
	HT1621CS1 = 1;
	HT1621CS2 = 1;
}

/******************************************************************************
//函数说明
//location: 字符位置, icID = 0  0-11第一行,12-19第二行,20-31第三行
//character:字符取值和代表意义见字模表
*******************************************************************************/
void DisplayChar(unsigned char location,unsigned char character)
{
//	unsigned char xdata *DisplayBuffer;
//	unsigned char code  *FontAddress;
	unsigned char Font;
	unsigned char icID;
	if(location > 31) 	return;
	//确定字符位置
	if (location<=11) icID=0;	//显示的第一行字符(location=0-11)为第一芯片(icID=0)的0-11
	else if ((location>=12)  && (location<=15)){
		icID=1;					//显示的第二行前4个字符(location=12-15)为第二芯片(icID=1)的0-3
		location=location-12;
	}
	else if ((location>=16)  && (location<=19)){
		icID=0;					//显示的第二行后4个字符(location=16-19)为第一芯片(icID=0)的12-15
		location=location-4;
	}
	else if ((location>=20)  && (location<=31)){
		icID=1;					//显示的第二行字符(location=20-31)为第二芯片(icID=1)的4-15
		location=location-16;
	}
	//第芯片显示位置为倒序排列
	if(icID == 1) 	location=15-location;

	//前12个字符为一个表
	if(location<12)
	{
		if(!icID)
		{
			Font = FontTab1[character] & (m_DisplayDriveBuf[icID][location]|0x7f);
			EnableFirstHT1621();
		}
		else
		{
			Font = FontTab1[character];
			Font = (Font<<4)|(Font>>4);
			Font = Font&(m_DisplayDriveBuf[icID][location]|0xf7);
			EnableSecondHT1621();
		}

	}
	//后4个字符为一个表
	else
	{
		if(!icID) //0路
		{			
			Font = FontTab2[character] & (m_DisplayDriveBuf[icID][location]|0xef);
			EnableFirstHT1621();
		}
		else//1路
		{

			Font = FontTab2[character];
			Font = (Font<<4)|(Font>>4);
			EnableSecondHT1621();
			if(location != 13)//第12个字符的真值表特殊
			{
				Font = Font&(m_DisplayDriveBuf[icID][location]|0xfe);
			}
			else
			{
				Font = (Font&0xf0)|(((Font>>1)&0x0f)|0x08);
				Font = Font&(m_DisplayDriveBuf[icID][location]|0xf7);
			}
		}
	}
	m_DisplayDriveBuf[icID][location] = Font;
	SendDataHead();//101
	SendAddress(location*2);
	SendOneByte(Font); //一次写一字节
	HT1621CS1 = 1; 
	HT1621CS2 = 1; 
}

/*****************************************************************
//特殊段的显示
//enable: 0不显示 1显示
//icid:   特殊段所属1621
//addr:  特殊段在显示缓冲区中所在位置
//ciid = 0
//addr	0	 1		  2		   3    4		 5		  6	   7	    8
//字符	号码 时间符C1 起始时间 去电	通话时长 时间符C2 优惠 时间符C4	小数点C7
//      9	 10	  11   12   13		 14	  15
//		来电 通讯 星期 合计	小数点C6 序号 锁
//ciid = 1
//addr	0	     1		  2		   3        4		 5		     6	      7	       8
//字符	小数点S6 小数点S5 时间符D6 小数点S4	时间符D5 挂机话柄S10 时间符D4 小数点S3 小数点S2
//      9	     10	      11          12       13	    14	   15
//		小数点S1 时间符D2 摘机话柄S11 时间符D3 时间符D1 话费S7 话机座S9
******************************************************************/
void Display_Exe(bit Enable,unsigned char icID , unsigned char Addr)
{
	if(Enable)//显示
	{
		if(!icID)	//0路
		{
			EnableFirstHT1621();
			if(Addr<12)//前半字模			
			{
				m_DisplayDriveBuf[0][Addr] = m_DisplayDriveBuf[0][Addr]|0x80;	
			}
			else
			{
				m_DisplayDriveBuf[0][Addr] = m_DisplayDriveBuf[0][Addr]|0x10;
			}
		}
		else//1路
		{
			EnableSecondHT1621();
			if(Addr<12 || Addr == 13)			
			{
				m_DisplayDriveBuf[1][Addr] = m_DisplayDriveBuf[1][Addr]|0x08;	
			}
			else
			{
				m_DisplayDriveBuf[1][Addr] = m_DisplayDriveBuf[1][Addr]|0x01;
			}			
		}
	}
	else //隐藏特殊段
	{
		if(!icID)	//0路
		{
			EnableFirstHT1621();
			if(Addr<12)			
			{
				m_DisplayDriveBuf[0][Addr] = m_DisplayDriveBuf[0][Addr]&0x7f;	
			}
			else
			{
				m_DisplayDriveBuf[0][Addr] = m_DisplayDriveBuf[0][Addr]&0xef;
			}
		}
		else
		{
			EnableSecondHT1621();
			if(Addr<12 || Addr == 13)			
			{
				m_DisplayDriveBuf[1][Addr] = m_DisplayDriveBuf[1][Addr]&0xf7;	
			}
			else
			{
				m_DisplayDriveBuf[1][Addr] = m_DisplayDriveBuf[1][Addr]&0xfe;
			}			
		}	
	}
	SendDataHead();//101
	SendAddress(Addr*2);
	SendOneByte(m_DisplayDriveBuf[icID][Addr]); //一次写一字节
	HT1621CS1 = 1; 
	HT1621CS2 = 1; 
}
//全显
void disp_all(void)
{
	unsigned char i;
	for (i=0;i<32;i++){
		DisplayChar(i,8);//显示8
	}
	for (i=0;i<16;i++){
		Display_Exe(1,0,i);//显示特殊字符
		Display_Exe(1,1,i);//显示特殊字符
	}
}
/*
//以十进制方式显示长整形数
void disp_long_decimal(unsigned char location,unsigned long long_data)
{				  
	unsigned char shiyi,yi,qianwan,baiwan,shiwan,wan,qian,bai,shi,ge;
	ge = long_data%10;
	long_data = long_data/10;
	shi = long_data%10;
	long_data = long_data/10;
	bai = long_data%10;
	long_data = long_data/10;
	qian = long_data%10;
	long_data = long_data/10;
	wan = long_data%10;
	long_data = long_data/10;
	shiwan = long_data%10;
	long_data = long_data/10;
	baiwan = long_data%10;
	long_data = long_data/10;
	qianwan = long_data%10;
	long_data = long_data/10;
	yi = long_data%10;
	long_data = long_data/10;
	shiyi = long_data%10; 
    // 0    1   2   3    4   5     6  7  8  9 10 11
	//        十亿 亿 千万 百万 十万 万 千 百 十 个
	if (shiyi!=0) {
		DisplayChar(location+0,shiyi);
		DisplayChar(location+1,yi);	
		DisplayChar(location+2,qianwan);
		DisplayChar(location+3,baiwan);
		DisplayChar(location+4,shiwan);
		DisplayChar(location+5,wan);
	}
	else if (yi!=0)	{
		DisplayChar(location+0,0x10);
		DisplayChar(location+1,yi);	
		DisplayChar(location+2,qianwan);
		DisplayChar(location+3,baiwan);
		DisplayChar(location+4,shiwan);
		DisplayChar(location+5,wan);
	}
	else if (qianwan!=0)	{
		DisplayChar(location+0,0x10);
		DisplayChar(location+1,0x10);	
		DisplayChar(location+2,qianwan);
		DisplayChar(location+3,baiwan);
		DisplayChar(location+4,shiwan);
		DisplayChar(location+5,wan);
	}
	else if (baiwan!=0)	{
		DisplayChar(location+0,0x10);
		DisplayChar(location+1,0x10);	
		DisplayChar(location+2,0x10);
		DisplayChar(location+3,baiwan);
		DisplayChar(location+4,shiwan);
		DisplayChar(location+5,wan);
	}
	else if (shiwan!=0)	{
		DisplayChar(location+0,0x10);
		DisplayChar(location+1,0x10);	
		DisplayChar(location+2,0x10);
		DisplayChar(location+3,0x10);
		DisplayChar(location+4,shiwan);
		DisplayChar(location+5,wan);
	}
	else if (wan!=0)	{
		DisplayChar(location+0,0x10);
		DisplayChar(location+1,0x10);	
		DisplayChar(location+2,0x10);
		DisplayChar(location+3,0x10);
		DisplayChar(location+4,0x10);
		DisplayChar(location+5,wan);
	}
	DisplayChar(location+6,qian);
	DisplayChar(location+7,bai);
	DisplayChar(location+8,shi);
	DisplayChar(location+9,ge);
}

*/

//以十进制方式显示整形数
void disp_int(unsigned char location,unsigned int int_data)
{				  
	unsigned char wan,qian,bai,shi,ge;
	ge = int_data%10;
	int_data = int_data/10;
	shi = int_data%10;
	int_data = int_data/10;
	bai = int_data%10;
	int_data = int_data/10;
	qian = int_data%10;
	int_data = int_data/10;
	wan = int_data%10;
	if (wan!=0)	{
		DisplayChar(location,wan);
		DisplayChar(location+1,qian);
	}
	else if (qian!=0)	{
		DisplayChar(location+0,0x10);
		DisplayChar(location+1,qian);
	}
	else 	{
		DisplayChar(location+0,0x10);
		DisplayChar(location+1,0x10);
	}
	DisplayChar(location+2,bai);
	DisplayChar(location+3,shi);
	DisplayChar(location+4,ge);
}

//以十进制方式浮点数(最多显示65535),返回1表示超过65535
bit disp_float_max65536(unsigned char location,float float_data)
{				  
	if (float_data>65535) {	//超过显示最大值
		DisplayChar(location+0,0x10);
		DisplayChar(location+1,0x10);
		DisplayChar(location+2,0x11);	//-
		DisplayChar(location+3,0x11);	//-
		DisplayChar(location+4,0x11);	//-
	}
	disp_int(location,(unsigned int)float_data);
	return 0;	//未超过显示最大值
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -