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

📄 zhjc.c

📁 51系列单片机的汇编程序包
💻 C
📖 第 1 页 / 共 2 页
字号:
/*======================================
  程序名称:达爱思实验装置综合检测程序
  程序设计:高敏杰  Jerry0513@126.com
----------------------------------------
  源文件名:dete51c.c
  创建时间:2004-12-07
  编程语言:KEIL/Franklin C51
  编译选项:BANK 0, OPTIMIZE(0), SMALL
  开发环境:Dais集成开发环境 V3.0
  运行环境:Dais-958PT+ & 综合检测状态
======================================*/

#include <reg51.h>


#define uint      unsigned int
#define uchar     unsigned char
#define NoDisp    0
#define NeedDisp  1

//#define RecPlayCs   0x8e18
/* LCD液晶显示器 */
#define wrcode    0
#define wrdata    1

#define x1        0x80
#define x2        0x88
#define y         0x80

#define LCD_X     0x30
#define LCD_Y     0x31
#define LCD_X1    0x32
#define LCD_Y1    0x33
#define COUNT     0x34
#define COUNT1    0x35
#define COUNT2    0x36
#define COUNT3    0x37
#define LCD_DATA  0x38
#define LCD_DATA1 0x39
#define LCD_DATA2 0x3A

uchar xdata *WRCODE = 0x8e08;           //0x80e4;  /*写命令*/
uchar xdata *WRDATA = 0x8e09;           //0x80e5;  /*写数据*/
uchar xdata *RDSTAT = 0x8e0a;           //0x80e6;  /*读状态*/
uchar xdata *RDDATA = 0x8e0b;           //0x80e7;  /*读数据*/

/* 8255并行口 */
uchar xdata *CS8255 = 0xffff;           //0x8063;  /*控制命令*/
uchar xdata *OUTSEG = 0xfffc;           //0x8060;  /*字形控制口*/
uchar xdata *OUTBIT = 0xfffd;           //0x8061;  /*字位/键扫控制口*/
uchar xdata *IN_KEY = 0xfffe;           //0x8062;  /*键盘读入口*/

/* 左边16个数字键定义 */
#define kbA0 5
#define kbA1 1
#define kbA2 9
#define kbA3 17
#define kbA4 4
#define kbA5 12
#define kbA6 20
#define kbA7 0
#define kbA8 8
#define kbA9 16
#define kbAA 24
#define kbAB 28
#define kbAC 25
#define kbAD 29
#define kbAE 21
#define kbAF 13
/* 右边16个功能键定义 */
#define kbB0 7
#define kbB1 3
#define kbB2 11
#define kbB3 19
#define kbB4 6
#define kbB5 14
#define kbB6 22
#define kbB7 2
#define kbB8 10
#define kbB9 18
#define kbBA 26
#define kbBB 30
#define kbBC 27
#define kbBD 31
#define kbBE 23
#define kbBF 15

/* ADC0809 */
uchar xdata *CS0809 = 0x8e28;           //0x80e8;

/* DAC0832 */
uchar xdata *CS0832 = 0x8c00;           //0x80c0;
#define DA_0V  0x80
#define DA_2V5 0xc0
#define DA_5V  0xff

/* I/O, 244/273 */
uchar xdata *CS_IO  = 0x8e00;           //0x80e0;

/*闭环,374*/
uchar xdata *cs_374 = 0x8E0C;
/* 8253 */
uchar xdata *CS8253 = 0x8203;           //0x8023;
uchar xdata *CS8253CNT0 = 0x8200;       //0x8020;

/* 16x16端口地址及字形代码 */
uchar xdata *HROW   = 0x8a03;           //0x80ab;  /*列代码高八位字形 273(4)*/
uchar xdata *LROW   = 0x8a00;           //0x80a8;  /*列代码低八位字形 273(1)*/
uchar xdata *HLINE  = 0x8a02;           //0x80aa;  /*行扫描高八位字位 273(3)*/
uchar xdata *LLINE  = 0x8a01;           //0x80a9;  /*行扫描低八位字位 273(2)*/
uchar code  FontData_DA[32] =
{ /*达*/
  0x00,0x00,0x40,0x80,0x30,0x80,0x10,0x80,
  0x0F,0xFC,0x00,0x80,0x00,0x80,0xE0,0x80,
  0x21,0x40,0x21,0x20,0x22,0x18,0x24,0x0C,
  0x28,0x08,0x50,0x02,0x8F,0xFC,0x00,0x00
};
uchar code  FontData_AI[32] =
{ /*爱*/
  0x00,0xF8,0x3F,0x90,0x12,0x10,0x09,0x20,
  0x3F,0xFE,0x22,0x02,0x42,0x00,0x3F,0xFC,
  0x04,0x00,0x07,0xF0,0x0C,0x20,0x0B,0x40,
  0x10,0xC0,0x63,0x30,0x8C,0x0E,0x30,0x04
};
uchar code  FontData_SI[32] =
{ /*思*/
  0x00,0x00,0x1F,0xF8,0x11,0x08,0x11,0x08,
  0x1F,0xF8,0x11,0x08,0x11,0x08,0x1F,0xF8,
  0x00,0x00,0x01,0x00,0x08,0x88,0x48,0x84,
  0x48,0x16,0xC8,0x12,0x07,0xF0,0x00,0x00
};
uchar code  FontData_CHAN[32] =
{ /*产*/
  0x01,0x00,0x00,0x80,0x7F,0xFE,0x08,0x10,
  0x06,0x20,0x24,0x44,0x3F,0xFE,0x20,0x00,
  0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,
  0x40,0x00,0x40,0x00,0x80,0x00,0x00,0x00
};
uchar code  FontData_PIN[32] =
{ /*品*/
  0x00,0x00,0x0F,0xF0,0x08,0x10,0x08,0x10,
  0x08,0x10,0x0F,0xF0,0x08,0x10,0x00,0x00,
  0x7E,0xFC,0x42,0x84,0x42,0x84,0x42,0x84,
  0x42,0x84,0x7E,0xFC,0x42,0x84,0x00,0x00
};
uchar code  FontData_JI[32] =
{ /*技*/
  0x10,0x20,0x10,0x20,0x10,0x20,0xFD,0xFE,
  0x10,0x20,0x14,0x20,0x19,0xFC,0x31,0x08,
  0xD0,0x88,0x10,0x90,0x10,0x60,0x10,0x60,
  0x10,0x90,0x11,0x0E,0x56,0x04,0x20,0x00
};
uchar code  FontData_SHU[32] =
{ /*术*/
  0x01,0x00,0x01,0x20,0x01,0x10,0x01,0x00,
  0xFF,0xFE,0x01,0x00,0x03,0x80,0x05,0x40,
  0x05,0x20,0x09,0x10,0x11,0x18,0x21,0x0E,
  0xC1,0x04,0x01,0x00,0x01,0x00,0x00,0x00
};
uchar code  FontData_DE[32] =
{ /*的*/
  0x10,0x80,0x10,0x80,0x20,0x80,0x7C,0xFC,
  0x45,0x04,0x45,0x04,0x46,0x04,0x7C,0x84,
  0x44,0x44,0x44,0x64,0x44,0x24,0x44,0x04,
  0x7C,0x04,0x44,0x28,0x40,0x10,0x00,0x00
};
uchar code  FontData_DIAN[32] =
{ /*典*/
  0x02,0x40,0x02,0x40,0x02,0x40,0x1F,0xF8,
  0x12,0x48,0x12,0x48,0x1F,0xF8,0x12,0x48,
  0x12,0x48,0x12,0x48,0x7F,0xFE,0x04,0x20,
  0x06,0x10,0x0C,0x18,0x18,0x0C,0x20,0x08
};
uchar code  FontData_FAN[32] =
{ /*范*/
  0x04,0x20,0x04,0x20,0xFF,0xFE,0x04,0x60,
  0x40,0x00,0x31,0xF8,0x91,0x08,0x61,0x08,
  0x49,0x08,0x09,0x38,0x11,0x10,0xE1,0x00,
  0x21,0x04,0x21,0x04,0x20,0xFC,0x20,0x00
};
uchar code  FontData_ZHI[32] =
{ /*质*/
  0x00,0x7C,0x3F,0x80,0x20,0x80,0x2F,0xF8,
  0x20,0x80,0x21,0x00,0x27,0xF0,0x24,0x10,
  0x24,0x90,0x24,0x90,0x24,0x90,0x24,0x90,
  0x21,0x40,0x42,0x30,0x44,0x18,0x88,0x10
};
uchar code  FontData_BAO[32] =
{ /*保*/
  0x10,0x00,0x1B,0xF8,0x12,0x08,0x22,0x08,
  0x32,0x08,0x63,0xF8,0xA0,0x40,0x2F,0xFE,
  0x20,0xE0,0x21,0x60,0x21,0x50,0x22,0x58,
  0x24,0x4E,0x28,0x44,0x20,0x40,0x00,0x00
};
uchar code  FontData_ZHENG[32] =
{ /*证*/
  0x00,0x00,0x40,0x00,0x27,0xFE,0x30,0x20,
  0x20,0x20,0x00,0x20,0xE2,0x20,0x22,0x20,
  0x22,0x3C,0x22,0x20,0x22,0x20,0x22,0x20,
  0x2A,0x20,0x32,0x20,0x2F,0xFE,0x00,0x00
};
uchar code  FontData_COMMA[32] =
{ /*,*/
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,
  0x30,0x00,0x10,0x00,0x20,0x00,0x00,0x00
};
uchar code  FontData_EXCMARK[32] =
{ /*!*/
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,
  0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,
  0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00
};

