📄 heart0.c.c
字号:
/****************************************************************************************/
/* Name: 心电图仪显示控制程序
/* Language: C51单片机编程语言
/* Platform:
/* Author: gjg
/* Date: 2005年8月8日星期一 19:20
/* Version:
/* Result:
/* Others: 外部ram(32K)地址分配:波形I存储区 0x0000--0x3FFF
波形II存放区 0x4000--0x7FFF
/*Functions:采集心电信号输入并控制其在示波器上显示,据有波形存储功能
/*Hardware link:
/*#######################################################################################*/
#include <AT89X55.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
/*-----------定义各端口地址-----------------*/
#define PA8255 XBYTE[0x8000]//8255
#define PB8255 XBYTE[0x8001]
#define PC8255 XBYTE[0x8002]
#define COM8255 XBYTE[0x8003]
#define XOUT XBYTE[0x9000]// D/A x
#define XCON XBYTE[0x9001]
#define YOUT XBYTE[0xa000]// D/A y
#define YCON XBYTE[0xa001]
#define SIZE_MENU 10//菜单长度
/*----------------其他定义---------------------*/
uchar keycode;
uchar Ax=200,Ay=200; //示波器x,y轴幅度控制
/*------------------定义菜单------------------*/
void (*KeyFuncPtr)();
uchar KeyFuncIndex=0;
typedef struct //定义结构体类型
{
uchar Keyfuncstate; //当前菜单位?
uchar Keydnstate; //按向下键转向位置
uchar Keyupstate; //按向上键转向位置
uchar Keycrstate; //按确认键转向位
uchar Keybkstate; //按返回键转向位置
void (*CurrentOperation)(); //当前状态下要处理的操作程序
} KeyTabStruct;
/*--------------ds1302硬件连接-----------------*/
sbit T_CLK = P1^2; /*实时时钟时钟线引脚 */
sbit T_IO = P1^1; /*实时时钟数据线引脚 */
sbit T_RST = P1^0; /*实时时钟复位线引脚 */
sbit ACC_0=ACC^0;
sbit ACC_7=ACC^7;
/*-----------AD0809控制管脚定义-------------*/
sbit EOC=P1^3; //AD转换结束信号
sbit START=P1^4;
sbit OE=P1^5;
sbit A0=P3^4;
uchar keycode;
uchar t_init[]={0x00,0x30,0x23,0x8,0x08,0x01,0x05};
/*------------------延时子程序1-------------------*/
void delay1(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++);
}
/*-------------------延时-------------------------*/
void delay(uint time)//延时time ms
{data uint i,j;
for(i=0;i<time;i++)
for(j=0;j<109;j++);
}
/*------------------------pc.n 置1---------------*/
void setpc(uchar n)
{ n=n<<1;
COM8255=0x01|n;
}
/*-----------------------pc.n 置0-----------------*/
void clrpc(uchar n)
{
COM8255=n<<1;
}
/**********************字符LCD显示模块**********************/
/*--------------------写数据到lcd-----------------*/
void putchar(uchar ch)
{
PA8255=ch;
setpc(6);//RS=1
clrpc(5);//RW=0
clrpc(4);//E=0
delay1(10);
setpc(4);//E=1
}
/*------------------写指令到lcd---------------------*/
void putcom(uchar com)
{ PA8255=com;
clrpc(6);//RS=0
clrpc(5);//RW=0
clrpc(4);//E=0
delay1(10);
setpc(4);//E=1
}
/*---------将指令数组写入lcd, n为数组长度----------*/
void putir(uchar code *ir,uchar n)
{uchar i;
for(i=0;i<n;i++)
putcom(ir[i]);
}
/*-------将数组写入 lcd, n为数组长度---------------*/
void putstr(uchar code *str,uchar n)
{ uchar i;
for(i=0;i<n;i++)
putchar(str[i]);
}
/************************************ds1302软件包********************************************/
/************* v_RTInputByte-----往DS1302写入1Byte数据*******************/
void v_RTInputByte(uchar ucDa)
{
uchar i;
ACC = ucDa;
for(i=8; i>0; i--)
{
T_IO = ACC_0;
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
/**********uchar uc_RTOutputByte---从DS1302读取1Byte数据********************/
uchar uc_RTOutputByte(void)
{
uchar i;
for(i=8; i>0; i--)
{
ACC = ACC >>1;
ACC_7=T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/**************v_W1302----往DS1302写入数据*******************************/
void v_W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(ucAddr); /* 地址,命令 */
v_RTInputByte(ucDa); /* 写1Byte数据*/
T_CLK = 1;
T_RST =0;
}
/***********uc_R1302---读取DS1302某地址的数据*************************/
uchar uc_R1302(uchar ucAddr)
{
uchar ucDa;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(ucAddr); /* 地址,命令 */
ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
T_CLK = 1;
T_RST =0;
return(ucDa);
}
/********************************************************************
*
* 名称: v_Set1302
* 说明:
* 功能: 设置初始时间
* 调用: v_W1302()
* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Set1302(uchar *pSecDa)
{
uchar i;
uchar ucAddr = 0x80;
v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
for(i =7;i>0;i--)
{
v_W1302(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */
pSecDa++;
ucAddr +=2;
}
v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}
/********************************************************************
*
* 名称: v_Get1302
* 说明:
* 功能: 读取DS1302当前时间
* 调用: uc_R1302()
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Get1302(uchar ucCurtime[])
{
uchar i;
uchar ucAddr = 0x81;
for (i=0;i<7;i++)
{
ucCurtime[i] = uc_R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
ucAddr +=2;
}
}
/*********************键盘扫描程序************************/
/*-----------------键盘扫描初始化程序---------------*/
void keyinit()
{
setpc(0);setpc(1);setpc(2);setpc(3);
PB8255=0xff;
}
/*------------- 键盘扫描程序---------------------*/
void keyscan(void)
{
uchar lcode=0,ccode=0,scode=0x01,a,i;
for(i=0;i<4;i++)
{
PB8255=scode;
a=PC8255;
if((a&0x0f)!=0x0f)
{if((a|0xfe)==0xfe);
else if ((a|0xfd)==0xfd) lcode=4;
else if ((a|0xfb)==0xfb) lcode=8;
else lcode=12;
keycode=lcode+ccode;
}
else
{scode=(scode<<1);
ccode=ccode+1;
}
}
keyinit(); //键盘初始化
}
/**********************显示存储区*************************************/
uchar code ir[5]={0x00,0x38,0x0c,0x06,0x83};
uchar code str[8]={"Welcome!"};
uchar code str0[16]={"LCD test begin.."};
uchar code str1[14]={"LCD test over!"};
uchar code str2[16]={"Key test begin.."};
uchar code str3[14]={"Key test over!"};
uchar code str4[15]={"Press any key.."};
uchar code str5[8]={"Keycode:"};
uchar code str6[16]={"Ram test begin.."};
uchar code str7[14]={"Ram test over!"};
uchar code str8[15]={"Clock testing.."};
uchar code str9[16]={"Clock test over!"};
uchar code str10[16]={"Rom test begin.."};
uchar code str11[14]={"Rom test over!"};
uchar code str12[11]={"SYSTEM TEST"};
uchar code str13[8]={"SINGLE 1"};
uchar code str14[8]={"SINGLE 2"};
uchar code str15[4]={"CHOP"};
uchar code str16[6]={"REVIEW"};
uchar code str17[11]={"Outputing.."};
/*uchar code str18[16]={""};
uchar code str19[16]={""};
uchar code str20[16]={""};
uchar code str21[16]={""};*/
uchar code test[13]={"Ram testing.."};
uchar code error[8]={"ERROR!"};
/***********************检测服务程序************************/
/*--------------LCD检测程序---------------*/
void lcd_test(void)
{uchar i;
putcom(0x00);putcom(0x80);//begin
putstr(str0,16);
delay(800);
putcom(0x80);
for(i=0;i<16;i++)
{putchar(0xff);}//检测有无暗点
putcom(0xc0);
for(i=0;i<16;i++)
{putchar(0xff);}
delay(500);
putcom(0x80);
/*for(i=0;i<200;i++) //输出所有可显示字符
{putchar(i);
delay(10);
}*/
delay(300);
putcom(0x00);putcom(0x80);
putstr(str1,14);//over
delay(800);
}
/*------------键盘检测程序---------------*/
void keyboard_test(void)
{ putcom(0x00);putcom(0x80);
putstr(str2,16);//begin
delay(800);
putcom(0x00);putcom(0x80);
putstr(str4,15);//press
putcom(0xc2);
putstr(str5,8);
keyinit(); //键盘初始化
do
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -