📄 复件 (2) lcd_input.c
字号:
#include <reg51.h>
#include <math.h>
#include <stdio.h>
#include <absacc.h>
#include <intrins.h>
#include <string.h>
#include <stdlib.h>
#define wcadd1 XBYTE[0xbf00] //#define wcadd1 XBYTE[0xfe00] /* 写指令代码地址 */
#define wdadd1 XBYTE[0x3f00] //#define wdadd1 XBYTE[0xfc00] /* 写参数及显示数据地址 */
#define rdadd1 XBYTE[0xbf00] /* 读参数及显示数据地址 */
#define rbadd1 XBYTE[0x3c00] /* 读忙状态地址 */
#define Io8155 XBYTE[0xef00]
#define M8155 XBYTE[0xcf00]
#define M8155_1 XBYTE[0xcf10]
#define Io8155_A XBYTE[0xef01]
#define Io8155_B XBYTE[0xef02]
typedef unsigned char uchar;
typedef unsigned int uint;
#define PARA1 0x28;
#define True 1
#define False 0
void delay3(uint Tm_count);
void sound(bit f,uchar i);
void CCW22_PR(char O_X,char O_Y,code_1);
uchar key_in(void);
void RS_in();
void pass();
bit Send_c(uchar i);
void delay();
sbit Input_1 = P0^0;
sbit Input_2 = P0^1;
sbit Input_3 = P0^2;
sbit Input_4 = P0^3;
sbit Master = P0^4;
sbit Second = P0^5;
sbit Bad = P0^6;
sbit Speak = P0^7;
sbit LED_zd = P1^4;
sbit LED_zl = P1^5;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit in1=P2^6;
sbit in2=P2^7;
sbit P00=P0^0;
sbit Maste=P3^1;
sbit Select=P3^0;
sbit P34=P3^4;
sbit P35=P3^5;
sbit P36=P3^6;
sbit P37=P3^7;
bit RUN; //电机运行壮态
bit Front;//电机前或后壮态 0/Front,1/back
bit Key;
bit RXD_D;
bit Busy;
uchar SAVE_D;
uchar TH0_T;
uchar TL0_T;
uchar V_k;
uchar speed;
code uchar DJ_F[]={0xFE,0xFA,0xFB,0xF9,0xFD,0xFC};
code uchar DJ_B[]={0xFE,0xFC,0xFD,0xF9,0xFB,0xFA};
code uchar DJ_V[3][2]={0xa6,0xe2,
0x49,0xb2,
0x48,0x64};
code uchar CGTAB[3][2]={0xba,0xe2,0x80,0xc1,0x10,0x80};
void main()
{
uchar i,save;
uchar cont;
bit FLAG_1,FLAG_2;
Busy = False;
speed = 0;
SCON = 0x52;
TMOD = 0x21;
IP = 0x07;
TH1=TL1=0xF4;
RXD_D = 0;
SAVE_D = 0;
V_k = 0;
TH0_T = DJ_V[0][0];
RUN = 0;
TL0_T = 0;
EA = 1;
TR1 = 1;
EX0 = 1;
delay();
pass();
while (1)
{
cont = 0; FLAG_2 = 0;
while (1)
{
if (RXD_D) RS_in();
i = key_in();
if (RUN==0) {if (i == 6) break;} /* 设定手动按键 */
if (i==0)
{
if (cont >= 200) { i = save; break;}
else continue;
}
if (save == i) {if(cont >= 200) continue; else cont++;}
else {save=i;cont=0;};
}
if (!Busy)
{
FLAG_1 = Send_c(i);
if(FLAG_1==0) Bad=0; else Bad=1;
}
}
}
//+++++++++++++++++++++++++++++++++++++++++
void RS_in()
{uchar i;
RXD_D=0;i=SAVE_D;SBUF=i;while(!TI);TI=0;
switch (i){
case 1: {Front=0;ET0=1;TR0=1;}break; /* 电机反转 */
case 2: {Front=1;ET0=1;TR0=1;}break; /* 电机正转 */
case 3: {ET0=0;TR0=0;P2|=0x07;}break; /* 电机停 */
case 4: {TH0_T=DJ_V[0][V_k];}break; /* 每分钟8毫升 */
case 5: {TH0_T=DJ_V[1][V_k];}break; /* 每分钟4毫升 */
case 6:
{
if (V_k == 0) speed = 1;
TH0_T = DJ_V[2][V_k];
} break; /* 每分钟2毫升 */
case 7:
{
LED_zd = 0; /* 开治疗指示 */
RUN = 1;
} break;
case 8:
{
LED_zl = 0; /* 开诊断指示 */
RUN = 1;
} break;
case 9:
{
LED_zd = 1; /* 关治疗指示 */
P1 |= 0x07;
speed = 0;
RUN = 0;
} break;
case 10:
{
LED_zl = 1; /* 关诊断指示 */
P1 |= 0x07;
speed = 0;
RUN = 0;
}break;
case 11:V_k=0;break; /* 50ML注射器 */
case 12:V_k=1;break; /* 25ML注射器 */
case 13:{ RUN=~RUN;}break; /* 发键连续关 */
case 14: Busy=~Busy; break; /* 主控忙 */
default: break;
}
}
//==========================================
bit Send_c(uchar i)
{uint j;
bit FLAG_1=0;
Second = False;
if (Master==0) return(1);
FLAG_1=0;
for (j=0;j<65000;j++)
{ if (RXD_D) RS_in();
if (Master==0)
{i=~i;P0&=i;Second=1;
_nop_();_nop_();_nop_();
FLAG_1=1;P0|=0x3f;
}
else continue;
break;
}
Second = True;
return(FLAG_1);
}
//===========/*电机控制*/=================
void time_0(void) interrupt 1
{static uchar i,count;
uchar j;
TR0 = 0;
EA = 0;
TH0 = TH0_T;
TL0 = TL0_T;
if ((V_k==0) && (TH0_T==0x48))
{
if (count >= speed) count = 0; else { count++; goto time_1;}
}
if (i >= 5) i = 0;
P1 |= 0x07;
if (!Front) {j = DJ_F[i]; P1 &= j;}
else {j = DJ_B[i]; P1 &= j;};
i++;
time_1: EA=1;
TR0=1;
}
void INT_0(void) interrupt 0
{uchar i,k;
bit s;
EA=0;
if (Second==0) {s=0;Second=1;} else s=1;
//if (RXD_D) P24=0;else P24=1;
for (k=0;k<0xff;k++)
{
if (Master!=0) continue;
Second=0;
while(!Master);
_nop_();_nop_();_nop_();
i=P0;i|=0xf0;i=~i;
SAVE_D=i;RXD_D=1;
break;
}
//if (RXD_D==0) LED_gz=0;else LED_gz=1;
Second=s;
EA=1;
}
/*按键处理*/
uchar key_in(void)
{ uchar i,j;
P2=0xff;
P2&=0xf8;
_nop_();_nop_();_nop_();
i=P2;
i|=0xc7;
_nop_();_nop_();_nop_();
if (i==0xff) return(0);
P2=i;j=i;
i=P2;
i|=0xf8;
if (i==0xff) return(0);
i&=j;Key=1;
switch(i)
{case 0xf6: i=1; break; //1
case 0xf5: i=2; break; //2
case 0xf3: i=3; break; //3
case 0xee: i=4; break; //4
case 0xed: i=5; break; //5
case 0xeb: i=6; break; //6
case 0xde: i=7; break; //7
case 0xdd: i=8; break; //8
case 0xdb: i=9; break; //p
}
return(i);
}
void delay(void)
{ uint i;
for (i=0;i<20000;i++)
{
_nop_();
}
}
/**********************************/
void pass()
{ uchar i;
CCW22_PR(2,3,3);
loop:
Maste=1;
while (!Select);
P3=0xff;
Maste=0;
while (Select);
i=P3;
i&=0xf0;
if (i!=0x50) {Maste=1;goto loop;}
Maste=1;
}
/************************************/
/* 汉字写入函数 (图形方式)CCW2_PR */
/* 连接字库: CGTAB */
/* 函数调用入口: CCW2_PR() */
/* 函数输入变量: O_X,O_Y,CODE_1 */
/************************************/
void CCW22_PR(char O_X,char O_Y,code_1)
{
unsigned char count1;
unsigned int i,j,a;
a=0;
i=PARA1;
j=i*O_Y+O_X+0x01f0; /* 如为320240屏k=j*O_Y+O_X+0x04ce*/
wcadd1=0x4f; /* CSRDIR 代码(下移) */
Maste=0;
for(i=0;i<2;i++)
{
wcadd1=0x46; /* CSRW 代码 */
wdadd1=j%256; /* 设置光标地址CSR */
wdadd1=j/256+0x40;
wcadd1=0x42; /* MWRITE 代码 */
for(count1=i*16;count1<16*(i+1);count1++)
{
wdadd1=CGTAB[code_1][count1]; /* 写入数据 */
}
j=j+1;
}
while (Select);
P3&=0x5f;
}
void sound(bit f,uchar i)
{
for (;i>0;i--)
{
Speak = False;
if (f) delay3(100); else delay3(50);
Speak = True;
if (i>0) delay3(50);
}
}
/********定时1ms***********/
void delay3(uint Tm_count)
{
uint i;
while (Tm_count--)
{
for (i=0; i<125; i++) {};
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -