www.pudn.com > DISPLAY1.rar > DISPLAY1.C


/* 
2005.3.8: 
       COM_key=0xff;  空键时,键值为0xff 
2005。1。6 
修改:为了调试主机接收功能,从机的INT0和在INT1中当上一个字节发生完毕后应将准备送出的BIT预先放到 
DOUT线上,并预先左移一个BIT : 
INT0中 
iab=COM_buff[0]; 
dout=iabit7; 
iab<<=1; 
COM_buff[0]=iab; 
和(INT1中): 
if(bit_count==0){ 
       bit_count=0x08; 
       COM_ptr++; 
       iab=COM_buff[COM_ptr]; 
       dout=iabit7; 
       iab<<=1; 
       COM_buff[COM_ptr]=iab; 
 
  该函数主要完成的功能有:LED动态扫描,按键扫描,SPI从机接口 
      SPI从机接口: 
                   从机:      1         2       3       4       5       6       7 
                    地        P1。1     P1。2   P3。2   P3。3 
                                                INT0     INT1 (中断方式实现CS CLK) 
                             DOUT     DIN       CS      CLK 
                 选通和时钟都采用中断方式,提高系统的适时性能 
void ex_int0(void) interrupt 0 using 2 
{ 
//dis_buff[4]++; 
COM_ptr=0; bit_count=0x08;  字节指针范围0--3  位指针范围0--7 
iab=COM_buff[0];            将当前字节(首字节)准备左移 
dout=iabit7;                移到发送线上 
busy=1; second_COM=0;       设置'忙'信号,超时逃脱定时器清零 
IE0=0;                      外中断标志位清零 
} 
void ex_int1(void) interrupt 2 using 3 
{ 
//if(!busy) return; 
EX0=0;                      外中断0关闭 
//dis_buff[5]++; 
iab=COM_buff[COM_ptr];     将当前字节的最高位移到DOUT上 
dout=iabit7; 
iab<<=1; 
iabit0=din;                将DIN接收到当前字节的最低位 
COM_buff[COM_ptr]=iab; 
bit_count--;               位计数器减1 
if(bit_count==0){          位计数器减到零时,字节指针下移,准备发送下移个字节 
       bit_count=0x08; 
       COM_ptr++; 
       if(COM_ptr>3){COM_ptr=0; busy=0; flag_COM=1;} 发送完毕设置标志 
       } 
IE0=0; EX0=1;              外中断0打开 
} 
 
 
 
动态扫描 9个LED显示  9个按键,两组灯LED动态扫描 
 
Og 段码    P0.7     P0.6        P0.5    P0.4    P0.3    P0.2    P0.1    P0.0 
           dp        c           d       e       a       b       f       g                          O b 
Of 位码 
          百      十      个              百      十      个            百      十      个          O f 
Oe       P3.7    P3.6    P2.0           interr 
.1    P2.2    P2.3            P2.4    P2.5    P2.6                                                                           .2 
P3.5                                                                                                O dp 
 
按键:                                                                                              O c 
                                                                                                    P2.7 
         P3.7  P3.6   P2.0             P2.1  P2.2   P2.3               P2.4  P2.5   P2.6 
        P1.7--公共线 
看门狗  P1.0 
 
*/ 
 
 
#pragma small //LARGE 
#include  
#include  
#include  
 
#define uchar unsigned char 
#define uint unsigned int 
#define KEYBORD P2 
#define dis_wei P2 
#define dis_out   P0 
data uchar xpos,ypos; 
sbit disw0=P3^7; 
sbit disw1=P3^6; 
sbit disw2=P2^0; 
sbit disw3=P2^1; 
sbit disw4=P2^2; 
sbit disw5=P2^3; 
sbit disw6=P2^4; 
sbit disw7=P2^5; 
sbit disw8=P2^6; 
sbit disw9=P2^7; //4灯 a g b f 
sbit diswa=P3^5; //3灯 a g b f 
sbit int_key=P3^0; 
bit  key0,key1; 
bit   busy; 
 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; 
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 dis_p,dis_buff[12],key_value; 
//idata uchar str[20]; 
sbit key_enable=P1^7; 
data uchar us250,ms50,second,second1,second_COM,T_key,minuter,old_minute; 
//data unsigned char T_50ms,T_key,ms_timing,second,second2,minute,minuter,minute1; 
data  uchar key_sfr,COM_key; 
bdata  uchar key_sfr0; 
       sbit key_set             =key_sfr0^0; 
       sbit key_up              =key_sfr0^1; 
       sbit key_down            =key_sfr0^2; 
       sbit key_ok              =key_sfr0^3; 
       sbit key_set2            =key_sfr0^4; 
       sbit key_up2             =key_sfr0^5; 
       sbit key_down2           =key_sfr0^6; 
       sbit key_ok2             =key_sfr0^7; 
bit    key_run; 
bit flag_key,flag_key0,flag_cursor; 
idata unsigned  char second_k,speed; 
sbit load=P1^4; /*0;*/ 
sbit clk=P1^3;  /*1;*/ 
sbit din=P1^2; 
sbit dout=P1^1; 
//sbit flag=P1^0; 
sbit x25_cs=P1^0; 
bit    flag_COM; 
uchar  ex_int_ok; 
uchar COM_buff[4],COM_ptr,bit_count; 
/*---------------------------------------------------------*/ 
 
/*----------------------------------------------------*/ 
void from_sfr_sfr0(void) 
{ 
static data uchar old_key=0xff,count=0; 
if(key_sfr==old_key){ 
	count++; 
	if(count>15){ 
		speed=1; count=15; 
		} 
	if(second_k>2){ 
		speed=0; count=0; 
		} 
	second_k=0; 
	}else{ 
	old_key=key_sfr; 
	speed=0; 
	count=0; 
	second_k=0; 
	} 
key_sfr0=0; 
switch(key_sfr){ 
	case 0: 
		key_set=1;   /*cut=1;*/ 
                key_ok=1; 
		break; 
 
	case 1: 
		key_up=1;  /*start=1;*/ 
		break; 
 
	case 2: 
		key_down=1; 
		break; 
	case 3: 
		key_set2=1;   /*cut=1;*/ 
                key_ok2=1; 
		break; 
 
	case 4: 
		key_up2=1;  /*start=1;*/ 
		break; 
 
	case 5: 
		key_down2=1; 
		break; 
 
	default: 
		break; 
	} 
} 
/*----------------------------------------------------*/ 
/* 
getkey0: 
	uchar getkey0(uchar i,uchar j) 
	i---line 
	j---columue 
	key_value=i+3*j  i=0,1,2 j=0,1,2,3  key value=0--11  no key down when return 0xff 
	*/ 
/*----------------------------------------------------*/ 
uchar getkey0(void) 
{ 
data uchar ch,i; 
code uchar colu[8]={0x7e,0x7d,0x7b,0x77,0x6f,0x5f,0x3f,0x7f}; 
//                 P2.0  P2.1   P2.2   P2.3   P2.4   P2.5   P2.6  P2.5   P2.7 
 
//KEYBORD=0xff; 
while(!flag_key0){} 
flag_key0=0; 
ch=key_value&0x7f; //没有P2.7线的按键 
//PC8155=0xff; 
if(ch==0x7f){ 
        if(key0&key1) return 0xff; 
        } 
for(i=0;i<7;i++){ 
  if(ch==colu[i]) return i+2; 
  } 
if(!key0)return 0; 
if(!key1) return 1; 
return 0xff;  //=change[ch]; 
} 
/*----------------------------------------------------*/ 
void rst_wdog(void); 
 
/*----------------------------------------------------*/ 
/*RIGTH  →   0 
  定点        1 
  查询        2 
  UP      ↑  3 
  巡检        4 
  LEFT    ←  5 
  快速    K   6 
  打印        7 
  设定        8 
  DOWN    ↓  9 
  消音    *   10 
  确认    #   11 
  */ 
void getkey(void) 
{ 
static data key_num=0; 
data uchar ch,i;  /*xdata*/ 
	ch=getkey0(); 
	if(flag_key){ 
		if(ch==key_sfr&&ch!=0xff){ 
			minuter=0; 
			return; 
			} 
 
		flag_key=0; 
		key_sfr0=0; 
		key_num=0; 
		T_key=0; 
		key_sfr=0xff; 
 
		return; 
	        } 
	key_sfr=ch; 
	rst_wdog(); 
	if(ch==0xff){ 
		key_sfr0=0; 
		key_num=0; 
		if(T_key>2){ //4 
                            T_key=0; 
                            //bee=0; 
                            } 
		return; 
		} 
	for(i=0; i<10; i++){ //20 
		ch=0; 
		ch=0; 
		ch=0; 
		ch=0; 
		ch=getkey0(); 
		if(key_sfr==ch)continue; 
		minuter=0; 
		return; 
	  } 
	  /* 
	key_num++; 
	if(key_num<2)return; 
	key_num=0; 
	*/ 
	if(T_key<2)return; //4 
	//from_sfr_sfr0(); 
	flag_key=1; 
	//bee=1; 
	for(i=0;i<200;i++)ch=0; 
//	for(i=0;i<200;i++)ch=0; 
//	for(i=0;i<200;i++)ch=0; 
	/*bee=0; 2001.3.*/ 
} 
/*----------------------------------------------------*/ 
/*----------------------------------------------------*/ 
void rst_wdog(void) 
{ 
x25_cs=0;    //cs_5045=0; 
x25_cs=0;    //cs_5045=0; 
x25_cs=1;    //cs_5045=1; 
} 
/*----------------------------------------------------*/ 
 
void init_t0(void) 
{ 
TMOD=0x22; 
TH0=TL0=0; 
TR0=1; 
EA=ET0=1; 
} 
/* 
void watch_dog(void) 
{ 
x25_cs=0; 
x25_cs=0; 
x25_cs=1; 
} 
*/ 
uchar  r_7219(uchar iw,uchar ix); 
/*********************************************************/ 
void ex_int0(void) interrupt 0 using 2 
{ 
//dis_buff[4]++; 
COM_ptr=0; bit_count=0x08; 
COM_buff[0]=COM_key; 
//iab=COM_buff[0]; 
//dout=iabit7; 
//iab<<=1; 
//COM_buff[0]=iab; 
busy=1; second_COM=0; 
IE0=0; IE1=0; 
} 
/*********************************************************/ 
void ex_int1(void) interrupt 2 using 3 
{ 
//if(!busy) return; 
EX0=0; 
//dis_buff[5]++; 
iab=COM_buff[COM_ptr]; 
dout=iabit7; iab<<=1; 
iabit0=din; 
COM_buff[COM_ptr]=iab; 
bit_count--; 
if(bit_count==0){ 
       bit_count=0x08; 
       COM_ptr++; 
       //iab=COM_buff[COM_ptr]; 
       //dout=iabit7; 
       //iab<<=1; 
       //COM_buff[COM_ptr]=iab; 
       if(COM_ptr>3){COM_ptr=0; busy=0; flag_COM=1;}  //>3 
       } 
 EX0=1;  IE1=0; 
} 
 
/*********************************************************/ 
void t0int(void) interrupt 1 using 1 
{ 
//                     0  1      2  3      4    5  6      7    8  9    -    E    H    L     P 
code uchar seg[48]={0x81,0xbB,0xc2,0x92,0xb8,0x94,0x84,0xb3,0x80,0x90,0xfe,0xc4,0xa8,0xcD,0xe0,0xff, 
                  //0x01,0x3B,0x42,0x12,0x38,0x14,0x04,0x33,0x00,0x10,0x7e,0x44,0x28,0x4D,0x60,0xff, 
                    0x01,0x3B,0x42,0x12,0x38,0x14,0x04,0x33,0x00,0x10,0x7e,0x20,0x0c,0x45,0x0a,0x44, 
                  //  A    b   C    d    E    F    A.   b.    C.  D.  E.   F. 
                    0xa0,0x8C,0xcA,0x8A,0xc4,0xe4,0x20,0x0C,0x4A,0x0A,0x44,0x64,0x24,0x47,0x60,0xff}; 
code uchar wei[12]={0xff,0xff,      0xfe,   0xfd,   0xfb,   0xf7,          0xef,   0xdf,   0xbf,     0x7f, 0xff}; 
//                  P3.7   P3.6    P2.0    P2.1    P2.2    P2.3           P2.4    P2.5    P2.6      P2.7   P3.5 
 
dis_wei=0xff; 
disw0=disw1=diswa=1; //P3^7; 
 
key_enable=0;   //1; 
dis_out=0xff; 
key_value=KEYBORD;  key0=disw0; key1=disw1;  flag_key0=1; //dis_wei; 
key_enable=1; 
 
 
key_enable=1; 
 
dis_out=0xff;  //seg[dis_buff[dis_p]]; 
switch(dis_p){ 
    case 0: 
         //diswb=1; 
         //for(i=0;i<30;i++){} 
         disw1=disw2=disw3=disw4=disw5=disw6=disw7=disw8=disw9=diswa=1; 
         disw0=0; 
         dis_out=seg[dis_buff[dis_p]]; 
         break; 
    case 1: 
         //disw0=1; 
         //for(i=0;i<30;i++){} 
         //disw0=disw2=disw3=disw4=disw5=disw6=disw7=disw8=disw9=diswa=diswb=1; 
         disw0=1;  disw1=0; 
         dis_out=seg[dis_buff[dis_p]]; 
         break; 
    case 2: 
         //disw1=1; 
         //for(i=0;i<30;i++){} 
         //disw1=disw0=disw3=disw4=disw5=disw6=disw7=disw8=disw9=diswa=diswb=1; 
         disw1=1; disw2=0; 
         dis_out=seg[dis_buff[dis_p]]; 
         break; 
    case 3: 
         //disw2=1; 
         //for(i=0;i<30;i++){} 
         //disw1=disw2=disw0=disw4=disw5=disw6=disw7=disw8=disw9=diswa=diswb=1; 
         disw2=1; disw3=0; 
         dis_out=seg[dis_buff[dis_p]]; 
         break; 
    case 4: 
         //disw3=1; 
         //for(i=0;i<30;i++){} 
         //disw1=disw2=disw3=disw0=disw5=disw6=disw7=disw8=disw9=diswa=diswb=1; 
         disw3=1; disw4=0; 
         dis_out=seg[dis_buff[dis_p]]; 
         break; 
    case 5: 
         //disw4=1; 
         //for(i=0;i<30;i++){} 
         //disw1=disw2=disw3=disw4=disw0=disw6=disw7=disw8=disw9=diswa=diswb=1; 
         disw4=1; disw5=0; 
         dis_out=seg[dis_buff[dis_p]]; 
         break; 
    case 6: 
         //disw5=1; 
         //for(i=0;i<30;i++){} 
         //disw1=disw2=disw3=disw4=disw5=disw0=disw7=disw8=disw9=diswa=diswb=1; 
         disw5=1; disw6=0; 
         dis_out=seg[dis_buff[dis_p]]; 
         break; 
    case 7: 
         //disw6=1; 
         //for(i=0;i<30;i++){} 
         //disw1=disw2=disw3=disw4=disw5=disw6=disw0=disw8=disw9=diswa=diswb=1; 
         disw6=1; disw7=0; 
         dis_out=seg[dis_buff[dis_p]]; 
         break; 
    case 8: 
         //disw7=1; 
         //for(i=0;i<30;i++){} 
         //disw1=disw2=disw3=disw4=disw5=disw6=disw7=disw0=disw9=diswa=diswb=1; 
         disw7=1; disw8=0; 
         dis_out=seg[dis_buff[dis_p]]; 
         break; 
    case 9: 
         //disw8=1; 
         //for(i=0;i<30;i++){} 
         //disw1=disw2=disw3=disw4=disw5=disw6=disw7=disw8=disw0=diswa=diswb=1; 
         disw8=1;disw9=0; 
         dis_out=dis_buff[dis_p];  //bit display 
         break; 
    case 10: 
         //disw9=1; 
         //for(i=0;i<30;i++){} 
         //disw1=disw2=disw3=disw4=disw5=disw6=disw7=disw8=disw9=disw0=diswb=1; 
         disw9=1; diswa=0; 
         dis_out=dis_buff[dis_p];  //位操作 
         break; 
    default: 
         disw0=1; 
         disw1=disw2=disw3=disw4=disw5=disw6=disw7=disw8=disw9=diswa=1; 
         break; 
    } 
 
dis_p++; 
if(dis_p>10)dis_p=0;  //&=0x07; //3?? 
 
 
/* 
switch(dis_p){ 
    case 0: 
         dis_wei2=1; dis_wei0=0; //dis_wei1=dis_wei2=1; 
         dis_out=seg[dis_buff[dis_p]]; 
         break; 
    case 1: 
         dis_wei0=1;  dis_wei1=0; 
         dis_out=seg[dis_buff[dis_p]]; 
         break; 
    case 2: 
         dis_wei0=dis_wei1=dis_wei2=1; 
    case 3: 
    case 4: 
    case 5: 
    case 6: 
    case 7: 
    case 8: 
         dis_wei&=wei[dis_p]; 
         dis_out=seg[dis_buff[dis_p]]; 
         break; 
    case 9: 
         //dis_wei0=dis_wei1=dis_wei2=1; 
         dis_wei&=wei[dis_p]; 
         dis_out=dis_buff[dis_p]; 
         break; 
    case 10: 
         dis_wei2=0; //dis_wei0=dis_wei1=1; 
         dis_out=dis_buff[dis_p]; 
         break; 
    default: 
         dis_wei2=dis_wei0=dis_wei1=1; 
         dis_p=0; 
         break; 
    } 
dis_p++; 
if(dis_p>10)dis_p=0;  //&=0x07; //3?? 
      */ 
us250++; 
if(!(us250^122)){ 
    us250=0; 
    ms50++; T_key++; 
    if(ms50&0x20){ 
         ms50=0; 
        second++; second1++; second_COM++; 
        if(second>=60){ 
              second=0; minuter++; 
              } 
        } 
    } 
} 
/*********************************************************/ 
void t1int(void) interrupt 3 using 2 
{ 
return; 
} 
/*---------------------------------------------------------*/ 
void itoa(int x,unsigned char *str2) 
{ 
data unsigned int n; 
data unsigned char chn,*p,str1[5],*str; 
data unsigned char i,j; 
str=str2; 
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;i9999)x=9999; 
itoa(x,str); 
for(i=0;i<4;i++)str[i]&=0x0f; 
//str[2]|=0x10; 
if(x<=999){ 
	if(x>99){ 
              //for(i=0;i<3;i++)str[i]=str[i-1]; str[0]=0x0f; 
              }else{ 
              if(x>9){ 
                  str[2]=str[1]; str[1]=str[0];   str[0]=0x0f; 
                  }else{ 
                  str[2]=str[0]; str[1]=0x10;  str[0]=0x0f; 
                  } 
	      } 
	} 
if(x<=999) str[1]|=0x10; 
if(x<1150){ 
     if(chl==1)for(i=0;i<3;i++)dis_buff[i]=str[i]; 
             else 
             for(i=0;i<3;i++)dis_buff[3+i]=str[i]; 
     }else{ 
     if(chl==1)for(i=0;i<3;i++)dis_buff[i]=0x0a;   //display '---' 
             else 
             for(i=0;i<3;i++)dis_buff[3+i]=0x0a;   //display '---' 
     } 
} 
/*----------------------------------------------------*/ 
/*----------------------------------------------------*/ 
void is_up_down_key(char *buff,uchar n) 
{ 
data char *p1; 
//n=n1; 
p1=buff; 
if(key_up){ 
	*(p1+n)+=1; 
	if(speed==1) *(p1+n)+=10; 
	}else{ 
 
	*(p1+n)-=1; 
	if(speed==1) *(p1+n)-=10; 
	} 
while(key_sfr!=0xff)getkey(); 
key_sfr0=0; 
} 
/*----------------------------------------------------*/ 
/*----------------------------------------------------*/ 
void is_up_down_key2(char *buff,uchar n) 
{ 
data char *p1; 
//n=n1; 
p1=buff; 
if(key_up2){ 
	*(p1+n)+=1; 
	if(speed==1) *(p1+n)+=10; 
	}else{ 
 
	*(p1+n)-=1; 
	if(speed==1) *(p1+n)-=10; 
	} 
while(key_sfr!=0xff)getkey(); 
key_sfr0=0; 
} 
/*----------------------------------------------------*/ 
/*---------------------------------------------------------*/ 
 
 
 
void main(void) 
{ 
data uchar work,i,ch,ch1,count1; 
data uint count; 
SP=0xef; 
P2=P3=P0=0xff; 
for(count=0;count<0xd0;count++){ ch=0; } 
for(count=0;count<0xd000;count++){ ch=0; rst_wdog();} 
 
/* 
for(i=0;i<16;i++)str[i]=i+'0'; 
save_buff(str,1); 
for(i=0;i<16;i++)str[i]=0; 
get_buff(str,1); 
*/ 
init_t0(); 
IT0=IT1=1; 
PX0=1; PX1=1; IE0=IE1=0; EX0=EX1=1; 
for(i=0;i<12;i++) dis_buff[i]=0x0f; 
dis_buff[9]=0x0ff; dis_buff[10]=0x0ff; 
//dis_buff[0]=COM_buff[0]=0;  dis_buff[1]=COM_buff[1]=0;  // }  //i+count; 
COM_ptr=0; busy=0; flag_COM=0; 
/* 
dis_buff[1]=2; 
dis_buff[2]=0x0a; 
dis_buff[3]=4; 
*/ 
//call_sub_set1(); 
 
work=second; 
count=0;  count1=0; COM_key=0; int_key=1; 
while(1){ 
     while(work==second){  //==work){ 
           if(flag_COM) break;  //{ 
                  //flag_COM=0; 
                  //dis_buff[COM_buff[0]]=COM_buff[1]; 
                  //} 
           rst_wdog(); 
           } 
     work=second; 
     IT0=IT1=1; 
     PX0=1; PX1=1; TR0=ET0=EX0=EX1=EA=1; 
 
     //second1=0; 
     getkey(); 
     if(key_sfr!=0xff){ 
           COM_key=key_sfr; //取键值 0---8 
      	   flag_key=0; 
	   //while(key_sfr!=0xff){getkey();flag_key=0;} 
	   //key_sfr0=0; 
           int_key=0;  //发送按键中断申请脉冲 
           for(i=0;i<5;i++){} 
           int_key=1; 
      	   //flag_key=0; 
	   while(key_sfr!=0xff){getkey();flag_key=0;} 
	   //key_sfr0=0; 
           }else{ 
           COM_key=0xff; 
           } 
//   if(key_set) call_sub_set1(); 
//   if(key_set2) call_sub_set2(); 
   if(flag_COM){ 
       //dis_buff[6]++; if(dis_buff[6]>9)dis_buff[6]=0; 
       flag_COM=0; 
       //dis_buff[COM_buff[0]]=COM_buff[1]; 
       ch=COM_buff[0]&0x0f; 
       //if(flag_unit2)ch=unit2[COM_buff[0]]; else ch=unit1[COM_buff[0]]; 
       ch=ch&0x0f; 
       if(ch<0x09){ 
          ch1=COM_buff[1]&0x8f; 
          if(ch1&0x80)ch1=(ch1&0x0f)|0x10; 
          dis_buff[ch]=ch1;   //COM_buff[1]&0x0f; 
          }else{ 
          if(ch<0x0b)dis_buff[ch]=~COM_buff[1];   //位操作 bit=0 lamp on 
          } 
       COM_buff[0]=0xff; 
       } 
   if(busy){ 
       if(second_COM>2){  busy=0; flag_COM=0;} 
       } 
   //dis_buff[0]=COM_buff[0];  dis_buff[1]=COM_buff[1]; 
   //dis_buff[4]=dis_buff[5]=dis_buff[7]=0x0f; 
   //dis_buff[8]=count; 
   //for(i=0;i<11;i++)dis_buff[i]=count+i; 
   count++;   count1++; 
   if(count>40)count=0; 
     } 
}