/* 串并转换 */
uchar code  S2PTab[10] = {0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09};

/* 音频驱动 */
sbit  Speaker = P1^7;

/*语音录放单元*/
uchar xdata *RecCs = 0x8e18;
uchar code  RecTab[20] =
{
  0x40,0x42,0x44,0x46,0x48,0x4a,0x4c,0x4e,0x50,0x52,
  0x54,0x56,0x58,0x5a,0x5c,0x5e,0x60,0x62,0x64,0x66
};
uchar code  PlayTab[40] =
{0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,
 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf,
 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7
};

/* 键盘扫描、LED八段数码管显示 */
uchar LedBuf[8];
uchar code LedMap[16] =        /*LED字形代码表*/
{
  0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
  0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e
};
uchar code KeyTab[32] =        /*键盘阵列表*/
{
  0x07, 0x01, 0x10, 0x18, 0x04, 0x00, 0x11, 0x19,/*A7,A1,B7,B1,A4,A0,B4,B0*/
  0x08, 0x02, 0x12, 0x1a, 0x05, 0x0f, 0x13, 0x1b,/*A8,A2,B8,B2,A5,AF,B5,BF*/
  0x09, 0x03, 0x14, 0x1c, 0x06, 0x0e, 0x15, 0x1d,/*A9,A3,B9,B3,A6,AE,B6,BE*/
  0x0a, 0x0c, 0x16, 0x1e, 0x0b, 0x0d, 0x17, 0x1f /*AA,AC,BA,BC,AB,AD,BB,BD*/
};

/* LCD液晶显示器显示的菜单 */
uchar code *DispMsg0 =
    "按键选择实验项目"
    "2.I/O   3.键&显"
    "0.A/D   1.D/A   "
    "首页 按F2转下页";

uchar code *DispMsg1 =
    "按键选择实验项目"
    "6.直流  7.温控  "
    "4.压力  5.步进  "
    "F1回上页F2转下页";

uchar code *DispMsg2 =
    "按键选择实验项目"
    "A.串并 B.音频  "
    "8.8253  9.16x16 "
    "F1回上页F2转下页";
uchar code *DispMsg3 =
    "按键选择实验项目"
    "E.IC  卡读写实验"
    "C.录音  D.放音  "
    "末页 按F1回上页";

/*IC卡读写程序,详见IC.asm*/
void  IC_Main();

/*写命令或数据*/
void LCD_Write(uchar CodeOrData,uchar val)
{
  uchar vstat;
  do  /*检测LCD忙闲状态*/
    vstat=*RDSTAT;
  while(vstat&0x80);
  if(!CodeOrData) *WRCODE = val;
  else *WRDATA = val;
}

/*清DDRAM*/
void LCD_ClrRam(void)
{
  LCD_Write(wrcode,0x30);
  LCD_Write(wrcode,0x01);
}

/*LCD初始化*/
void LCD_Init()
{
  LCD_Write(wrcode,0x30);  /*基本指令操作*/
  LCD_Write(wrcode,0x01);  /*清除显示*/
  LCD_Write(wrcode,0x06);  /*指定在读写数据时光标的移动方向*/
  LCD_Write(wrcode,0x0c);  /*开显示,关光标,不闪烁*/
}

