📄 ht1621.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 + -