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

📄 key.c

📁 税控收款机源码:拼音输入法,LCD,VFD驱动,IC卡驱动,税控国标
💻 C
字号:
#include  "include.h"

#define TIMER0GAP  46080    //11.0592 =50ms 22.1184=25ms
uchar xdata g_key[8];      //按键值寄存数组
uchar xdata keydata[6];
uchar xdata key_f=0;       //数组头指针
uchar xdata key_s=0;       //数组尾指针

uchar data NO_Paperflg=0;

uchar s_key=0;                   //按键值寄存器
//uchar key_cnt=0;

sbit PWROFF=P3^2;
uchar data counter;
uchar swdata16311;

uchar key_flag=0;

code uchar keydatacode[65]={
	                     0,
						'U',     'H',        'B',       0,    '0',     '1',    '4',     '7',       'Y',
						'G',     'V',       BACK,   KEY00,    '2',     '5',    '8',     'T',       'F',     'C',
	                  CLEAR,     '.',        '3',     '6',    '9',     'R',    'D',     'X',        NS,   ENTER,
	                      0,       0,      TOTAL,     'E',    'S',     'Z',      0,     '+',       '-',     '*', 
	                    '/',     'W',        'A', BRANCH8, PAPER1,       0,      0,       0,         0,     'Q',
	                BRANCH4, BRANCH7, BACK_PAPER,       0,      0,       0,      0,    VOID,       TAB,  PAGEUP,
	               PAGEDOWN,       0,          0,       0,      0,

						};


/*
uchar _read_cpld(uint _addr)
{
	uchar result;
	PSD8xx_reg.PAGE|=0x40;
	result = XBYTE[_addr];
	PSD8xx_reg.PAGE&=0xbf;
	return result;
}*/


#pragma NOAREGS
void _read_key() //reentrant
{
	uchar data i,seg,row,x;

//	delayms(20);
	//if(_read_cpld(0x8110)!=0) //防抖动
	{
		seg = 0;
		x = 0;
		for(i=0;i<8;i++)
		{
			//row = (1<<i);
			if(i==0)
				row = 0x01;
			else if(i==1)
				row = 0x02;
			else if(i==2)
				row = 0x04;
			else if(i==3)
				row = 0x08;
			else if(i==4)
				row = 0x10;
			else if(i==5)
				row = 0x20;
			else if(i==6)
				row = 0x40;
			else if(i==7)
				row = 0x80;
			
			XBYTE[0x8100]=row;
			
			//_write_cpld(0x8100,row);
			
			PSD8xx_reg.PAGE|=0x40;
			seg = XBYTE[0x8110];
			PSD8xx_reg.PAGE&=0xbf;
			
			//seg = _read_cpld(0x8110);
			if(seg==0x01)
				seg = 1;
			else if(seg==0x02)
				seg = 2;
			else if(seg==0x04)
				seg = 3;
			else if(seg==0x08)
				seg = 4;
			else if(seg==0x10)
				seg = 5;
			else if(seg==0x20)
				seg = 6;
			else if(seg==0x40)
				seg = 7;
			else if(seg==0x80)
				seg = 8;
			else
				seg = 0;
			if(seg)
			{
				x = seg+8*i;
				if((x!=0)&&(x<65))
				{
				//	beep(15);
					beepcounter=1;
					beepflg=1;
					P1_1 = 0;  //buzz_on();
					backlightcnt=20;
				 	g_key[key_f]=x;
					key_f++;
					key_f&=0x07;
				}
				i=8;
				//break;
			}
		}
		XBYTE[0x8100]=0xff;
		//_write_cpld(0x8100,0xff);
	}
}
#pragma AREGS


/**********************************************
*函数名称:open_Nopaper_Printing_light(uchar a)
*输入参数:uchar a --- 1  装好纸
*                  --- 2  缺纸
*                  --- 3  打印指示灯亮
*                  --- 4  打印指示灯灭
*输出参数:void
**********************************************/
void open_Nopaper_Printing_light(uchar a)
{
	switch(a)
	{
	case 1:
		write_cpld_u6(Led2,0);
		break;
		
	case 2:
		write_cpld_u6(Led2,1);
		break;
		
	case 3:
		write_cpld_u6(Led1,1);
		break;
	case 4:	
		write_cpld_u6(Led1,0);
		break;
	default:	
		break;
	}
}
//======================================================================================

