| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 519 人关注过本帖
标题:求助能不能给加个注释 谢谢
只看楼主 加入收藏
mcmong359
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2008-11-25
结帖率:100%
收藏
 问题点数:0 回复次数:3 
求助能不能给加个注释 谢谢

#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);
    }
  }
}

搜索更多相关主题的帖子: 注释 
2010-04-29 07:06
mcmong359
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2008-11-25
收藏
得分:0 
在这里先谢谢各位了
2010-04-29 07:06
明王朝
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:58
专家分:196
注 册:2009-11-3
收藏
得分:0 
程序好长……
2010-04-29 07:09
mcmong359
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2008-11-25
收藏
得分:0 
程序是长了点 但是谢谢各位了
2010-04-29 07:18
快速回复:求助能不能给加个注释 谢谢
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.042514 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved