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

📄 main.c.bak

📁 一个以前开发的实际应用的交通灯控制器程序
💻 BAK
字号:
// korfi: [3/7/2007]   
// korfi [3/17/2007]:Version 2.0, I want it to be the foudation software of this product.
//2007-3-21 9:48
//2007-4-2 20:41 一个好的程序结构是很重要的
//各司其职,合理重用
#include "iic.h"

#define REALTIME_H	0x0c//0.05s T2,自动重装
#define REALTIME_L	0x00

void main()
{
	//unsigned int xdata lt;//,lt2;
	//unsigned char xdata k;
	EA=0;
////////////默认输出/////////////
	{
	OUT0=0x24^0xff;
	OUT1=0x55^0xff;
	OUT2=0x24^0xff;
	OUT3=0x24^0xff;
	OUT4=0x55^0xff;
	OUT5=0x24^0xff;
	OUT6=0xff^0xff;
	}
/////////////CPU配置/////////////
	{
//INT0
	//IT0=0;//边沿触发
	//EX0=0;//外中断0
//UART
	TMOD=0x20;//+0x01;
	TR1=1;//TF1=0;
	TH1=0xfa;TL1=0xfa;////N=256-fosc/(32*12*fBd),fBd=4800,N=256-6
	PCON=0x00;
	SCON=0x50;//
	RI=0;TI=0;
	PS=1;//提高优先级
	REN=1;//允许接收
	TxEN=0;//
	ES=0;//暂时先不开通
//PS2
	PS2_Init();
//T2:T=(65536-x)*12/fosc,x=65536-T*fosc/12
	T2MOD=0x00;	//50ms	max=71.1ms
	RCAP2H=0x4c;//0x4c		0x00
	RCAP2L=0x00;//0x00		0x00
	TR2=1;
	ET2=1;	
//
	EA=1;
	}
/////////////启动装载////////////
	{
//设置载入
	MacAddr=EPR_Read(ADDR_MAC);
	LcdPowerOn();
	LcdInit();
//
	k=EPR_Read(ADDR_FIRST_USED);
	if(k==0xff||__KF_DEBUG__)//korfi:使用这里来确定调试是否
	{//第一次使用
		while(!__KF_DEBUG__)
		{
			WDT=1;
			LcdCnString(1,1,"初次使用");
			LcdCnString(2,1,"输入密码");
			GetPassWord(3,2);
			if(AppBuf[0]==12)&&(AppBuf[1]==34))
			{
				PswCnt=SYS_AUTO_LOCK_TIME;
				break;
			}
		}
		if(!__KF_DEBUG__)
			EPR_Write(ADDR_FIRST_USED,0xaa);
		//初始化所有信息
		LcdCnString(1,3,"初始化");
		RTC_FirstInit();//RTC
		//EEPROM
		EPR_Reset();
	}
	else
	{
		RTC_GeneralInit();
	}
	}
/////////////启动延时////////////
	{ 	
	LcdCnString(1,2,"启动延时");
	KeyVal=5;//借用一下变量
	while(KeyVal)
	{
		if(SecondFlag)
		{
			KeyVal-=1;
			SecondFlag=0;
		}
	}
	}
/////////////监视模块/////////////	
	DeskTopFlag=1;
	LcdInit();
	ShowDesk();//显示桌面
	HourUpdate();
	while(1)
	{
		/////按键
		KeyVal=GetKey();
		if ((KeyVal!=KEY_NOKEY)) 
		{//按键监视
			AutoLockCnt=SYS_LCD_OFF_TIME;
			if(!LcdPowerFlag)//掉电则先上电
				LcdPowerOn();
			switch(KeyVal) 
			{
				case KEY_ENTER:
					if((!DeskTopFlag)&&(!PswLock))
						OnEnter();
					break;
				case KEY_UP:
				case KEY_LEFT:
					if((!DeskTopFlag)&&(!PswLock))
						OnArrowUp();
					break;
				case KEY_DOWN:
				case KEY_RIGHT:
					if((!DeskTopFlag)&&(!PswLock))
						OnArrowDown();
					break;
				case KEY_BKSPACE:
				case KEY_CANCEL:
					if((!DeskTopFlag)&&(!PswLock))
						OnCancel();
					break;
				case KEY_MENU:
					OnMenuKey();
				default:
					;
			}
		}

		if (NewPackage)
		{//接收到通讯新包
			CmdProcess(); 
			NewPackage=0;
		}
		
		if(SecondFlag)
		{//每秒响应一次
			{//自动键盘锁定监视
			if(AutoLockCnt>0)
				AutoLockCnt-=1;
			if((!PswLock)&&(AutoLockCnt<(SYS_LCD_OFF_TIME-SYS_AUTO_LOCK_TIME)))
			{//自动锁定
				PswLock=1;
				DeskTopFlag=1;
			}
			if((LcdPowerFlag)&&(AutoLockCnt==0))
			{//Lcd断电
				LcdPowerOff();
				LcdPowerFlag=0;//掉电
			}
			}
			
			if(DeskTopFlag && LcdPowerFlag)
				ShowDesk();
			SecondCheck();//状态切换

			if(SwitchFlag)
			{//是否需要更新EEPROM
				if(EPRChangeFlag)
				{
					EPR_CopyPage();//只能在主循环中出现拷贝现象
					HourUpdate();//重新搜索相组关系
					PhaseSwitch();//重新装入相位属性
					EPRChangeFlag=0;
				}
				SwitchFlag=0;
			}
			
			SecondFlag=0;
		}
	}
}

/////////////////中断服务///////////
//UART_ISR()在UART.c中
//PS2_RecChar()在PS2.c中

void Timer2() interrupt INT_SOURCE_T2
{
//自动重装计时:50ms
	if(RealTimeCnt>1)
		RealTimeCnt--;
	else
	{
		RealTimeCnt=20;
		SecondFlag=1;
	}
	
	if(DelayCnt)//延时用的变量
		DelayCnt--;
}

⌨️ 快捷键说明

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