#include “HT66F0185.h”
unsigned char gc_FrameSts;
//============================================================================
//TM0中断
DEFINE_ISR (Interrupt_TM0, 0x0C)
{
_t0pf = 0; //进中断后,请清除中断标志
gc_FrameSts++;
switch(gc_FrameSts)
{
case 1:
//COM0
_pc5 = 0;//COM1---(1/3 VDD:Frame=0) or (2/3 VDD:Frame=1)
_pa1 = 0;//COM2---(1/3 VDD:Frame=0) or (2/3 VDD:Frame=1)
_pa3 = 0;//COM3---(1/3 VDD:Frame=0) or (2/3 VDD:Frame=1)
if(_frame)
{
_frame = 0;
}else{
_frame = 1;
}
_pc2 = 1;//COM0---(VDD:Frame=0) or (VSS:Frame=1)
//SEG--0不点亮,1点亮
_pc0 = 1;//SEG19---(2/3 VDD:Frame=0) or (1/3 VDD:Frame=1)
_pc1 = 1;//SEG20---(2/3 VDD:Frame=0) or (1/3 VDD:Frame=1)
_pa7 = 1;//SEG8
_pa6 = 1;//SEG9
_pa5 = 1;//SEG10
_pc1 = 1;//SEG12
_pc2 = 1;//SEG13
_pc4 = 1;//SEG15
break;
case 2:
//COM1
_pc2 = 0;//COM0---(1/3 VDD:Frame=0) or (2/3 VDD:Frame=1)
_pc5 = 1;//COM1---(VDD:Frame=0) or (VSS:Frame=1)
_pa1 = 0;//COM2---(1/3 VDD:Frame=0) or (2/3 VDD:Frame=1)
_pa3 = 0;//COM3---(1/3 VDD:Frame=0) or (2/3 VDD:Frame=1)
//SEG--0不点亮,1点亮
_pc0 = 1;//SEG19---(2/3 VDD:Frame=0) or (1/3 VDD:Frame=1)
_pc1 = 1;//SEG20---(2/3 VDD:Frame=0) or (1/3 VDD:Frame=1)
_pa7 = 1;//SEG8
_pa6 = 1;//SEG9
_pa5 = 1;//SEG10
_pc1 = 1;//SEG12
_pc2 = 1;//SEG13
_pc4 = 1;//SEG15
break;
case 3:
//COM2
_pc2 = 0;//COM0---(1/3 VDD:Frame=0) or (2/3 VDD:Frame=1)
_pc5 = 0;//COM1---(1/3 VDD:Frame=0) or (2/3 VDD:Frame=1)
_pa1 = 1;//COM2---(VDD:Frame=0) or (VSS:Frame=1)
_pa3 = 0;//COM3---(1/3 VDD:Frame=0) or (2/3 VDD:Frame=1)
//SEG--0不点亮,1点亮
_pc0 = 1;//SEG19---(2/3 VDD:Frame=0) or (1/3 VDD:Frame=1)
_pc1 = 1;//SEG20---(2/3 VDD:Frame=0) or (1/3 VDD:Frame=1)
_pa7 = 1;//SEG8
_pa6 = 1;//SEG9
_pa5 = 1;//SEG10
_pc1 = 1;//SEG12
_pc2 = 1;//SEG13
_pc4 = 1;//SEG15
break;
case 4:
//COM3
_pc2 = 0;//COM0---(1/3 VDD:Frame=0) or (2/3 VDD:Frame=1)
_pc5 = 0;//COM1---(1/3 VDD:Frame=0) or (2/3 VDD:Frame=1)
_pa1 = 0;//COM2---(1/3 VDD:Frame=0) or (2/3 VDD:Frame=1)
_pa3 = 1;//COM3---(VDD:Frame=0) or (VSS:Frame=1)
//SEG--0不点亮,1点亮
_pc0 = 1;//SEG19---(2/3 VDD:Frame=0) or (1/3 VDD:Frame=1)
_pc1 = 1;//SEG20---(2/3 VDD:Frame=0) or (1/3 VDD:Frame=1)
_pa7 = 1;//SEG8
_pa6 = 1;//SEG9
_pa5 = 1;//SEG10
_pc1 = 1;//SEG12
_pc2 = 1;//SEG13
_pc4 = 1;//SEG15
gc_FrameSts = 0;
break;
}
}
//=======================================================================================
//* brief : Initial STM PWM
//* param : None
//* retval: None
//=======================================================================================
void Init()
{
_wdtc = 0xAF;//关闭看门狗
//IO init
//_pac0 = 0;//PA0 output--PWM输出口
//_t0cp = 1;//TP0(PA0)引脚控制位使能
//设定PB0,PB1,PB2,PA4, PA5,PA6,PA7,PB3 作为IO口
_acerl = 0x00;//设定相关IO口不作为ADC输入口,缺省是ADC输入口
//设定PA3,PB6,PB5作为IO口
_csel = 0;//设定比较器引脚作为IO口,缺省是比较器引脚
_cos = 1;
//系统时钟
_smod = 0x01;//fsys = fH bit0 = 1
//-------STM init-------
//计数器和比较器
_tm0al = 0x00;//占空比设定
_tm0ah = 0x7F;//占空比设定
_tm0dl = 0x00;
_tm0dh = 0x00;
_tm0rp = 0xFF;//周期设定, 8位,与_tm0dh比较
_tm0c1 = 0xC0;//设定定时模式,CCRP - 周期;CCRA - 占空比
_tm0c0 = 0x18;//启动timer0, 计数时钟选择fsys
_t0pe = 1;//TM0比较器p中断使能
_mf0e = 1;//多功能中断0控制位使能
_emi = 1;//总中断使能
gc_FrameSts = 0;
}
//============================================================================
//以HT66F0185为例设定驱动,步骤如下
//1、设定共用引脚是COM还是SEG(COMSEGS5-----COMSEGS0)
//2、使能LCDEN
//3、设定与LCD共用的IO口为输出功能
//4、设定frame是0还是1
//5、根据波形图,设定PXn输出0还是输出1(比如COM0与PC2共用,则_pc2=0或1)
//FRAME LCDEN COMnEN IO output
//0 1 1 0 (1/3) * VDD
//0 1 1 1 VDD
//0 1 0 0 VSS
//0 1 0 1 VDD
//1 1 1 0 (2/3) * VDD
//1 1 1 1 VSS
//1 1 0 0 VSS
//1 1 0 1 VDD
//FRAME LCDEN SEGnEN IO output
//0 1 1 0 (2/3) * VDD
//0 1 1 1 VSS
//0 1 0 0 VSS
//0 1 0 1 VDD
//1 1 1 0 (1/3) * VDD
//1 1 1 1 VDD
//1 1 0 0 VSS
//1 1 0 1 VDD
//============================================================================
void LCD_Init()
{
//设定COM0–3
_pcc2 = 0;//PC2 output enable—COM0
_pcc5 = 0;//PC5 output enable—COM1
_pac1 = 0;//PA1 output enable—COM2
_pac3 = 0;//PA3 output enable—COM3
_comsegs0 = 0;//select com0
_com0en = 1;//enable com0
_comsegs1 = 0;//select com1
_com1en = 1;//enable com1
_comsegs2 = 0;//select com2
_com2en = 1;//enable com2
_comsegs3 = 0;//select com3
_com3en = 1;//enable com3
//设定SEG
_pcc0 = 0;//Pc0 output enable---SEG19
_pcc1 = 0;//Pc1 output enable---SEG20
_pac7 = 0;//PA7 output enable---SEG8
_pac6 = 0;//PA6 output enable---SEG9
_pac5 = 0;//PA5 output enable---SEG10
_pdc1 = 0;//PD1 output enable---SEG12
_pdc2 = 0;//PD2 output enable---SEG13
_pac4 = 0;//PA4 output enable---SEG15
_seg19en = 1;//enable SEG19
_seg20en = 1;//enable SEG20
_seg8en = 1;//enable SEG9
_seg9en = 1;//enable SEG9
_seg10en = 1;//enable SEG10
_seg12en = 1;//enable SEG12
_seg13en = 1;//enable SEG13
_seg15en = 1;//enable SEG15
_lcden = 1;//LCD enable
_frame = 0;//frame = 0
}
//============================================================================
void main()
{
_wdtc = 0xA8;//关闭看门狗,缺省是开的,如果不清看门狗会引起复位
Init();
LCD_Init();
while(1)
{
_nop();
}
}