STC单片机驱动段码式液晶显示屏程序STC12C5612 HT1621B






/********************************************************************************************************
* 智能综合监控器显示器源序(STC12LE5612AD) *
* *
* (c) Copyright 2011 *
* All Rights Reserved *
* *
* V1.00 *
* 2011.2.19 *
*
**********************************************************************************************************/

//#include "reg2051.h"

#include "STC12C5612AD.H"
#include "intrins.h"
#include "ht1621.h"

/*******************************************宏定义***********************************************/


#define VER 1101 //版本号U1101,
//CPU:STC12LE5612AD显示板程序版本;

#define DIGIT 13 //10位数据+aa+crc校验
#define MASTER 0XFD
#define SLAVE 0XFB
#define MODE 1


/**字符索引 **/
#define Char_S_Index 5
#define Char_A_Index 10
#define Char_B_Index 11
#define Char_C_Index 12
#define Char_D_Index 13
#define Char_E_Index 14
#define Char_F_Index 15
#define Char_G_Index 16
#define Char_H_Index 17
#define Char_L_Index 18
#define Char_P_Index 19
#define Char_U_Index 20
#define Char_Ling_Index 21
#define Char_Dot_Index 22
#define Char_Bracket_Index 23
#define Char_N_Index 24
#define Char_T_Index 25
#define Char_DownLing_Index 26
#define Char_UpLing_Index 27

#define FOSC 11059200 //CPU外接晶振频率(Hz)
#define SYS_TICKS_PER_SEC 500 //每秒的系统节拍305
#define CLOCK 1 //分频 不分频;

#define TIM0_LOW (65536 - ((FOSC / CLOCK) / SYS_TICKS_PER_SEC)) % 256//Timer0重装值
#define TIM0_HIGH (65536 - ((FOSC / CLOCK) / SYS_TICKS_PER_SEC)) / 256

#define IRQ_INT0 0 //INT0中断号
#define IRQ_T0 1 //T0中断号
#define IRQ_T1 3 //T1中断号
#define IRQ_UART 4 //串口中断号


/*********************************串口波特率发生器预置值*************************************************/
uint16 code UART_BAUD_TAB[] = {
(uint16)(FOSC / 1200) - 16, //1200BPS
(uint16)(FOSC / 1800) - 16, //1800BPS
(uint16)(FOSC / 2400) - 16, //2400BPS
(uint16)(FOSC / 3600) - 16, //3600BPS
(uint16)(FOSC / 4800) - 16, //4800BPS
(uint16)(FOSC / 7200) - 16, //7200BPS
(uint16)(FOSC / 9600) - 16, //9600BPS
(uint16)(FOSC / 14400) - 16, //14400BPS
(uint16)(FOSC / 19200) - 16

//19200BPS
};


/*********************************消息类型定义***********************************************************/
typedef enum
{
NOT_KEY, //无按键
KEY_SET, //设置键
KEY_DOWN, //递减键
KEY_UP , //递增键
KEY_ENTER , //确定键

} MSG;



/*****************************************口线定义**************************************************/
sbit Key1 =P1^3; //设置键
sbit Key2 =P1^4; //确认键
sbit Key3 =P1^5; //上翻键
sbit Key4 =P1^6; //下翻键

sbit Rs485_SW =P2^3;

void Rs485_DirR(void)
{
Rs485_SW = 0; //输出低电平
}

void Rs485_DirT(void)
{
Rs485_SW = 1; //输出高电平
}

uint8 code Number_Tab[][2]={ //对应地址线SEG4-SEG13的数字编码
{0x05,0x0f}, //0段码
{0x05,0x00}, //1段码
{0x03,0x0d}, //2段码
{0x07,0x09}, //3段码
{0x07,0x02}, //4段码
{0x06,0x0b}, //5段码
{0x06,0x0f}, //6段码
{0x05,0x01}, //7段码
{0x07,0x0f}, //8段码
{0x07,0x0b}, //9段码
{0x07,0x07}, //A段码 10
{0x06,0x0e}, //B段码 11
{0x00,0x0f}, //C段码 12
{0x07,0x0c}, //D段码 13
{0x02,0x0f}, //E段码 14
{0x02,0x07}, //F段码 15
{0x04,0x0f}, //G段码 16
{0x07,0x06}, //H段码 17
{0x00,0x0e}, //L段码 18
{0x03,0x07}, //P段码 19
{0x05,0x0e}, //U段码 20
{0x02,0x00}, //-段码 21
{0x08,0x00}, //.段码 如果是SEG4则为单位Kvar 22
{0x00,0x0f}, //“)”段码 23
{0x05,0x07}, //n段码 24
{0x00,0x07}, //T段码 25
{0x00,0x08}, //下划线 26
{0x00,0x01} //上划线 27
};

uint8 code Ht1621Clear[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //显示清零
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

/*****************************************全局变量定义**********************************************/

uint8 Dis_Buf[16]; //显示更新缓存数组
bit gRec; //串口接收中 数据标志
bit gDisData; //接收数据标志
bit gGetKey; //接收键盘标志
uint8 gKeyValue; //读取键盘值
uint8 idata gDisBuf[10]; //读取串口数据缓存
uint16 CRC; //CRC校验值
uint8 gKeyTime; //键盘超时时间
uint8 gRecOverTime; //接收超时时间
uint8 gUartCount; //串口接收字节数
uint8 gSendNumber; //串口发送个数
uint8 gSendCount;

//串口发送字节数
uint8 idata gUartBuf[14]; //串口接收缓存数组
uint8 gAddr; //键盘标志头

/**********************************************函数声明**********************************************************/
void get_crc(uint8 *crcbuf,uint8 count);
void Set_Uart_Baud(uint8 Index);
void Sys_Init(void);
void Decode(void);




/*********************************************************************************************************
** 函数名称: Set_Uart_Baud
** 功能描述: 串口波特率设定
** 输 入: Index:波特率索引
** 输 出: 无
*********************************************************************************************************/

void Set_Uart_Baud(uint8 Index)
{
switch(Index)
{
case 0 : //1200 bps
TH1 = 0xE8;
TL1 = 0xE8;
PCON&= 0x7F;
break;
case 1 : //1800 bps
TH1 = 0xF0;
TL1 = 0xF0;
PCON&= 0x7F;
break;
case 2 : //2400 bps
TH1 = 0xF4;
TL1 = 0xF4;
PCON&= 0x7F;
break;
case 3 : //3600 bps
TH1 = 0xF8;
TL1 = 0xF8;
PCON&= 0x7F;
break;
case 4: //4800 bps
TH1 = 0xFA;
TL1 = 0xFA;
PCON&= 0x7F;
break;
case 5 : //7200 bps
TH1 = 0xFC;
TL1 = 0xFC;
PCON&= 0x7F;
break;
case 6 : //9600 bps
TH1 = 0xFD;
TL1 = 0xFD;
PCON&= 0x7F;
break;
case 7 : //14400 bps
TH1 = 0xFE;
TL1 = 0xFE;
PCON&= 0x7F;
break;
case 8 : //19200 bps
TH1 = 0xFD;
TL1 = 0xFD;
PCON|= 0x80;;
break;

}
}




/********************************************************************************************************
** 函数名称: Sys_Init
** 功能描述: 初始化
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块: 无
********************************************************************************************************/
void Sys_Init(void)
{
EA = 0; //禁止所有中断
AUXR = 0x80; //T0 为1T模式,T1为传统的12T模式;

P1M0 = 0x78; // 01111000 //配置按键口输入模式P1.3~P1.6为输入
P1M1 = 0x00; // 00000000
P2M0 = 0x00; // 00000000 //与Ht1621接口为输出模式P2.4~P2.7为输出
P2M1 = 0xf0; // 11110000

TMOD = 0x21; //0010 0001 T1为8位自动重载入定时器,用来设置波特率;T0为16位定时计数器
TL0 = TIM0_LOW; //Timer0预置
TH0 = TIM0_HIGH;

Ht1621_Init();
TR0 = 1;
TR1 = 1;

ET0 = 1; //使能定时器0中断
ES = 1; //使能串口中断
EA = 1; //使能全局中断

PS = 1; //PS=1使能串口断具有高优先权

Set_Uart_Baud(4); //设置串口波特率为4800

SCON = 0x50; //UAR

T模式:8位数据,允许接收
WDT_CONTR = 0x3B; //看门狗定时约为0.5s
Rs485_DirR(); //初始化为先接收
}

void Update(void) //更新所有显示
{
// Ht1621WrAllData(0,Ht1621Clear,16);
Ht1621WrAllData(0,Dis_Buf,16);
}


/********************************************************************************************************
** 函数名称: T0_2ms
** 功能描述: 定时器0中断
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************************/

void T0_IRQ(void) interrupt IRQ_T0
{
TL0 = TIM0_LOW; //装载定时器初值 2ms一次定时中断
TH0 = TIM0_HIGH; //

Update();

if(gKeyTime != 0)gKeyTime--;
if(gRecOverTime != 0)gRecOverTime--;
}

/********************************************************************************************************
** 函数名称: Update_Dis
** 功能描述: 更新显示缓存数据
** 输 入: gRecBuf[],
** 输 出:
** 全局变量: gDisData,gRecBuf[]
** 调用模块: get_crc(),
********************************************************************************************************/


void Update_Dis(uint8 *Point)
{
uint8 i;

if(!gDisData)return;

if(Point[0] != 0xaa)
{
gDisData = 0;
return;
}

gDisData = 0;
gUartCount = 0;

i = DIGIT -2;
get_crc(Point,i);
if(CRC == ((uint16 *)&Point[i])[0]) //校验正确
{
ET0 = 0; //更新数据时关定时器0中断
for(i = 0;i < DIGIT-3;i++)
{
gDisBuf[i]= Point[i+1]; //新数码数据放入缓存
}
ET0 = 1; //开定时器0中断
}

}



/***************************************************************************************************
** 函数名称: Decode
** 功能描述: 将接收的编码转换为液晶显示编码放入缓存数组中
** 输 入: 无
** 输 出:
*********************************************************************************************************/

void Decode(void)
{
uint8 a,b,i,temp[10];
for(i=0;i<10;i++)temp[i]=gDisBuf[i];
a=temp[0];
b=temp[1];
temp[0]=temp[4];
temp[1]=temp[3];
temp[3]=b;
temp[4]=a;

ET0=0;
for(i=0;i<5;i++)
{
switch(temp[i])
{
case 0x3f: //0
Dis_Buf[2*i+4]=Number_Tab[0][0];
Dis_Buf[2*i+5]=Number_Tab[0][1];
break;
case 0xbf: //0.
Dis_Buf[2*i+4]=Number_Tab[0][0]|Number_Tab[Char_Dot_Index][0];
Dis_Buf[2*i+5]=Number_Tab[0][1];
break;
case 0x06: //1
Dis_Buf[2*i+4]=Number_Tab[1][0];
Dis_Buf[2*i+5]=Number_Tab[1][1];
break;
case 0x86: //1.
Dis_Buf[2*i+4]=Number_Tab[1][0]|Number_Tab[Char_Dot_Index][0];
Dis_Buf[2*i+5]=Num

ber_Tab[1][1];
break;
case 0x5b: //2
Dis_Buf[2*i+4]=Number_Tab[2][0];
Dis_Buf[2*i+5]=Number_Tab[2][1];
break;
case 0xdb: //2.
Dis_Buf[2*i+4]=Number_Tab[2][0]|Number_Tab[Char_Dot_Index][0];
Dis_Buf[2*i+5]=Number_Tab[2][1];
break;
case 0x4f: //3
Dis_Buf[2*i+4]=Number_Tab[3][0];
Dis_Buf[2*i+5]=Number_Tab[3][1];
break;
case 0xcf: //3.
Dis_Buf[2*i+4]=Number_Tab[3][0]|Number_Tab[Char_Dot_Index][0];
Dis_Buf[2*i+5]=Number_Tab[3][1];
break;
case 0x66: //4
Dis_Buf[2*i+4]=Number_Tab[4][0];
Dis_Buf[2*i+5]=Number_Tab[4][1];
break;
case 0xe6: //4.
Dis_Buf[2*i+4]=Number_Tab[4][0]|Number_Tab[Char_Dot_Index][0];
Dis_Buf[2*i+5]=Number_Tab[4][1];
break;
case 0x6d: //5
Dis_Buf[2*i+4]=Number_Tab[5][0];
Dis_Buf[2*i+5]=Number_Tab[5][1];
break;
case 0xed: //5.
Dis_Buf[2*i+4]=Number_Tab[5][0]|Number_Tab[Char_Dot_Index][0];
Dis_Buf[2*i+5]=Number_Tab[5][1];
break;
case 0x7d: //6
Dis_Buf[2*i+4]=Number_Tab[6][0];
Dis_Buf[2*i+5]=Number_Tab[6][1];
break;
case 0xfd: //6.
Dis_Buf[2*i+4]=Number_Tab[6][0]|Number_Tab[Char_Dot_Index][0];
Dis_Buf[2*i+5]=Number_Tab[6][1];
break;
case 0x07: //7
Dis_Buf[2*i+4]=Number_Tab[7][0];
Dis_Buf[2*i+5]=Number_Tab[7][1];
break;
case 0x87: //7.
Dis_Buf[2*i+4]=Number_Tab[7][0]|Number_Tab[Char_Dot_Index][0];
Dis_Buf[2*i+5]=Number_Tab[7][1];
break;
case 0x7f: //8
Dis_Buf[2*i+4]=Number_Tab[8][0];
Dis_Buf[2*i+5]=Number_Tab[8][1];
break;
case 0xff: //8.
Dis_Buf[2*i+4]=Number_Tab[8][0]|Number_Tab[Char_Dot_Index][0];
Dis_Buf[2*i+5]=Number_Tab[8][1];
break;
case 0x6f: //9
Dis_Buf[2*i+4]=Number_Tab[9][0];
Dis_Buf[2*i+5]=Number_Tab[9][1];
break;
case 0xef: //9.
Dis_Buf[2*i+4]=Number_Tab[9][0]|Number_Tab[Char_Dot_Index][0];
Dis_Buf[2*i+5]=Number_Tab[9][1];
break;
case 0x77: //A
Dis_Buf[2*i+4]=Number_Tab[Char_A_Index][0];
Dis_Buf[2*i+5]=Number_Tab[Char_A_Index][1];
break;
case 0x7c: //b
Dis_Buf[2*i+4]=Number_Tab[Char_B_Index][0];
Dis_Buf[2*i+5]=Number_Tab[Char_B_Index][1];
break;
case 0x39: //C
Dis_Buf[2*i+4]=Number_Tab[Char_C_Index][0];
Dis_Buf[2*i+5]=Number_Tab[Char_C_Index][1];
break;
case 0x5e: //d
Dis_Buf[2*i+4]=Number_Tab[Char_D_Index][0];
Dis_Buf[2*i+5]=Number_Tab[Char_D_Index][1];
break;
case 0x79: //E
Dis_Buf[2*i+4]=Number_Tab[Char_E_Index][0];
Dis_Buf[2*i+5]=Number_Tab[Char_E_Index][1];
break;
case 0x71: //F
Dis_Buf[2*i+4]=Number_Tab[Char_F_Index][0];
Dis_Buf[

2*i+5]=Number_Tab[Char_F_Index][1];
break;
case 0x3d: //G
Dis_Buf[2*i+4]=Number_Tab[Char_G_Index][0];
Dis_Buf[2*i+5]=Number_Tab[Char_G_Index][1];
break;
case 0x76: //H
Dis_Buf[2*i+4]=Number_Tab[Char_H_Index][0];
Dis_Buf[2*i+5]=Number_Tab[Char_H_Index][1];
break;
case 0x38: //L
Dis_Buf[2*i+4]=Number_Tab[Char_L_Index][0];
Dis_Buf[2*i+5]=Number_Tab[Char_L_Index][1];
break;
case 0x73: //P
Dis_Buf[2*i+4]=Number_Tab[Char_P_Index][0];
Dis_Buf[2*i+5]=Number_Tab[Char_P_Index][1];
break;
case 0x3e: //U
Dis_Buf[2*i+4]=Number_Tab[Char_U_Index][0];
Dis_Buf[2*i+5]=Number_Tab[Char_U_Index][1];
break;
case 0x40: //-
Dis_Buf[2*i+4]=Number_Tab[Char_Ling_Index][0];
Dis_Buf[2*i+5]=Number_Tab[Char_Ling_Index][1];
break;
case 0x0f: //)
Dis_Buf[2*i+4]=Number_Tab[Char_Bracket_Index][0];
Dis_Buf[2*i+5]=Number_Tab[Char_Bracket_Index][1];
break;
case 0x37: //n
Dis_Buf[2*i+4]=Number_Tab[Char_N_Index][0];
Dis_Buf[2*i+5]=Number_Tab[Char_N_Index][1];
break;
case 0x31:
Dis_Buf[2*i+4]=Number_Tab[Char_T_Index][0]; //T
Dis_Buf[2*i+5]=Number_Tab[Char_T_Index][1];
break;
case 0x08: //下划线
Dis_Buf[2*i+4]=Number_Tab[Char_DownLing_Index][0];
Dis_Buf[2*i+5]=Number_Tab[Char_DownLing_Index][1];
break;
case 0x01: //上划线
Dis_Buf[2*i+4]=Number_Tab[Char_UpLing_Index][0];
Dis_Buf[2*i+5]=Number_Tab[Char_UpLing_Index][1];
break;
case 0x00: //
Dis_Buf[2*i+4]=0x00;
Dis_Buf[2*i+5]=0x00;
break;
}
}

switch(temp[5])
{
case 0x01:Dis_Buf[2]=0x08;break; //启动
case 0x80:Dis_Buf[15]=0x02;break; //通讯
case 0x00:
Dis_Buf[2]=0x00;
Dis_Buf[15]=0x00;
break;
case 0xff:
Dis_Buf[2]=0x0f;
Dis_Buf[15]=0x0f;
break;
}
switch(temp[7])
{
case 0x01:Dis_Buf[0]=0x01;break; //缺相
case 0x02:Dis_Buf[0]=0x02;break; //短路
case 0x04:Dis_Buf[0]=0x04;break; //堵转
case 0x06:Dis_Buf[0]=0x06;break; //短路、堵转
case 0x08:Dis_Buf[0]=0x08;break; //过载
case 0x0a:Dis_Buf[0]=0x0a;break; //短路、过载
case 0x10:Dis_Buf[1]=0x08;break; //失衡
case 0x11: //缺相、失衡
Dis_Buf[0]=0x01;
Dis_Buf[1]=0x08;
break;
case 0x20:Dis_Buf[1]=0x04;break; //漏电
case 0x30:Dis_Buf[1]=0x0c;break; //失衡、漏电
case 0x40:Dis_Buf[1]=0x02;break; //过压
case 0x80:Dis_Buf[1]=0x01;break; //欠压
case 0x00:
Dis_Buf[0]=0x00;
Dis_Buf[1]=0x00;
break;
case 0xff:
Dis_Buf[0]=0x0f;
Dis_Buf[1]=0x0f;
break;
}
switch(temp[8])
{
case 0x01:Dis_Buf[2]

|=0x01;break; //轻载
case 0x02:Dis_Buf[2]|=0x02;break; //反序
case 0x04:Dis_Buf[2]|=0x04;break; //过热
case 0x08:Dis_Buf[3]=0x01;break; //单位A
case 0x10:Dis_Buf[3]=0x02;break; //单位V
case 0x20:Dis_Buf[3]=0x04;break; //单位mA
case 0x40:Dis_Buf[3]=0x08;break; //单位kw
case 0x80: //单位kvar
Dis_Buf[3]=0x00;
Dis_Buf[4]|=0x08;
break;
case 0x00:
Dis_Buf[3]=0x00;
break;
case 0xff:
Dis_Buf[3]=0x0f;
Dis_Buf[4]=0x08;
break;
}
switch(temp[9])
{
case 0x02:
Dis_Buf[15]|=0x01; //单位Cos
Dis_Buf[14]=0x00;
break;
case 0x04:Dis_Buf[14]=0x01;break; //单位C
case 0x10:Dis_Buf[14]=0x02;break; //单位kwH
case 0x20:Dis_Buf[14]=0x04;break; //单位kvarH
case 0x40:Dis_Buf[14]=0x08;break; //单位Tt
case 0x00:
Dis_Buf[14]=0x00;
break;
case 0xff:Dis_Buf[14]=0x0f;break;
}
ET0=1;
return;
}


/********************************************************************************************************
** 函数名称: get_crc
** 功能描述: 计算校验码
** 输 入: *crcbuf,count
** 输 出:
** 全局变量: CRC
** 调用模块:
********************************************************************************************************/

void get_crc(uint8 *crcbuf,uint8 count)
{
uint8 i;
uint8 j;
CRC = 0XFFFF;
for(j=0;j{
CRC=CRC ^ crcbuf[j];
for(i=0;i<8;i++)
{
if(CRC&1)
{
CRC >>= 1;
CRC ^=0xa001;
}
else CRC >>= 1 ;
}
}
}



/*********************************************************************************************************
** 函数名称: Key2Msg
** 功能描述: 按键值转换为按键消息
** 输 入: Key:按键值
** 输 出: 按键消息
*********************************************************************************************************/

MSG Key2Msg(uint8 Key)
{
if (Key == 0x01) return KEY_SET; //K1 0001
else if (Key == 0x02) return KEY_ENTER; //K2 0010
else if (Key == 0x04) return KEY_UP; //K3 0100
else if (Key == 0x08) return KEY_DOWN; //K4 1000
else return NOT_KEY;
}



/*********************************************************************************************************
** 函数名称: Key_Read
** 功能描述: 键盘读
** 输 入: 无
** 输 出: 按键消息
*********************************************************************************************************/

MSG Key_Read(void)
{
uint8 Tmp;

Tmp = 0;
if(Key1 == 0 ) Tmp|= 0x01 ; //Tmp 为1表示按下了“设置键 ”
if(Key2 == 0 ) Tmp|= 0x02 ;
if(Key3 == 0 ) Tmp|= 0x04 ;
if(Key4 == 0 ) Tmp|= 0x08 ;

if(Tmp

!= 0)return Key2Msg(Tmp);
return NOT_KEY; //返回无按键消息
}


/*********************************************************************************************************
** 函数名称: Uart_IRQ
** 功能描述: 串口中断处理函数
** 输 入: 无
** 输 出:
*********************************************************************************************************/

void Uart_IRQ(void) interrupt IRQ_UART
{
if(TI)
{
TI = 0;
if(gSendNumber > 0)
{
gSendNumber--;
SBUF = gUartBuf[gSendCount] ;
gSendCount++;
}
else
{
Rs485_DirR();
gSendCount = 0;
}
return;
}
if(RI)
{
RI = 0;
gRecOverTime = 4;
if(gUartCount == 0)
{
if(SBUF == 0xaa||SBUF == gAddr)
{
gRec = 1;
}
else return;
}
if(gUartCount < DIGIT)
{
gUartBuf[gUartCount] = SBUF;
gUartCount++;
}
return;
}
}


/*********************************************************************************************************
** 函数名称: Com_Read_Key(void)
** 功能描述: 键盘应答处理函数
** 输 入:
** 输 出:
*********************************************************************************************************/

void Com_Read_Key(void)
{
if(!gGetKey)return;
gGetKey = 0;
get_crc(gUartBuf,4);

gUartCount = 0;

if(((uint8 *)&CRC)[0] != gUartBuf[5]) //校验是否正确
if(((uint8 *)&CRC)[1] != gUartBuf[4])
return;
if(gUartBuf[1] != 0x04)return;
Rs485_DirT(); //准备发送数据
gUartBuf[0] = gAddr;
gUartBuf[1] = 2;
gUartBuf[2] = ~gKeyValue;
gUartBuf[3] = gKeyValue;
get_crc(gUartBuf,4);
gUartBuf[4] = ((uint8 *)&CRC)[1];
gUartBuf[5] = ((uint8 *)&CRC)[0];
gSendNumber = 5;
gSendCount = 1;
SBUF = gUartBuf[0];
gKeyValue = 0;
gKeyTime = 50;
}

/********************************************************************************************************
** 函数名称: Version
** 功能描述: 显示程序版本号
** 输 入:
** 输 出:
********************************************************************************************************/

void Version()
{
uint8 i,num;
uint16 temp;
temp=VER;
for(i=0;i<7;i+=2)
{
num=temp%10;
temp=temp/10;
Dis_Buf[i+4]=Number_Tab[num][0];
Dis_Buf[i+5]=Number_Tab[num][1];

if(i==6)
{
Dis_Buf[i+4]|=Number_Tab[Char_Dot_Index][0];
Dis_Buf[i+5]|=Number_Tab[Char_Dot_Index][1];
}
}
Dis_Buf[12]=Number_Tab[Char_U_Index][0];
Dis_Buf[13]=Number_Tab[Char_U_Index][1];

Ht1621WrAllData(0,Ht1621Clear,16);
Ht1621WrAllData(0,Dis_Buf,16);
}

void Delay(int x)
{
int a,b,c;
for(a=0;a{
for(b=0;b<100;b++)
{
for(c=0;c<100;c++);
}
}
}





/******************************************************************************************

*************/


void main (void)
{
Sys_Init(); //初始化

Version(); //显示版本号
Delay(10);

while(1)
{
if(MODE)gAddr = MASTER;
else gAddr = SLAVE;

if(gKeyTime == 0&&gSendCount == 0) //键值处理时间到
{
if(gKeyValue == 0)gKeyValue = Key_Read(); //键值处理
gKeyTime = 12; //键值处理定时器付值20ms
}

if(gRec) //特别注意:先判是否在接受中,超时先判断通信质量不行
{
if(gRecOverTime == 0)
{
gRec = 0;
if(gUartBuf[0] == 0xaa)gDisData = 1;
else if(gUartBuf[0] == gAddr)gGetKey = 1;
else gUartCount = 0;
}
}
Com_Read_Key();
if(gDisData==1)
{
Update_Dis(gUartBuf); //更新串口接收缓冲数据
Decode(); //将接收到的数据转码放入显示缓存数组
}
WDT_CONTR = 0x3B;
}
}





/************************************************************************************************
*
* HT1621驱动程序
*
************************************************************************************************/

#include "STC12C5612AD.H"
#include "intrins.h"
#include "ht1621.h"

#define BIAS2 0X40 // 1/2偏压
#define BIAS3 0X42 // 1/3偏压
#define COMNUM2 0X00 //2个COM
#define COMNUM3 0X08 //3个COM
#define COMNUM4 0X10 //4个COM
//选择LCD模式
#define BIAS BIAS3|COMNUM4 //0x52 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 禁止看门狗

sbit HT1621_CS =P2^7;
sbit HT1621_RD =P2^6;
sbit HT1621_WR =P2^5;
sbit HT1621_DAT =P2^4;

void _Nop(void)
{
_nop_();_nop_();_nop_();_nop_();
// _nop_();_nop_();_nop_();_nop_();
// _nop_();_nop_();_nop_();_nop_();
// _nop_();_nop_();_nop_();_nop_();

}
//delay ms
void DelayMS(uint16 iMs)
{
uint16 i,j;

for(i=0;ifor(j=0;j<100;j++) ;
}

//*************************************
// 函数名称:Ht1621Wr_Data
// 函数功能:1621写数据
// 入口参数:要写的数据 从高位写起
// 出口参数:无
//***************************************


void Ht1621Wr_Data(uint8 Data,uint8 cnt)


{
uint8 i;
i=cnt;
do
{
HT1621_WR=0;
_Nop();
Data<<=1;
HT1621_DAT=CY;
_Nop();
HT1621_WR=1;
_Nop();
i--;
}while(i!=0);
/*
for(i=0;i{
HT1621_WR=0;
_Nop();
if((Data&0x80)==0)
{
HT1621_DAT=0;
}
else
{
HT1621_DAT=1;
}
_Nop();
HT1621_WR=1;
_Nop();
Data<<=1;
}
*/
}

//*************************************
// 函数名称:Ht1621WrCmd
// 函数功能:1621写命令
// 入口参数:要写的数据
// 出口参数:无
//***************************************
void Ht1621WrCmd(uint8 Cmd)
{
HT1621_CS=0;
_Nop();
Ht1621Wr_Data(0x80,4); //写入命令标志100
Ht1621Wr_Data(Cmd,8); //写入命令数据
HT1621_CS=1;
_Nop();
}


//*************************************
// 函数名称:Ht1621WrByte
// 函数功能:1621一字节数据
// 入口参数:数据的地址 数据
// 出口参数:无
//***************************************

void Ht1621WrByte(uint8 Addr,uint8 Data)
{
HT1621_CS=0;
_Nop();
Ht1621Wr_Data(0xa0,3); //写入数据标志101 3bit
Ht1621Wr_Data(Addr<<2,6); //写入地址数据 6bit
Ht1621Wr_Data(Data<<4,4); //写入数据 4bit
HT1621_CS=1;
_Nop();

// SendBit_1621(sdata,8); //写入data 的8位
}


//*************************************
// 函数名称:Ht1621WrAllData
// 函数功能:1621写所有的数据
// 入口参数:地址 数据 数据个数
// 出口参数:无
//***************************************

void Ht1621WrAllData(uint8 Addr,uint8 *p,uint8 DatLong)
{
uint8 i;
uint8 Tmp=0,Dat=0;

HT1621_CS=0;
Ht1621Wr_Data(0xa0,3); //写入数据标志101
Ht1621Wr_Data(Addr<<2,6); //写入地址数据
for (i=DatLong;i>0;i--)
{
Tmp = (*p) ;
Dat=0; //++
if(Tmp&0x01)Dat|=0x08 ;
if(Tmp&0x02)Dat|=0x04 ;
if(Tmp&0x04)Dat|=0x02 ;
if(Tmp&0x08)Dat|=0x01 ;

Ht1621Wr_Data(Dat<<4,4); //写入数据
p++;
}
HT1621_CS=1;
_Nop();
}


//*************************************
// 函数名称:Ht1621_Init
// 函数功能:1621初始化
// 入口参数:无
// 出口参数:无
//***************************************

void Ht1621_Init(void)
{
HT1621_CS=1;
HT1621_WR=1;
HT1621_DAT=1;
DelayMS(50); //延时使LCD工作电压稳定
Ht1621WrCmd(BIAS);

//设置BASE COM
Ht1621WrCmd(RC256); //使用内部振荡器
Ht1621WrCmd(SYSDIS); //关闭系统振荡器和LCD偏压发生器
Ht1621WrCmd(WDTDIS); //禁止看门狗定时器
Ht1621WrCmd(SYSEN); //开系统振荡器
Ht1621WrCmd(LCDON); //开LCD偏压发生器
DelayMS(50); //延时一段时间

}

相关文档
最新文档