uchar get_key(void)
{
	uchar j;
	uchar keytemp;
	/*if(key_s!=key_f)   //头不等于尾有未处理的键
	{
		i=g_key[key_s];
		g_key[key_s]=0;
		key_s++;
		key_s=key_s&0x07;
	}
	else i=0;
	*/
//	_read_key();
	
	for(j=key_s;j<(8+key_s);j++)
	{
		keytemp=g_key[j&0x07];
		if(keytemp!=0)
		{
			g_key[j&0x07]=0;
			break;
		}
	}
	
	if((j==(8+key_s))||(keytemp>64))
		keytemp=0;
	else
		key_s=(j+1)&0x07;
		
//	return 	keytemp;
	return(keydatacode[keytemp]);
}


//====================================================================================
void InitSoftTimer(void)//ok
{
	uchar i;
	EA=0;
	TMOD=0x11;
	TH0=-(TIMER0GAP/256);       //1ms timer
	TL0=-(TIMER0GAP%256);
	
	TH1 = 0xfc;
	TL1 = 0x38;
	
	IT0=1;             //掉电检测  下降中断
	EX0=1;
	
	ET0=1;
	ET1=1;
	
	TR0=1;

	EA=1;
	
	IT1 = 1;  //外部中断1,设为边沿触发(下降沿)
	EX1 = 1;  //允许外部中断
	
	IP = 0x14; //外部中断1 和 串口中断为高优先级

	_write_cpld(0x8100,0xff);
	
	//FLASH复位
	Writ_cpld(Flash_rst,1);
	delayms(500);
	Writ_cpld(Flash_rst,0);
	delayms(500);
	Writ_cpld(Flash_rst,1);
	
	//钱箱复位
	write_cpld_u6(Cash,0);
	//卷纸器复位
	write_cpld_u6(Wind,1);
	
	PSD8xx_reg.PAGE|=0x40;
	XBYTE[0x8113]=0xff;
	PSD8xx_reg.PAGE&=0xbf;
	
	write_cpld_u6(V_modem,0);
	
	write_cpld_u6(V_MOTER,1);
	
	for(i=0;i<8;i++)
		g_key[i] = 0;
}



void T_time0() interrupt 1 using 0    /*打印出针控制*/
{
	if(Ptflg)
	{
		if(direction_a)
		{
			direction_a = 0;
			TH0 = 0xfe;
			TL0 = 0xeb;
		}
		else if(direction_b)
		{
			direction_b = 0;
			TH0 = 0xfe;
			TL0 = 0xcb;
		}
		else
		{
			TH0 = 0xfe;
			TL0 = 0xeb;
		}
		Write_Printdata(PrintData);
		Ptflg = 0;
		TR0=0;
	}
	
///////////////////////////////////////////////////////////
	else
	{
		TH0 =-(TIMER0GAP/256);     /*-(46080/256);*/
		TL0 =-(TIMER0GAP%256); 	  /*-(46080%256);*/
  
		if(beepcounter>0)//处理BEEP
		{
			if(beepflg==1)
				beepflg=2;
			beepcounter--;
		}
		else if(beepflg==2)
		{
			P1_1 = 1;  //buzz_off();
			beepflg=0;
		}
	
		counter--;
			
		if(key_flag==1)
		{
		//	key_flag = 0;
		//	_read_key();
			key_flag = 2;
			EX1 = 1;
			IE1 = 1;
		}
				
		if(PE_SIG)
		{
			if(NO_Paperflg)
			{
				NO_Paperflg=0;
				//open_Nopaper_Printing_light(1);
			}
		}//关无纸显示有纸
		else
		{
			if(!NO_Paperflg)
			{
				NO_Paperflg=1;
				//open_Nopaper_Printing_light(2);
			}
		}
		
		if((low_pwr)&&(PWROFF)) //重新上电
		{
			low_pwr=0;
		}
	}
}


//=============================================================================================
void P_init0(void) interrupt 0 using 3          /*外部中断0 以下降缘触发 检测掉电*/
{
	EA = 0;
	low_pwr=1;
	if(g_tax_pin_pass)  //口令已通过
		shut_bat(0);
	//	SetupPortD(Bat_cnt,1);
//	buzz_on();
	//IE0=0;
	EA = 1;
}


void EX1_init(void) interrupt 2 using 1
{
	EA = 0;
	if(key_flag==0)
	{
		EX1 = 0;
		key_flag=1;
		TH0=-(TIMER0GAP/256);       //1ms timer
		TL0=-(TIMER0GAP%256);
	}
	else if(key_flag==2)
	{
		_read_key();
		key_flag = 0;
	}
	IE1 = 0;  //允许外部中断
	EA = 1;
}

/*******************************************************************************
//* 定时器1 用于打印机马达速度控制
* 定时器1 里有四对加减速表
* 分别是: 1、 打印头归位,加减速时间表
*          2、 打印头 B to A 方向加减速时间表
*          3、 打印头 A to B 方向加减速时间表
*          4、 走纸马达加减速时间表
*******************************************************************************/
//=========打印头归位,加、减速时间表===============//
uchar code GoHpAccTimeTable[11][2] = {
	{0xee,0x5c}, //4.9ms
	
	{0xf7,0x81}, //2.36ms
	
	{0xf9,0x32}, //1.89ms
	
	{0xfa,0x18}, //1.64ms
	
	{0xfa,0xa2}, //1.49ms
	
	{0xfb,0x07}, //1.38ms
	
	{0xfb,0x51}, //1.20ms
	
	{0xfb,0x89}, //1.24ms
	
	{0xfb,0xb7}, //1.19ms
	
	{0xfb,0xe5}, //1.14ms
	
	{0xfc,0x38}, //1.05ms
	
};

uchar code GoHpDecTimeTable[11][2] = {
	{0xfc,0x38}, //1.05ms
	
	{0xfc,0x1c}, //1.08ms
	
	{0xfb,0xe5}, //1.14ms
	
	{0xfb,0x9b}, //1.22ms
	
	{0xfb,0x48}, //1.31ms
	
	{0xfa,0xe3}, //1.42ms
	
	{0xfb,0x58}, //1.57ms
	
	{0xf9,0x97}, //1.78ms
	
	{0xf8,0x67}, //2.11ms
	
	{0xf6,0x19}, //2.75ms
	
	{0xe8,0x0f}, //6.65ms
};


//===========打印头 B to A 方向加、减速时间表=================//
uchar code BtoA_AccTimeTable[17][2] = {
	{0xee,0x5c+25}, //4.9ms
	
	{0xf8,0x14+25}, //2.2ms
	
	{0xf9,0xea+25}, //1.69ms
	
	{0xfa,0xe3+25}, //1.42ms
	
	{0xfb,0x7e+25}, //1.25ms
	
	{0xfb,0xee+25}, //1.13ms
	
	{0xfc,0x41+25}, //1.04ms
	
	{0xfc,0x81+25}, //0.97ms
	
	{0xfc,0xb9}, //0.91ms
	
	{0xfc,0xe7}, //0.86ms
	
	{0xfc,0xe7}, //0.86ms

	{0xfd,0x06}, //0.826ms
	
	{0xfd,0x06}, //0.826ms
	
	{0xfd,0x06}, //0.826ms
	
	{0xfd,0x06}, //0.826ms
	
	{0xfd,0x06}, //0.826ms
	
	{0xfd,0x06}, //0.826ms
};

uchar code BtoA_DecTimeTable[15][2] = {
	{0xfd,0x06}, //0.826ms   1    |
	
	{0xfd,0x06}, //0.826ms   2    |
	
	{0xfd,0x06}, //0.826ms   3    |
	
	{0xfd,0x06}, //0.826ms   4    1

	{0xfd,0x06}, //0.826ms   5    2


	{0xfc,0xe7}, //0.860ms   6    3

	{0xfc,0xaf}, //0.920ms   7    4

	{0xfc,0x66}, //1.000ms   8    5
	
	{0xfc,0x13}, //1.090ms   9    6
	
	{0xfb,0xad}, //1.200ms  10    7
	
	{0xfb,0x23}, //1.350ms  11    8
	
	{0xfa,0x63}, //1.560ms  12    9
	
	{0xf9,0x32}, //1.890ms  13   10
	
	{0xf6,0xe4}, //2.530ms  14   11
	
	{0xea,0x66}, //6.000ms  15   12
};


