📄 4x16c_16key_c51.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 + -