/*-------------------------------------------

程序名称：LCD软件驱动程序
日期版本：2018/6/15 <V1.1>

备注：

*本程序由 中微半导体有限公司 &应用支持部& 编写整理
*公司网址 www.mcu.com.cn
*技术支持QQ 3001082102  罗工
            3001085706	陈工
-------------------------------------------*/

#include <cms.h>
#include "LCD_Software_Demo.h"


//---------------------------------------
//测试示例
bit B_MainLoop;

void main(void)
{
	asm("nop");
	asm("clrwdt");
	
	OSCCON = 0x71;			//8M内部时钟
	INTCON = 0;

	PIR1 = 0;
	PIE1 = 0;
	PIR2 = 0;
	PIE2 = 0;
	
	/*初始化定时器2, 125us中断*/
	PR2 = 250;
	T2CON = 4;
	TMR2IE = 1;
	
	INTCON = 0XC0;			//全局中断使能
	
	TRISA = 0B00000000;		//用户需要自行设置SEG口输出态
	while(1)
	{
		if(B_MainLoop)
		{
			B_MainLoop = 0;
			asm("clrwdt");
			
			DispData[0] = 0B00010001;			
			DispData[1] = 0B00010001;			
			DispData[2] = 0B00010001;	
			DispData[3] = 0B00010001;
			
			Display_LCD();				//LCD显示程序
		}
	}
}


void interrupt Timer_Isr()
{
	static unsigned char tcount = 0;
	if(TMR2IF)
	{
		TMR2IF = 0;
		if(++tcount >= 20)			
		{
			tcount = 0;				
			B_MainLoop = 1;
		}
	}
}