/*显示汉字或字符*/
void LCD_DispStr(uchar code *chn)
{
  uchar i,j;
  LCD_Write(wrcode,0x30);
  LCD_Write(wrcode,0x80);
  for(j=0;j<4;j++) for(i=0;i<16;i++) LCD_Write(wrdata,chn[j*16+i]);
}

/*显示点阵*/
void LCD_DispLat(uchar data1,uchar data2)
{
  uchar i,j,k,x;
  x=x1;
  for(k=0;k<2;k++)
  {
    for(j=0;j<16;j++)
    {
      for(i=0;i<8;i++)
      {
        LCD_Write(wrcode,0x34);
        LCD_Write(wrcode,y+j*2);
        LCD_Write(wrcode,x+i);
        LCD_Write(wrcode,0x30);
        LCD_Write(wrdata,data1);
        LCD_Write(wrdata,data1);
      }
      for(i=0;i<8;i++)
      {
        LCD_Write(wrcode,0x34);
        LCD_Write(wrcode,y+j*2+1);
        LCD_Write(wrcode,x+i);
        LCD_Write(wrcode,0x30);
        LCD_Write(wrdata,data2);
        LCD_Write(wrdata,data2);
      }
    }
    x=x2;
  }
  LCD_Write(wrcode,0x36);
}

/*当data1=0xff,data2=0xff时,在x0,y0处反白显示16xl*yl.*/
void LCD_DispCon(uchar data1,uchar data2,uchar x0,uchar y0,uchar xl,uchar yl)
{
  uchar i,j;
  for(j=0;j<yl;j++)
  {
    for(i=0;i<xl;i++)
    {
      LCD_Write(wrcode,0x34);
      LCD_Write(wrcode,y0+j);
      LCD_Write(wrcode,x0+i);
      LCD_Write(wrcode,0x30);
      LCD_Write(wrdata,data1);
      LCD_Write(wrdata,data2);
    }
  }
  LCD_Write(wrcode,0x36);
}

/* 延时程序 */
void Delay(uint count)
{
  uchar i;
  while(count-- != 0) for(i=0;i<120;i++);
}

/* 延时程序 */
void RecPlayDelay(uint count)
{
  uchar i;
  while(count-- != 0) for(i=0;i<255;i++);
}

/* 字节倒序,用于16x16列代码高八位字形 */
uchar ByteRevOrd(uchar sbyte)
{
  uchar cnt, r, i = 0, sbuf[8];
  for(cnt=0,r=0x80;cnt<8;cnt++,r>>=1) sbuf[cnt]=sbyte&r?1:0;
  for(cnt=8,r=0x80;cnt>0;cnt--,r>>=1) if(sbuf[cnt-1]) i|=r;
  return(i);
}

/* LED 16x16显示函数 */
void Disp16Led(uchar fontdata[32])
{
  uchar cnt, i = 0, r = 1;
  for(cnt=0;cnt<8;cnt++)  /*显示上半部分字形*/
  {
    *HROW = ByteRevOrd(fontdata[i]);
    *LROW = fontdata[i+1];
    *HLINE = r;
    Delay(1);
    *HLINE = 0;
    r <<= 1;
    i += 2;
  }
  r = 1;
  for(cnt=0;cnt<8;cnt++)  /*显示下半部分字形*/
  {
    *HROW = ByteRevOrd(fontdata[i]);
    *LROW = fontdata[i+1];
    *LLINE = r;
    Delay(1);
    *LLINE = 0;
    r <<= 1;
    i += 2;
  }
}

/* LED七段码显示函数 */
void DispLed()
{
  uchar i, pos=0x80;     /*pos为最高字位*/
  for(i=0; i<8; i++)     /*一次扫描8个LED*/
  {
    *OUTSEG = LedBuf[i]; /*写字形代码*/
    *OUTBIT = pos;       /*写字位控制*/
    Delay(2);            /*延时*/
    pos>>=1;             /*移位显示*/
  }
}

/* 读取键盘状态(高4位不用) */
uchar TestKey()
{
  *OUTBIT = 0;  /*置输出线为0*/
  return(~(*IN_KEY) & 0xf);

⌨️ 快捷键说明

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