📄 ps22c.c
字号:
/*
*/
#pragma small //LARGE
#include <absacc.h>
#include <reg52.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define clear 0x01 //清屏幕,约1.6ms
#define home 0x02 //光标回零(左上角)/
#define f_set 0x30 //并行、基本指令
#define dis_on 0x0f //打开显示,光标,闪烁功能
#define in_mode 0x06 //输入方式,地址增1,光标右移
#define panel_num 10
//#include "LSP11.H"
#define C_ad 5
/*----------------------------------------------------------------------*/
//sbit P_RS=P0^0; //P0^3; P1.5
//sbit P_RW=P0^1; //P0^2;
//sbit P_E=P0^2; // P0^0;
//sbit bee=P3^0;
/*********************************************************/
/*
12Mhz 1us/time
T1==100us
T0==50ms interrupt
*/
sbit load=P0^6; /*0;*/
//sbit ad43_cs=P1^3;
sbit x25_cs=P1^2; //0xb0^4;
sbit x25_WP=0xb0^5;
sbit clk=P0^5; /*1;*/
sbit din=P0^7;
sbit dout25=P3^3;
//sbit dout43=P1^7;
//sbit load2=P3^2;
//sbit heating=P1^0;
sbit flag1=P0^3; //1^1;
sbit flag2=P0^4; //1^2;
bdata uchar ab;
sbit abit0=ab^0;sbit abit1=ab^1;sbit abit2=ab^2;sbit abit3=ab^3;
sbit abit4=ab^4;sbit abit5=ab^5;sbit abit6=ab^6;sbit abit7=ab^7;
data unsigned char T_50ms,T_key,ms_timing,second,second1,second_k,minute,minuter,hour,vent_hour,old_hour,s_hour,old_s_hour;
idata uchar chint,str[15],count_232;
idata uchar dis_buff[10];
/*********************************************************/
bdata uchar iab;
sbit iabit0=iab^0;sbit iabit1=iab^1;sbit iabit2=iab^2;sbit iabit3=iab^3;
sbit iabit4=iab^4;sbit iabit5=iab^5;sbit iabit6=iab^6;sbit iabit7=iab^7;
data uchar second_COM;
sbit din_ps2=P0^0; //1^0;
sbit clk_ps2=P3^2;
bit flag_COM,busy,flag_start; //flag_unit2;
uchar COM_buff[10],COM_ptr,bit_count;
int xx,yy;
/*----------------------------------------------------*/
uchar *ptr;
idata struct v_data{
uchar status;
uint xx,yy;
uchar end;
};
idata struct v_data DA;
/*----------------------------------------------------*/
/*********************************************************/
data uchar key_sfr;
bdata uchar key_sfr0;
sbit key_chk =key_sfr0^0;
sbit key_stage =key_sfr0^1;
sbit key_ok =key_sfr0^2;
sbit key_left =key_sfr0^3;
sbit key_up =key_sfr0^4;
sbit key_right =key_sfr0^5;
sbit key_set =key_sfr0^6;
sbit key_down =key_sfr0^7;
bit key_run,flag_key,flag_232C;
/*---------------------------------------------------------*/
/*----------------------------------------------------*/
void rst_wdog(void)
{
x25_cs=0;
x25_cs=1;
}
/*----------------------------------------------------------------------*/
void init(void);
/*----------------------------------------------------------------------*/
void initial(void)
{
TMOD=0X21; //定时器1 置初值 方式0
TH0=0X3C; TL0=0Xa6;
//PT1=1;
ET0=TR0=1; //开定时器1中断
EA=1;
//P1=0xf8;
init();
}
/*---------------------------------------------------------*/
void init(void)
{
TH1=TL1=0; //定时器1开中断 一次定时 方式1 256us
ET1=TR1=1;
}
/*----------------------------------------------------*/
void T2_init(void) //定时方式2
{
T2CON=0x34;
TR2=1;
RCAP2H=0xff; RCAP2L=0xb2; //4800
//RCAP2H=0xff; RCAP2L=0xd9; //9600
TH2=0xff;TL2=0;
//ET2=1;
SCON=0xf0;
TB8=1;
SM2=1;
SBUF=0; //定时中断2将SBUF清零
REN=1;
RI=0;
ES=0;
EA=1;
}
/*---------------------------------------------------------*/
void itoa(int x,unsigned char *str) //16进制转ASCII 显示字符
{ //液晶显示用
unsigned int n;
unsigned char chn,*p,str1[5];
data unsigned char i,j;
if(x<0){
*str++='-';
x=-x;
}
n=x;
p=str1;
j=0;
while(n!=0){
chn=n%10;
n=n/10;
*p++=chn+'0';
j++;
}
if(j!=0){
p--;
for(i=0;i<j;i++)*str++=*p--;
}
else *str++='0';
*str=0;
return;
}
/*---------------------------------------------------------*/
/*---------------------------------------------------------*/
void delay(uchar n)//延时程序
{
data uchar i,j,k;
for(i=0;i<n;i++){
for(j=0;j<250;j++){
for(k=0;k<25;k++){
rst_wdog();
}
}
}
}
/*---------------------------------------------------------*/
/*********************************************************/
void ex_int0(void) interrupt 0 using 2
{
if(flag_COM)return;//当flag_COM=0 向下执行
TL1=0; //TH1=0xdf; //从新
if(flag_start){
busy=1;
flag_start=0; din_ps2=1; //sbit din_ps2=P0^0 sbit clk_ps2=P3^2;
COM_ptr=0; bit_count=0;
//busy=1; second_COM=0;
}else{
if(!busy)return;
bit_count++;
//if(bit_count>10){bit_count=11; flag1=!flag1; }
switch(bit_count){
case 0:
break;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
//iab=COM_buff[COM_ptr];
iab>>=1;
iabit7=din_ps2;
//COM_buff[COM_ptr]=iab;
break;
case 9:
//COM_ptr++;
//iab=COM_buff[COM_ptr];
//dout=iabit0;
COM_buff[COM_ptr]=iab; //将第一次收到的值给 COM_buff[0]
COM_ptr++;
break;
case 10:
flag2=!flag2; bit_count=-1;
if(COM_ptr>=3){
iab=COM_buff[0];
if(!iabit4) xx+=COM_buff[1]; else xx+=(COM_buff[1]|0xff00);
if(!iabit5) yy+=COM_buff[2]; else yy+=(COM_buff[2]|0xff00);
if(iabit0)xx=yy=0;
COM_ptr=0; busy=0; flag_COM=1;} //COM_ptr>3
break;
default:
//bit_count=0;
break;
}
}
IE0=0; IE1=0;
}
/*********************************************************/
void ex_int1(void) interrupt 2 using 3
{
}
/*********************************************************/
/*********************************************************/
void t0int(void) interrupt 1 using 1
{
/*TH0=0X3C; TL0=0XB6; 50ms */
/*TH0=0xfc; TL0=0x1e;*/ /*1ms*/
/*TH0=0x3c; TL0=0xa6;*/
/*每次62.5MS=62500=F424H=(0BDCH)补码
每16次中断为1秒
*/
TH0=0x0b; TL0=0xe0; /*DC+4=E0H*/
/***********/
T_50ms++;T_key++; //公共时钟
ms_timing++;
if((ms_timing&0x10)!=0){
ms_timing=0;second++;
second1++; second_k++,second_COM++;
if(second>=60){
second=0;minute++;minuter++;
if(minute>=60){
minute=0;hour++;
}
}
}
}
/*********************************************************/
void t1int(void) interrupt 3 using 3
{
flag_start=1; //定时中断1 传10位的时间
}
/*********************************************************/
/*----------------------------------------------------*/
/*interrupt [0x23] void SCON_int (void); Serial Port */
/* Serial Port */
void SCON_int(void) interrupt 4 using 1
{
}
/*----------------------------------------------------*/
void t2int(void) interrupt 5 using 3
{
//flag_start=1;
}
/*********************************************************/
int i2hex(uchar x)
{
uchar cl,ch;
cl=x&0x0f; ch=x>>4;
if(cl<=9)cl+='0'; else cl+='A'-10;
if(ch<=9)ch+='0'; else ch+='A'-10;
return (ch<<8)+cl;
}
/*-----------------------------------------------------------------*/
void host_write(uchar x)
{
uchar i,ch;
bit flag;
EX0=0; //禁止外中断
ACC=x; flag=!P;
clk_ps2=0;
for(i=0;i<100;i++)ch=0;
din_ps2=0;
for(i=0;i<20;i++)ch=0;
clk_ps2=1; second1=0;
while(clk_ps2){rst_wdog(); if(second1>20)break;}
ab=x;
second=0;
//din_ps2=1;
for(i=0;i<8;i++){
din_ps2=abit0;
ab>>=1;
while(!clk_ps2){if(second>10) break;}
while(clk_ps2){if(second>10) break;}
}
din_ps2=flag; //校验位
while(!clk_ps2){if(second>10) break;}
while(clk_ps2){if(second>10) break;}
din_ps2=1; //停止位
while(!clk_ps2){if(second>10) break;}
while(din_ps2){if(second>10) break;}
while(!din_ps2){if(second>10) break;}
if(second>10)DA.status=0xff; else DA.status=0;
}
/*-----------------------------------------------------------------*/
/*---------------------------------------------------------*/
void dis_7219(uchar iw,uchar ix) //,uchar chl)
{
uchar i,j,nc;
clk=0;
//if(chl==0)load=0;else load2=0;
load=0;
for(j=0;j<25;j++)nc=0;
ab=iw;
for(i=0;i<8;i++){
din=abit7;
ab<<=1;
/*abit0=dout; dout;*/
clk=1;
for(j=0;j<5;j++)nc=0;
clk=0; for(j=0;j<5;j++)nc=0;
}
ab=ix;
for(i=0;i<8;i++){
din=abit7;
ab<<=1;
/*abit0=dout;*/
clk=1;
for(j=0;j<5;j++)nc=0;
clk=0; for(j=0;j<5;j++)nc=0;
}
//if(chl==0)load=1; else load2=1;
load=1;
for(j=0;j<25;j++)nc=0;
}
/*---------------------------------------------------------*/
void main(void)
{
data uchar work,i; //,count,t_count,m_status,run_status;
data uchar ch,crect,count;
int xch;
begin:
for(;;){
dis_7219(1,0x0); /*送显示数据的内容*/
dis_7219(2,0x1);
dis_7219(3,0x2);
dis_7219(4,0x3);
dis_7219(5,0x4);
dis_7219(6,0x5);
dis_7219(7,0x6);
dis_7219(8,0x7);
}
P1=P1&0xff;/*turn off output*/
SP=0xef;
P3=0xff;
delay(10);
SP=0xef;
//ACC=0x57;
//if(!P) ch=1; else ch=0;
initial();//定时器0,1
T2_init();
IT0=IT1=1;
PX0=1; PX1=0; IE0=IE1=0; EX0=1; EX1=0; //PS2接口利用int0作为CLK
COM_ptr=0; busy=0; flag_COM=0;
xx=yy=0;
dis_7219(2,2);
for(i=0;i<12;i++)dis_7219(i,i);
din_ps2=1;
host_write(0xf4);
host_write(0x60);
host_write(0xfd);
host_write(0x7a);
count=0;
while(1){
while(work==second){
if(flag_COM) break;
rst_wdog();
}
work=second;
flag1=!flag1;
EA=ET0=1;
IT0=1;
PX0=1; EX0=1;
if(flag_COM){
flag_COM=0;
//clk_ps2=0;
TL1=0; //TH1=0xdf;
flag_start=0;
for(i=0;i<3;i++)dis_buff[i]=COM_buff[i];
}
count++; count&=0x0f;
for(i=0;i<3;i++){
//xch=i2hex(dis_buff[i]);
ch=dis_buff[i];
//str[2*i]=xch>>8;
//str[2*i+1]=xch;
str[2*i]=ch>>4;
str[2*i+1]=ch&0x0f;
}
for(i=0;i<6;i++)dis_7219(i,str[i]); //i+count);
if(T_50ms>=4){
//if(second1>=1){ //通信
T_50ms=0;
//second1=0;
DA.status=dis_buff[0];
DA.xx=xx; DA.yy=yy;
DA.end=0x55;
TI=1; ch=0; crect=0;
ptr=&DA;
for(i=0;i<6;i++){
while(!TI);
ch=*ptr++; SBUF=ch; crect+=ch;
TI=0;
rst_wdog();
}
while(!TI);
SBUF=crect; //send correct code
TI=0;
}
}
}
/*********************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -