求助能不能给加个注释 谢谢
#include "stc12.h"
#define CMDOFF 0X00;
#define CMDON 0X01;
#define CMDLDCOFF 0X02;
#define CMDLDCON 0X03;
#define WAIT_TIME 0X02;//EPROM等待时间
#define ISP_BYTE_PRO 0X02;
#define ISP_BYTE_READ 0X01;
#define ISP_SECTOR_ERASE 0X03;
sbit DI =P2^3;//液晶数据命令传输引脚
sbit WR =P2^4;//液晶读写时钟引脚
sbit CS1 =P2^6;//液晶模组IC1片选引脚
sbit CS2 =P2^7;//液晶模组IC2片选引脚
sbit DA_DATA=P2^0; //DAC串行数据输入
sbit DA_CLK=P2^1;//DAC串行输入时钟
sbit DA_LOAD=P2^2;
unsigned char bdata dac_ad;
sbit dac_ad7=dac_ad^7;
sbit b_RING=dac_ad^5;
unsigned char bdata dac_dat;
sbit dac_dat7=dac_dat^7;
sbit key_up=P3^2;
sbit key_enter=P1^5;
sbit key_mode=P1^6;
sbit key_down=P1^7;
unsigned char bdata command;//命令变量
sbit com_7=command^7;
unsigned char bdata data1;//数据变量
sbit data_0=data1^0;
unsigned char bdata add;//地址变量
sbit add_5=add^5;
unsigned char data count=0;
unsigned char data count1=0;
unsigned char code number1[]={0x99,0xd1,0x00,0x50,0x95,0xE1,0x94,0xF1,0x0C,0x70,0x9C,0xB1,0x9D,0xB1,0x80,0xD0,0x9D,0xF1,0x9C,0xF1,0X42,0X0A,0XA0,0X84,0X0D,0X70
,0X8D,0XE0,0X04,0X20,0X19,0X01,0X04,0X20,0X00,0X00};
unsigned char code num1_add[7]={24,0,3,7,11,15,19};
unsigned char code number2[10]={0XF5,0X60,0XB6,0XF2,0X63,0XD3,0XD7,0X70,0XF7,0XF3};
unsigned char data k=0;
unsigned char bdata flags=0x00;//标识符变量
sbit set_F=flags^0;//该项设置完成1,0未完成
unsigned char bdata key_flags=0x00; //按键标识符变量
sbit key_pressF=key_flags^0;//按键按下标志
sbit key_sucessF=key_flags^1;//按键成功标志
sbit key_5sF=key_flags^2;
unsigned char bdata keycode=0x00;
sbit keycode_up=keycode^0;
sbit keycode_enter=keycode^1;
sbit keycode_mode=keycode^2;
sbit keycode_down=keycode^3;
unsigned char data keycode_s=0x00;
unsigned char data key_timeF=0;
unsigned int data key_count=0;
unsigned char data AI1,AI2,N1,N2,TYPE;
unsigned char data var;//当前变量
delay()
{
unsigned char i;
for(i=0;i<=1;i++);
}
/***********************************
EPROM写字节函数,只能写入为空的(0xff)的地址单元
参数:EP_add 写入地址的高字节和低字节
EP_data 写入的字节数据
***********************************/
void WR_EP(unsigned char EP_addH,unsigned char EP_addL,unsigned char EP_data)
{
ISP_DATA=EP_data;
ISP_ADDRH=EP_addH;
ISP_ADDRL=EP_addL;
ISP_CONTR=WAIT_TIME;
ISP_CONTR|=0X80;
ISP_CMD=ISP_BYTE_PRO;
ISP_TRIG=0X46;
ISP_TRIG=0XB9;
}
/***********************************
EPROM读字节函数
参数:EP_add 需要读取地址的高字节和低字节
***********************************/
unsigned char RE_EP(unsigned char EP_addH,unsigned char EP_addL)
{
unsigned char EP_data;
ISP_ADDRH=EP_addH;
ISP_ADDRL=EP_addL;
ISP_CONTR=WAIT_TIME;
ISP_CONTR|=0X80;
ISP_CMD=ISP_BYTE_READ;
ISP_TRIG=0X46;
ISP_TRIG=0XB9;
EP_data=ISP_DATA;
return EP_data;
}
/***********************************
EPROM擦除扇区
参数:EP_add 需要擦除扇区地址的高字节和低字节
***********************************/
void SECTOR_ERASE(unsigned char EP_addH,unsigned char EP_addL)
{
ISP_ADDRH=EP_addH;
ISP_ADDRL=EP_addL;
ISP_CONTR=WAIT_TIME;
ISP_CONTR|=0X80;
ISP_CMD=ISP_SECTOR_ERASE;
ISP_TRIG=0X46;
ISP_TRIG=0XB9;
}
/***********************************
DA设置函数
参数:add,选择输出通道,00、01、10、11
data,8位数据
ring,0,1
***********************************/
void DAC_SET(unsigned char da_add,unsigned char da_data,unsigned char ring)
{
unsigned char i;
dac_ad=da_add;
dac_ad<<=6;
if(ring==1)
b_RING=1;
dac_dat=da_data;
DA_LOAD=1;
for(i=1;i<=3;i++) //写入地址和ring
{
DA_DATA=dac_ad7;
DA_CLK=1;
DA_CLK=0;
dac_ad<<=1;
}
for(i=1;i<=8;i++) //送8位数据
{
DA_DATA=dac_dat7;
DA_CLK=1;
DA_CLK=0;
dac_dat<<=1;
}
DA_LOAD=0;
DA_LOAD=1;
}
/***********************************
LCD写命令函数
参数:CS片选 1选择芯片1,2选择芯片2
命令字预置在全局变量command中
***********************************/
void LCD_Com(unsigned char CS)
{
unsigned char data i;
if(CS==1)CS1=0;
else if(CS==2)CS2=0;//选择芯片
DI=1;
WR=0;
delay();
WR=1;
delay();
DI=0;
WR=0;
delay();
WR=1;
delay();
DI=0;
WR=0;
delay();
WR=1;//先送100
delay();
for(i=1;i<=8;i++)//送8位命令字
{
DI=com_7;
WR=0;
delay();
WR=1;
delay();
command<<=1;
}
DI=0;
WR=0;
delay();
WR=1;
delay();
if(CS==1)CS1=1;
else if(CS==2)CS2=1;
DI=1;
return;
}
/***********************************
LCD写数据函数,一次写入8bit
参数:CS片选 1选择芯片1,2选择芯片2
地址预置在add变量中
数据预置在data1变量中
***********************************/
void LCD_Data(unsigned char CS)
{
unsigned char data i;
if(CS==1)CS1=0;
else if(CS==2)CS2=0;//选择芯片
DI=1;
WR=0;
delay();
WR=1;
delay();
DI=0;
WR=0;
delay();
WR=1;
delay();
DI=1;
WR=0;
delay();
WR=1;//先送101
delay();
for(i=1;i<=6;i++)//送6位地址
{
DI=add_5;
WR=0;
delay();
WR=1;
delay();
add<<=1;
}
for(i=1;i<=8;i++)//送8位数,低位在前,高位在后
{
DI=data_0;
WR=0;
delay();
WR=1;
delay();
data1>>=1;
}
DI=0;
WR=0;
delay();
if(CS==1)CS1=1;
else if(CS==2)CS2=1;
DI=1;
return;
}
/***********************************
LCD写数据函数,一次写入4bit
参数:CS片选 1选择芯片1,2选择芯片2
地址预置在add变量中
数据预置在data1变量低4位中
***********************************/
void LCD_Data1(unsigned char CS)
{
unsigned char data i;
if(CS==1)CS1=0;
else if(CS==2)CS2=0;//选择芯片
DI=1;
WR=0;
delay();
WR=1;
delay();
DI=0;
WR=0;
delay();
WR=1;
delay();
DI=1;
WR=0;
delay();
WR=1;//先送101
delay();
for(i=1;i<=6;i++)//送6位地址
{
DI=add_5;
WR=0;
delay();
WR=1;
delay();
add<<=1;
}
for(i=1;i<=4;i++)//送4位数,低位在前,高位在后
{
DI=data_0;
WR=0;
delay();
WR=1;
delay();
data1>>=1;
}
DI=0;
WR=0;
delay();
if(CS==1)CS1=1;
else if(CS==2)CS2=1;
DI=1;
return;
}
/***********************************
显示最下行数字字母函数
参数:pos 显示位置0~6
num 显示内容0~9
***********************************/
void DISP_NUM1(unsigned char pos,unsigned char num)
{
if(pos!=1)//如果是显示1、3、4、5、6、7位
{
add=num1_add[pos];
data1=number1[2*num];
LCD_Data(2);
add=num1_add[pos]+2;
data1=number1[2*num+1];
LCD_Data(2);
}
else//如果是显示第二位
{
add=1;
data1=number1[2*num+1];
LCD_Data(2);
add=28;
data1=number1[2*num];
LCD_Data1(2);
add=0;
LCD_Data1(2);
}
return;
}
/***********************************
显示中间数字字母函数
参数:pos 显示位置0~3
num 显示内容0~9
dot 是否显示小数点,1显示,0不显示
***********************************/
void DISP_NUM2(unsigned char pos,unsigned char num,unsigned char dot)
{
add=2*(pos+3);
data1=number2[num];
if(dot==1)
{
data1|=0x08;
}
LCD_Data(1);
}
/***********************************
LCD清屏函数函数
***********************************/
void CL_LCD(void)
{
unsigned char i;
data1=0;
for(i=0;i<=32;i+=2)
{
add=i;
LCD_Data(1);
add=i;
LCD_Data(2);
}
}
/***********************************
LCD清除函数,清除addr内的4bit数据
***********************************/
void CLEAR(unsigned char addr,unsigned char CS_S)
{
data1=0;
add=addr;
LCD_Data(CS_S);
}
/***********************************
按键处理函数
***********************************/
void Key_P(void)
{
if(TYPE==0XFF)//如果是设置状态
{
switch(keycode)
{
case 0x02:set_F=1;break;//确定键
case 0x01:var++;break;//当前变量加1
case 0x08:var--;break;//当前变量减1
default:break;
}
}
else
{
if(key_5sF==1)
{;}//如果超过5秒按键
else //否则根据键值响应
{
switch(keycode)
{
case 0x01:DISP_NUM1(1,1);DAC_SET(0x00,0xff,1);break;
case 0x02:DISP_NUM1(1,2);DAC_SET(0x01,0xff,1);break;
case 0x04:DISP_NUM1(1,3);break;
case 0x08:DISP_NUM1(1,4);break;
}
}
}
}
/***********************************
键盘扫描函数
***********************************/
void Key_Scan(void)
{
keycode_up=~key_up;
keycode_enter=~key_enter;
keycode_mode=~key_mode;
keycode_down=~key_down; //读取各位按键
if(keycode!=0)//如果有键按下
{
switch(key_flags)
{
case 0x00:key_pressF=1;//如果是新按下的键
keycode_s=keycode;//保存键值
break;
case 0x01:if(keycode_s==keycode) //如果去抖时间到且和去抖前键值相同
{
key_sucessF=1;//按键成功标志
Key_P();//调按键处理程序
}
else//两次键值不等
{
key_flags=0x00;//清除所有标志位
return;//返回
}
break;
case 0x03://按键成功且已处理完一次
if(keycode_s==keycode)
{
key_count++;
if(key_count==500)//5s后按键没有放开
{
key_5sF=1;
Key_P();//调按键处理程序
}
}
break;
default:break;
}
}
else//所有按键为抬起状态
{
key_flags=0x00;//清除所有标志位
key_count=0;
keycode=0x00;
}
}
/*******************************
T0初始化函数
16位定时器工作模式,11.0592M晶振
10ms定时
*******************************/
void T0_INI(void)
{
TMOD=0X01;//定时器0工作在16位计时模式下m1m0=01
TH0=0XDC;
TL0=0X00;
ET0=1;//允许T0中断
}
/*******************************
AD初始化函数
chanel 选择AD通道
*******************************/
void AD_INT(unsigned char chanel)
{
ADC_CONTR|=0X80;//打开AD电源
P1M0|=0X03;
P1M0|=0X03;//P1.0,P1.1设为开漏输入
if(chanel==0)
ADC_CONTR=0XE0;
else ADC_CONTR=0XE1;
ADC_DATA=0;
ADC_CONTR|=0X08;//启动AD
}
/*********************************
TO中断函数10ms定时中断
*********************************/
void T0_ISR(void) interrupt 1
{
TH0=0XDC;
TL0=0X00;
key_timeF=1;//扫描键盘时间到
count++;
}
/*********************************
读取EPROM中参数到内存
*********************************/
void READ_EP(void)
{
TYPE=RE_EP(0X00,0X00);
AI1=RE_EP(0X00,0X01);
AI2=RE_EP(0X00,0X02);
N1=RE_EP(0X00,0X03);
N2=RE_EP(0X00,0X04);
}
void main(void)
{
command=CMDON;
LCD_Com(1);
command=CMDLDCON;
LCD_Com(1);
command=0x29;
LCD_Com(1);
command=CMDON;
LCD_Com(2);
command=CMDLDCON;
LCD_Com(2);
command=0x29;
LCD_Com(2);
CL_LCD();
//变量初始化
T0_INI();//初始化t0
key_up=1;
key_enter=1;
key_mode=1;
key_down=1;
EA=1;
TR0=1;//启动定时器0计数
while(1)
{
READ_EP();//读取参数
if(TYPE==0XFF)//型号还未设置
{
AI1=10;
AI2=10;
N1=0;
N2=0;
SECTOR_ERASE(0X00,0X00);//清EPROM参数区
DISP_NUM1(0,15);//显示L
DISP_NUM1(1,8);//显示8
DISP_NUM1(2,16);//显示--
var=AI1;
while(set_F==0)//等待设置AI1
{
if(key_timeF==1)//扫描按键时间到
{
key_timeF=0;
Key_Scan();//扫描按键
if(var==12)
var=10;
if(var==9)
var=11;
}
if(count==50)
{
DISP_NUM1(3,var);
}
if(count==100)
{
count=0;
DISP_NUM1(3,17);
}
}
while(1);
}
}
}