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

📄 4x16c_16key_c51.c

📁 键盘程序236534746585765767968
💻 C
字号:
#include <reg51.h>
#include <stdio.h>
#include <string.h>
#include <intrins.h>

#define uchar unsigned char 

#define OUT_CH 16                                   //number of Outputa channal 
#define IN_CH 32                                    //number of input channal


#define lout_adr 2                                  //The last opreation record in AT24C01
#define av_adr   1
#define vid_adr lout_adr                          //Video CH first adress in AT24C01
#define aud_adr vid_adr+OUT_CH                           //Audio CH first adress in AT24C01

uchar AV_def,out_def,in_def;

sbit RS = P2^7;
sbit RW = P2^6;
sbit En = P2^5;

//in i2c.c
extern void Write_One_Byte(char addr,char thedata);  
//extern void Write_A_Page(char *buffer,char addr);
extern char Read_One_Byte(char addr);
//extern void Read_N_Bytes(char *buffer,char n,char addr);
//in serial.c
extern serial_init();                                //Baud=9600,8,N,1  cystal 7.3728MHz
//in key_scan.c
extern uchar key_volume();
//in hd44780.c
extern LCD_init(void);
extern LCD_disp(uchar,uchar *);
extern LCD_word(uchar,uchar);
extern ms_delay(uchar);
extern menu_display(void);
extern num_display(uchar num,uchar row,uchar column);  
extern in_out_display(uchar in,uchar out);


void send_command(uchar d1,uchar d2,uchar d3,uchar d4){

			 SBUF=d1;while(TI==0);TI=0;ms_delay(30);
			 SBUF=d2;while(TI==0);TI=0;ms_delay(30);
			 SBUF=d3;while(TI==0);TI=0;ms_delay(30);
			 SBUF=d4;while(TI==0);TI=0;ms_delay(30);  
}


void sw_command(uchar av,uchar out,uchar in){
    uchar l_in;

             switch(av){
                        case 0xa1:
                                  l_in=Read_One_Byte(vid_adr+out);
                                  send_command(av,out,l_in,in);
                        break;
                        case 0xa2:
                                  l_in=Read_One_Byte(aud_adr+out);
                                  send_command(av,out,l_in,in);
                        break;
                        case 0xa0:
                                  l_in=Read_One_Byte(vid_adr+out);
                                  send_command(0xa1,out,l_in,in);
                                  l_in=Read_One_Byte(aud_adr+out);
                                  send_command(0xa2,out,l_in,in);
                        break;
             }     
}


sw_init(){

   uchar i,in;
/*
   for(i=1;i<=OUT_CH;i++){
           in=Read_One_Byte(vid_adr+i);
           send_command(0xa1,i,1,in);
   }
*/   
   for(i=1;i<=OUT_CH;i++){
           in=Read_One_Byte(aud_adr+i);
           ms_delay(30);


           send_command(0xa2,i,0,in);
   } 
/*
   for(i=1;i<=2*OUT_CH+2;i++){
           in=Read_One_Byte(i);
			 SBUF=in;while(TI==0);TI=0;ms_delay(20);  
   }
*/
  
}


uchar ascii_hex(uchar n1,uchar n0){

    uchar c,c0,c1;

             c0=n0;
             c0=c0<<4;
             c0=c0>>4;
             c1=n1;
             c1=c1<<4;
             c1=c1>>4;
			 c=10*c1+c0;
	return c;						
}


void key_up(void){
     uchar c;
			do{
               c = key_volume();
			}while(c!=0x47);
}


void AV_display(uchar av,uchar out){

      LCD_disp(0x0e,"     ");  //Clear Display aera
      if(av==0xa0)LCD_disp(0x0f,"A V");
      if(av==0xa1)LCD_disp(0x0e,"Video");
      if(av==0xa2)LCD_disp(0x0e,"Audio");
	  if(av==0xa2)in_out_display(Read_One_Byte(aud_adr+out),out);
	  if(av==0xa0||av==0xa1)in_out_display(Read_One_Byte(vid_adr+out),out);

}


void write_eeprom(uchar av,uchar out,uchar in){

        if(av==0xa2)Write_One_Byte(aud_adr+out,in);					
        if(av==0xa1)Write_One_Byte(vid_adr+out,in);
        if(av==0xa0){
                     Write_One_Byte(vid_adr+out,in);
                     Write_One_Byte(aud_adr+out,in);
        }

        //in_out_display(in,out);

        Write_One_Byte(lout_adr, out);
        Write_One_Byte(av_adr,    av);
        AV_display(av,out);
}


void key_process(uchar key){
    uchar n0,n1,num_in_def,n_flag=0;
 
        switch(key){
		            case 65: //AV
					         AV_def=0xa0;
                             AV_display(0xa0,out_def);
							 break;
					case 66: //AUD
					         AV_def=0xa2;
                             AV_display(0xa2,out_def);
                             break;
					case 67: //VID
					         AV_def=0xa1;
                             AV_display(0xa1,out_def);
							 break;
					case 68: //OUT
                             if(num_in_def>0&&num_in_def<=OUT_CH)out_def=num_in_def;                             
							 if(AV_def==0xa0||AV_def==0xa1)in_out_display(Read_One_Byte(vid_adr+out_def),out_def);
							 //AV disp 
                             if(AV_def==0xa2)in_out_display(Read_One_Byte(aud_adr+out_def),out_def);//Audio disp 
				             n_flag=n1=n0=0;
                             num_in_def=0;
                             num_display(num_in_def,2,14);
					         break;
					case 69: //IN
                             if(num_in_def>0&&num_in_def<=IN_CH)in_def=num_in_def;
					         break;
					case 70: //ENT
							 sw_command(AV_def,out_def,in_def);
                             write_eeprom(AV_def,out_def,in_def);
			                 num_in_def=0;
							 n_flag=n1=n0=0;
							 break;

        }
        if(key>=0x30&&key<=0x39){
		        n_flag=n1;
			    n1=n0;
				n0=key;
//				if(n_flag!=0)n_flag=n1=n0=0;
                num_in_def=ascii_hex(n1,n0);		 

/*				if(num_in_def>IN_CH){
				                     num_in_def=0;
									 n_flag=n1=n0=0;
				}*/
                num_display(num_in_def,2,14);
        }

        key=0;
}


void key_message(){

   uchar key;
   key = key_volume();
   if(key==71)return;
   key_process(key);
   key_up();

}


serial_message(){
   uchar s1,s2,s3,s4,s5;
             if(RI!=0){
                       RI=0;
                       s1=s2;s2=s3;s3=s4;s4=s5;s5=SBUF;
             }
                        if(s5=='a') write_eeprom(0xa1,1,1);

             if(s1=='A'||s1=='V'||s1=='C'){
			 

                    if(s1=='A')AV_def=0xa2;
                    if(s1=='V')AV_def=0xa1;
                    if(s1=='C')AV_def=0xa0;
                         out_def=ascii_hex(s2,s3);
                         in_def =ascii_hex(s4,s5);
                         sw_command(AV_def,out_def,in_def);
                         write_eeprom(AV_def,out_def,in_def);
                         s1=s2=s3=s4=s5=0x00;
             }
}


void sys_init(){
   uchar out;
   RS=WR=En=0;
   serial_init();       
   LCD_init();
   ms_delay(10);
   LCD_disp(0x00,"  Waiting...");
   sw_init();
   ms_delay(10);
   menu_display();   

   ms_delay(10);   
   P1=0;
   ms_delay(20);   

   //display last opreating status 
   out   =Read_One_Byte(1);  // i2c heating

  AV_def=Read_One_Byte(av_adr);
   out=Read_One_Byte(lout_adr);
   AV_display(AV_def,out);  
   
   LCD_disp(0x00,"Pass!");
    
   key_process(0x30);
   key_process(0x30);

}


void main(void){

   sys_init();
      
   while(1){ 
            key_message();
	        serial_message();       
   }
}

⌨️ 快捷键说明

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