📄 key.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 + -