//===========打印头 A to B 方向加、减速时间表=================//
uchar code AtoB_AccTimeTable[14][2] = {
	{0xee,0x5d+20}, //4.9ms
	
	{0xf9,0x18+20}, //1.92ms
	
	{0xfa,0xb6+20}, //1.47ms
	
	{0xfb,0x89+20}, //1.24ms
	
	{0xfc,0x14+20}, //1.09ms
	
	{0xfc,0x70+20}, //0.99ms
	
	{0xfc,0xba+20}, //0.91ms
	
	{0xfc,0xf5+5}, //0.85ms
	
	
	{0xfd,0x06}, //0.826ms
	
	{0xfd,0x06}, //0.826ms
	
	{0xfd,0x06}, //0.826ms
	
	{0xfd,0x06}, //0.826ms
	
	{0xfd,0x06}, //0.826ms
	
	{0xfd,0x06}, //0.826ms
};


uchar code AtoB_DecTimeTable[18][2] = {
	{0xfd,0x06}, //0.826ms   1    |
	
	{0xfd,0x06}, //0.826ms   2    |
	
	{0xfd,0x06}, //0.826ms   3    |
	
	{0xfd,0x06}, //0.826ms   4    |
	
	{0xfd,0x06}, //0.826ms   5    |
	
	{0xfd,0x06}, //0.826ms   6    |
	
	
	{0xfd,0x06}, //0.826ms   7    1

	{0xfd,0x06}, //0.826ms   8    2

	{0xfc,0xe7}, //0.860ms   9    3

	{0xfc,0xaf}, //0.920ms  10    4

	{0xfc,0x66}, //1.000ms  11    5
	
	{0xfc,0x13}, //1.090ms  12    6
	
	{0xfb,0xad}, //1.200ms  13    7
	
	{0xfb,0x23}, //1.350ms  14    8
	
	{0xfa,0x63}, //1.560ms  15    9
	
	{0xf9,0x32}, //1.890ms  16   10
	
	{0xf6,0xe4}, //2.530ms  17   11
	
	{0xea,0x66}, //6.000ms  18   12
};

//===========进纸马达加、减速时间表===============//
uchar code PaperAccTimeTable[][2] = {
	{0xe6, 0xcc}, //7.00ms
	
	{0xf2, 0x07}, //3.88ms
	
	{0xf5, 0x45}, //2.98ms
	
	{0xf6, 0xf6}, //2.51ms
	
	{0xf8, 0x0b}, //2.21ms
	
	{0xf8, 0xcc}, //2.00ms
	
	{0xf9, 0x60}, //1.84ms
	
	{0xf9, 0xd7}, //1.71ms
	
	{0xfa, 0x33}, //1.61ms
	
	{0xfa, 0x87}, //1.52ms
	
	{0xfa, 0xc7}, //1.45ms
	
	{0xfb, 0x07}, //1.38ms
	
	{0xfb, 0x36}, //1.33ms

	{0xfb, 0x64}, //1.28ms
	
	{0xfb, 0x7e}, //1.25ms
};


//进纸马达减速时间表
uchar code PaperDecTimeTable[][2] = {
//	{0xfb, 0x7e}, //1.25ms
	
	{0xf9, 0xfc}, //1.67ms
	
	{0xf6, 0xff}, //2.50ms

};


