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

📄 main.c

📁 电话单路计费系统!LCD段码显示!电话机设定自由费率,根据反极信号计费及延时计费自由设定!
💻 C
字号:
#include <reg2051.h>
#include "1621_driver.h"
#include "tel_equipment.h"
#include "AT24C08PAGE_Ok.H"

bit scankey_bit;
bit KeyACT;
bit set_sign;

bit status3;
bit lift_bit;			//提机标志
bit time1s;
bit polarity_bit;
bit scankey_bit;
bit Showbit;
bit LineType;

uchar KeyTemp;
uchar p[10];
uchar key[20];
uchar nkey;
uchar timetype;
ulong times;
ulong times2;
uchar times3;


uchar code keycode[] = {
//0		1	 2	  3	   4	5	 6 	  7    8	9	 a	  b	   c	d	 e	  f
0x00,0x08,0x04,0x0c,0x02,0x00,0x06,0x0e,0x01,0x09,0x05,0x0d,0x03,0x0b,0x07,0x00
};
main(){
	Led1 = 0;
	Led2 = 0;
	init();
	SETUP_LCD();
	Led1 = 1;
	Led2 = 1;
	
	while(1){
		if(lift_bit){
			status3 = status1;
			ClrLCD();
			times3 = 0;
		} 	

		while (lift_bit){
			scankey_bit = 1;
			getkey();
			set_menu();
			if (polarity_bit & !set_sign)
				showmoney(ShowCountTime(times));
		 	
		}
		showtime();
		clrbuf();
	}

}
void getkey(void) {
	STD = 1;
	if (STD){
		KeyTemp = keybord /0x10;
 		KeyTemp = keycode[KeyTemp];

		key[nkey] = KeyTemp;
		
		if ((KeyTemp  == 0x0b) && (nkey == 0) )
			set_sign = 1; 	
	
		while (STD);
		times3 = 0;
		KeyACT = 1;
		if((KeyTemp == 0x0c)&& !LineType)
			polarity_bit = 1;
		if(nkey < 20)nkey++;	   		//防止ram数据存储溢出
		ShowLCD(0,0,&key[nkey-1],nkey);
	}
}

//#pragma OPTIMIZE(6,speed) //the funcion以9极优化,空间压缩为主
void clrbuf(){
uchar i;
	polarity_bit = 0;
	scankey_bit = 0;
	set_sign = 0;
	nkey = 0;
	Led2 = 1;
	Led1 = 1;
	for (i=0;i<20;i++)
		key[i] = 0x00;
	for (i=0;i<10;i++)
		p[i] = 0x00;

}
/*
设定长途计费单位		00	(<60 ,>0;)
设定长途计费方式:(N+1) 	01
设定长途N费率			02
设定长途N后费率			03

设定短途计费单位		04
设定短途计费方式		05
设定短途N费率			06
设定短途N后费率			07

设定国际计费单位		08
设定国际单位计费费率	09
*#0000#-01#-

设定长途N费率			0x10
设定短途N费率			0x11
设定国际单位计费费率	0x12

#define changtu_unit		0
#define changtu_N			1
#define changtu_feilu_N		2
#define changtu_feilu		3
#define duantu_unit			4
#define duantu_N			5
#define	duantu_feilu_N		6
#define duantu_feilu		7
#define guojiunit			8
#define guoji_feilu			9
#define password			0x10
*/
void set_menu(void){
static uchar count;
	if (!KeyACT)return;
	if (!set_sign) return;
	if (nkey == 1) count = 0;
	KeyACT = 0;
	switch (count){
	case 0x00:
		if (KeyTemp==0x0b)
			count++;
		else {
			count = 0xff;
			showerror();
			}
		break;
	case 0x01:
		if (KeyTemp == 0x0c)
			count++;
		else {
			count = 0xff;
			showerror();
		}
		break;
	case 0x02:case 0x03:case 0x04:case 0x05:
		key[count-2] = KeyTemp;
		count ++;
		break;
	case 0x06:
		if(KeyTemp != 0x0c){count =0xff;showerror();break;};
		EEReadPage 	(&p[0], 0, password, 4);
		if (key[0] != p[0]){count =0xff;showerror();break;} 
		if (key[1] != p[1]){count =0xff;showerror();break;} 
		if (key[2] != p[2]){count =0xff;showerror();break;} 
		if (key[3] != p[3]){count =0xff;showerror();break;} 
		showsucceed();
		count++;
		break;

	case 0x07:
		count ++;
		key[0] = KeyTemp;
		break;

	case 0x08:
		if (KeyTemp != 0x0c){count =0xff;showerror();break;}
		switch(key[0]){
	
			case 0x01:
				count = changtu_N;
				showsucceed();
			break;
			case 0x02:
				count = duantu_N;
				showsucceed();
			break;
			case 0x03:
				count = guoji_N;
				showsucceed();
			break;
			case 0x04:
				count = password;
				showsucceed();
			break;
			case 0x05:
				count = modifytime;
				showsucceed();
			break;
			case 0x06:
				count = linetype;
				showsucceed();
			break;
		}
		break;
/*
设定长途费率
*/
	case changtu_N:
		key[0] = KeyTemp;
		count++;
		break;
	case changtu_N+1:
		key[1] = KeyTemp;
		count++;
		break;
	case changtu_N+2:
		key[2] = KeyTemp;
		count++;
		break;
	case changtu_N+3:
		key[3] = KeyTemp;
		count++;
		break;
	case changtu_N+4:
		if(KeyTemp != 0x0c){count =0xff;showerror();break;};
		EEWritePage(&key[0],0,changtu_N,4);
		DELAY(0xff);
		EEReadPage(&p[0],0,changtu_N,4);
		if(key[0] != p[0]){count =0xff;showerror();break;};
		if(key[3] != p[3]){count =0xff;showerror();break;};
		showsucceed();
		break;

/*
设定短途费率
*/
	case duantu_N:
		key[0] = KeyTemp;
		count++;
		break;
	case duantu_N+1:
		key[1] = KeyTemp;
		count++;
		break;
	case duantu_N+2:
		key[2] = KeyTemp;
		count++;
		break;
	case duantu_N+3:
		key[3] = KeyTemp;
		count++;
		break;
	case duantu_N+4:
		if(KeyTemp != 0x0c){count =0xff;showerror();break;};
		EEWritePage(&key[0],0,duantu_N,4);
		DELAY(0xff);
		EEReadPage(&p[0],0,duantu_N,4);
		if(key[0] != p[0]){count =0xff;showerror();break;};
		if(key[4] != p[4]){count =0xff;showerror();break;};
		showsucceed();
		break;

/*
设定国际费率
*/
	case guoji_N:
		key[0] = KeyTemp;
		count++;
		break;
	case guoji_N+1:
		key[1] = KeyTemp;
		count++;
		break;
	case guoji_N+2:
		key[2] = KeyTemp;
		count++;
		break;
	case guoji_N+3:
		key[3] = KeyTemp;
		count++;
		break;
	case guoji_N+4:
		if(KeyTemp != 0x0c){count =0xff;showerror();break;};
		EEWritePage(&key[0],0,guoji_N,4);
		DELAY(0xff);
		EEReadPage(&p[0],0,guoji_N,4);
		if(key[0] != p[0]){count =0xff;showerror();break;};
		if(key[3] != p[3]){count =0xff;showerror();break;};
		showsucceed();
		break;
/*
设定密码
*/
	case password:
		key[0] = KeyTemp;
		count++;
		break;
	case password+1:
		key[1] = KeyTemp;
		count++;
		break;
	case password+2:
		key[2] = KeyTemp;
		count++;
		break;
	case password+3:
		key[3] = KeyTemp;
		count++;
		break;
	case password+4:
		if(KeyTemp != 0x0c){count =0xff;showerror();break;};
		EEWritePage(&key[0],0,password,4);
		DELAY(0xff);
		EEReadPage(&p[0],0,password,4);
		if(key[0] != p[0]){count =0xff;showerror();break;};
		if(key[3] != p[3]){count =0xff;showerror();break;};
		showsucceed();
		break;
/*
设定线路类型!1为有反极!0为无反极
*/
	case linetype:
		key[0] = KeyTemp;
		count++;
		break;
	case linetype+1:
		if(KeyTemp != 0x0c){count =0xff;showerror();break;};
		EEWritePage(&key[0],0,linetype,1);
		DELAY(0xff);
		EEReadPage(&p[0],0,linetype,1);
		if(key[0] != p[0]){count =0xff;showerror();break;};
		showsucceed();
		LineType = key[0];
		break;
/*
修改时间
*/
	case modifytime:
		key[0] = KeyTemp;
		count++;
		break;
	case modifytime+1:
		key[1] = KeyTemp;
		count++;
		break;
	case modifytime+2:
		key[2] = KeyTemp;
		count++;
		break;
	case modifytime+3:
		key[3] = KeyTemp;
		count++;
		break;
	case modifytime+4:
		if(KeyTemp != 0x0c){count =0xff;showerror();break;};
		times  = key[0]*0x8ca0;
		times += key[1]*0xe10;
		times += key[2]*0x258;
		times += key[3]*0x3c;
		showtime();
		
		break;
	default:
		showerror();
		break;
	}
}
void showerror(void){
	Led2 = 0;
	DELAY(0XFF);
	Led2 = 1;
	DELAY(0XFF);
	Led2 = 0;
	DELAY(0XFF);
	Led2 = 1;
	DELAY(0XFF);
	Led2 = 0;
	DELAY(0XFF);
	Led2 = 1;
	DELAY(0XFF);
	Led2 = 0;
	DELAY(0XFF);
	Led2 = 1;
	DELAY(0XFF);
}
void showsucceed(void){
	Led1 = 0;
	DELAY(0X1FF);
	Led1 = 1;
}

⌨️ 快捷键说明

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