/***********************************************
函数名称：Display_LCD
函数功能：LCD显示控制程序
入口参数：无
出口参数：无
备注：
************************************************/
void Display_LCD()
{
	BSET(C_LCD_COM,0);	//COM0
	BSET(C_LCD_COM,1);	//COM1
	BSET(C_LCD_COM,2);	//COM2
	BSET(C_LCD_COM,3);	//COM3

	LEDCON0 = 0B10000000;				//使能LCD模块
	LEDCON1 = LCD_CUR;					//设置LCD输出电流				
	TRISC = C_LCD_COM;					//先将相应的COM口置为输入态
	COMEN = C_LCD_COM;
	
	if(Dcount & 0x01)					//先将所有显示关闭
	{
		SEGA = 1;
		SEGB = 1;
		SEGC = 1;
		SEGD = 1;
		SEGE = 1;
		SEGF = 1;												
		SEGG = 1;
		SEGDP = 1;
	}
	else
	{
		SEGA = 0;
		SEGB = 0;
		SEGC = 0;
		SEGD = 0;
		SEGE = 0;
		SEGF = 0;												
		SEGG = 0;
		SEGDP = 0;	
	}	
	
	
	//循环点亮各个COM口
	switch(Dcount)	
	{
		case 0:
			COM0 = 0;
			COMEN = 0B00001110;		//使能对应COM口为LCD功能口
			TRISC = 0B00001110;		//设置COM0为输出态
			COM0 = 0;
			
			if(DispData[0] & 0x01)	{SEGA = 1;}
			if(DispData[0] & 0x02)	{SEGB = 1;}
			if(DispData[0] & 0x04)	{SEGC = 1;}
			if(DispData[0] & 0x08)	{SEGD = 1;}
			if(DispData[0] & 0x10)	{SEGE = 1;}
			if(DispData[0] & 0x20)	{SEGF = 1;}
			if(DispData[0] & 0x40)	{SEGG = 1;}
			if(DispData[0] & 0x80)	{SEGDP = 1;}
			break;
		case 1:
			COM0 = 1;
			COMEN = 0B00001110;		//使能对应COM口为LCD功能口
			TRISC = 0B00001110;		//设置COM0为输出态
			COM0 = 1;
			
			if(DispData[0] & 0x01)	{SEGA = 0;}
			if(DispData[0] & 0x02)	{SEGB = 0;}
			if(DispData[0] & 0x04)	{SEGC = 0;}
			if(DispData[0] & 0x08)	{SEGD = 0;}
			if(DispData[0] & 0x10)	{SEGE = 0;}
			if(DispData[0] & 0x20)	{SEGF = 0;}
			if(DispData[0] & 0x40)	{SEGG = 0;}
			if(DispData[0] & 0x80)	{SEGDP = 0;}																		 
			break;
		case 2:
			COM1 = 0;
			COMEN = 0B00001101;		//使能对应COM口为LCD功能口
			TRISC = 0B00001101;		//设置COM1为输出态
			COM1 = 0;
			
			if(DispData[1] & 0x01)	{SEGA = 1;}
			if(DispData[1] & 0x02)	{SEGB = 1;}
			if(DispData[1] & 0x04)	{SEGC = 1;}
			if(DispData[1] & 0x08)	{SEGD = 1;}
			if(DispData[1] & 0x10)	{SEGE = 1;}
			if(DispData[1] & 0x20)	{SEGF = 1;}
			if(DispData[1] & 0x40)	{SEGG = 1;}
			if(DispData[1] & 0x80)	{SEGDP = 1;}																			 
			break;
		case 3:
			COM1 = 1;
			COMEN = 0B00001101;		//使能对应COM口为LCD功能口
			TRISC = 0B00001101;		//设置COM1为输出态
			COM1 = 1;
			
			if(DispData[1] & 0x01)	{SEGA = 0;}
			if(DispData[1] & 0x02)	{SEGB = 0;}
			if(DispData[1] & 0x04)	{SEGC = 0;}
			if(DispData[1] & 0x08)	{SEGD = 0;}
			if(DispData[1] & 0x10)	{SEGE = 0;}
			if(DispData[1] & 0x20)	{SEGF = 0;}
			if(DispData[1] & 0x40)	{SEGG = 0;}
			if(DispData[1] & 0x80)	{SEGDP = 0;}																			 
			break;
		case 4:
			COM2 = 0;
			COMEN = 0B00001011;		//使能对应COM口为LCD功能口
			TRISC = 0B00001011;		//设置COM2为输出态
			COM2 = 0;
			
			if(DispData[2] & 0x01)	{SEGA = 1;}
			if(DispData[2] & 0x02)	{SEGB = 1;}
			if(DispData[2] & 0x04)	{SEGC = 1;}
			if(DispData[2] & 0x08)	{SEGD = 1;}
			if(DispData[2] & 0x10)	{SEGE = 1;}
			if(DispData[2] & 0x20)	{SEGF = 1;}
			if(DispData[2] & 0x40)	{SEGG = 1;}
			if(DispData[2] & 0x80)	{SEGDP = 1;}																		 
			break;
		case 5:
			COM2 = 1;
			COMEN = 0B00001011;		//使能对应COM口为LCD功能口
			TRISC = 0B00001011;		//设置COM2为输出态
			COM2 = 1;
			
			if(DispData[2] & 0x01)	{SEGA = 0;}
			if(DispData[2] & 0x02)	{SEGB = 0;}
			if(DispData[2] & 0x04)	{SEGC = 0;}
			if(DispData[2] & 0x08)	{SEGD = 0;}
			if(DispData[2] & 0x10)	{SEGE = 0;}
			if(DispData[2] & 0x20)	{SEGF = 0;}
			if(DispData[2] & 0x40)	{SEGG = 0;}
			if(DispData[2] & 0x80)	{SEGDP = 0;}
			break;	
		case 6:
			COM3 = 0;
			COMEN = 0B00000111;		//使能对应COM口为LCD功能口
			TRISC = 0B00000111;		//设置COM3为输出态
			COM3 = 0;
			
			if(DispData[3] & 0x01)	{SEGA = 1;}
			if(DispData[3] & 0x02)	{SEGB = 1;}
			if(DispData[3] & 0x04)	{SEGC = 1;}
			if(DispData[3] & 0x08)	{SEGD = 1;}
			if(DispData[3] & 0x10)	{SEGE = 1;}
			if(DispData[3] & 0x20)	{SEGF = 1;}
			if(DispData[3] & 0x40)	{SEGG = 1;}
			if(DispData[3] & 0x80)	{SEGDP = 1;}
			break;
		default:
			COM3 = 1;
			COMEN = 0B00000111;		//使能对应COM口为LCD功能口
			TRISC = 0B00000111;		//设置COM3为输出态
			COM3 = 1;
			
			if(DispData[3] & 0x01)	{SEGA = 0;}
			if(DispData[3] & 0x02)	{SEGB = 0;}
			if(DispData[3] & 0x04)	{SEGC = 0;}
			if(DispData[3] & 0x08)	{SEGD = 0;}
			if(DispData[3] & 0x10)	{SEGE = 0;}
			if(DispData[3] & 0x20)	{SEGF = 0;}
			if(DispData[3] & 0x40)	{SEGG = 0;}
			if(DispData[3] & 0x80)	{SEGDP = 0;}	
			break;
	}
	
	if(++Dcount >= 8)
	{
		Dcount = 0;
	}
}