uchar MaxShiftSteps;     //加速或减速的最大步数
/*****************************************************************
* 中断函数     定时/计数器 2
* 用于打印机驱动
*****************************************************************/
void T_time1() interrupt TF1_VECTOR using 3
{
//	P1_1 = !P1_1;
	if(ShiftSel >= SHIFT_PAPER_A) //走纸马达
	{
		if(PaperMoveFlag) //与马达必须同步
		{
			return;
		}
		else
			PaperMoveFlag = 1;
	}
	else    //打印头马达
	{
		if(CarMoveFlag) //与马达必须同步
		{
			return;
		}
		else
			CarMoveFlag = 1;
	}
		
	//=========根据不同的变速选择,选择不同的时间表===========//
	switch(ShiftSel)
	{
	//=========打印头复位===============//
	case SHIFT_GOHP_A:
		TH1 = GoHpAccTimeTable[PaceSel][0];
		TL1 = GoHpAccTimeTable[PaceSel][1];
		MaxShiftSteps = 11;
		break;
		
	case SHIFT_GOHP_D:
		TH1 = GoHpDecTimeTable[PaceSel][0];
		TL1 = GoHpDecTimeTable[PaceSel][1];
		MaxShiftSteps = 11;
		break;

	case SHIFT_GOHP_C:
		TH1 = 0xfc;
		TL1 = 0x38;
		break;

	//=========打印头B TO A方向打印===============//
	case SHIFT_BTOA_A:
		TH1 = BtoA_AccTimeTable[PaceSel][0];
		TL1 = BtoA_AccTimeTable[PaceSel][1];
		MaxShiftSteps = 17;
		break;
	
	case SHIFT_BTOA_D:
		TH1 = BtoA_DecTimeTable[PaceSel][0];
		TL1 = BtoA_DecTimeTable[PaceSel][1];
		MaxShiftSteps = 15;
		break;
	
	case SHIFT_BTOA_C:
		TH1 = 0xfd;
		TL1 = 0x06;
		break;
	
	//=========打印头A TO B方向打印===============//
	case SHIFT_ATOB_A:
		TH1 = AtoB_AccTimeTable[PaceSel][0];
		TL1 = AtoB_AccTimeTable[PaceSel][1];
		MaxShiftSteps = 14;
		break;
	
	case SHIFT_ATOB_D:
		TH1 = AtoB_DecTimeTable[PaceSel][0];
		TL1 = AtoB_DecTimeTable[PaceSel][1];
		MaxShiftSteps = 18;
		break;
	
	case SHIFT_ATOB_C:
		TH1 = 0xfd;
		TL1 = 0x06;
		break;
	
	//=========走纸马达转动===============//
	case SHIFT_PAPER_A:
		TH1 = PaperAccTimeTable[PaceSel][0];
		TL1 = PaperAccTimeTable[PaceSel][1];
		MaxShiftSteps = 15;
		break;
	
	case SHIFT_PAPER_D:
		TH1 = PaperDecTimeTable[PaceSel][0];
		TL1 = PaperDecTimeTable[PaceSel][1];
		MaxShiftSteps = 2;
		break;
	
	case SHIFT_PAPER_C:
		TH1 = 0xfd;
		TL1 = 0x06;
		break;
	
	case SHIFT_PAPER_S:
		TH1 = 0xf6;
		TL1 = 0x66;
		break;
	
	default:
		break;
	}

	RunSteps++;
	StepsCounter++;

	if(PaceSel<MaxShiftSteps)  //到达数组的极限,防程序跑飞
	{
		PaceSel++;
	}
	
	if(RunSteps==SetSteps)
	{
		TR1 = 0;
	}
}

extern  bit	I2C_NoAck;
extern  bit	I2C_Lost;
extern  bit	I2C_Busy;
extern  bit  I2C_master, I2C_xmit;

/*================================================*/
void I2C_Isr (void) interrupt I2C_VECTOR using 2
{
 	if (S2STA & 0x02)
	{
		S2DAT = 0XFF;
		I2C_NoAck = 1;
	}

	if (S2STA & 0x04)
	{
		S2DAT = 0XFF;
		I2C_Lost = 1;
		I2C_Busy=1;
	}

	if (S2STA & 0x40)		
		S2DAT = 0XFF;

	if (I2C_master & I2C_xmit)	I2C_Send_data();
    if (I2C_master & ~I2C_xmit)	I2C_Rcv_data();
 /*	if (S2STA & 0x02)    //回应
	{
		S2DAT = 0XFF;
		I2C_NoAck = 1;
	}

	if (S2STA & 0x04)   //失去I2C的总线权
	{
		S2DAT = 0XFF;
		I2C_Lost = 1;
		I2C_Busy=1;
	}

	if (S2STA & 0x40)	        S2DAT = 0XFF;	//有停止位
	if (I2C_master & I2C_xmit)	I2C_Send_data();
    if (I2C_master & ~I2C_xmit)	I2C_Rcv_data();
  */
}


⌨️ 快捷键说明

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