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

📄 ecg.c

📁 TI公司上的心电仪器采样设计程序,需要的人下哈.
💻 C
字号:
#include <iom16v.h>
#include <macros.h>
#include <math.h>
#define LCDBUF PORTB  
#define RS     2
#define RW     1
#define E      0

void delay_1us(void)                 //1us延时函数
  {
   asm("nop");
  }

void delay_nus(unsigned int n)       //N us延时函数
  {
   unsigned int i=0;
   for (i=0;i<n;i++)
   delay_1us();
  }
  
void delay_1ms(void)                 //1ms延时函数
  {
   unsigned int i;
   for (i=0;i<1140;i++);
  }
  
void delay_nms(unsigned int n)       //N ms延时函数
  {
   unsigned int i=0;
   for (i=0;i<n;i++)
   delay_1ms();
  }


void port_init(void)
{
 PORTA = 0xF8;
 DDRA  = 0xff;
 PORTB = 0x00;
 DDRB  = 0xFF;  
 PORTC = 0x00; 
 DDRC  = 0x00;
 PORTD = 0x00;
 DDRD  = 0x00;
}

//*****检查液晶是否忙************

void CheckState(void)
{
 unsigned char dat;
 PORTA &= ~(1<<RS);             
 PORTA |= (1<<RW);   
 
 DDRB = 0X00;       
 PORTB=0xFF;       

do
{ 
 PORTA |= (1<<E);    
 delay_1us(); 
 dat=PINB & 0x80;     
 PORTA &= ~(1<<E);
 }while(!(dat==0x00));
}

//******向液晶写入指令************
void WriteINS(unsigned char INS)
{
 CheckState();;        //TRISD=0x00;    
                                  
 DDRB  = 0xFF;
 PORTA &= ~(1<<RS);      //RS=0;
 PORTA &= ~(1<<RW);   //RW=0;
 
 LCDBUF=INS;          
 PORTA |= (1<<E);     //E=1;
 delay_1us();
 PORTA &= ~(1<<E);    //E=0;   
}
//******向液晶写入数据************
void WriteDAT(unsigned char DAT)
{ 
 CheckState();
 
 DDRB  = 0xFF; 
 PORTA |= (1<<RS);      //RS=1;
 PORTA &= ~(1<<RW);      //RW=0;
 LCDBUF=DAT;
 PORTA |= (1<<E);     //E=1;
 delay_1us();
 PORTA &= ~(1<<E);    //E=0;  
}

//******向液晶读出RAM数据************
unsigned char ReadDAT( )
{ unsigned char DAT;
 CheckState();
 DDRB  = 0x00; 
 PORTA |= (1<<RS);      //RS=1;
 PORTA |= (1<<RW);      //RW=1;
 PORTA |= (1<<E);     //E=1;
 delay_1us();
 PORTA &= ~(1<<E);    //E=0;  
 DAT=PINB;
 return (DAT);
}

//******向GRAM读出数据************
unsigned int ReadGRAM(unsigned char x,unsigned char y ) //X水平坐标,Y垂直坐标,DAT为16位数据
{ unsigned char a,b;
unsigned int DAT=0;
Dot(0X80|x,0X80|y);
ReadDAT( );
//delay_1ms();
a=ReadDAT( );
//delay_nms(1);
b=ReadDAT( );
DAT=(a<<8)|b;
 return (DAT);
}

void Dot(unsigned char x,unsigned char y)
{
//先垂直地址,后水平地址
  WriteINS(y);
  WriteINS(x);
}


void GraphInit()
{
 unsigned char i,j,temp;
 //WriteINS(0x01);   //清屏
 delay_1ms(); 
 WriteINS(0x36);
 delay_1ms(); 
 temp=0x80;
 for(i=0;i<32;i++)          //清屏
 {
  Dot(temp,0x80);
  for(j=0;j<16;j++)
  {
  	WriteDAT(0x00);
  	WriteDAT(0x00);
  }
  temp++;
 }  
}

void clear(void)
{
 unsigned char i,j,x,y;//I,X;J,Y
 long temp=0;
 y=0x80;        //上半屏
 x=0x80;
 for(i=0;i<32;i++)
 {
  Dot(x,y);
  for(j=0;j<16;j++)
  {
  	WriteDAT(0);
  }
  y++;
  x=0x80;
 }                 //下半屏
 y=0x80;
 x=0x88;
  for(i=0;i<32;i++)
 {
  Dot(x,y);
  for(j=0;j<16;j++)
  {
  	WriteDAT(0);
  }
  y++;
  x=0x88;
 }
}

void Graph(unsigned char t,unsigned char data)//data∈(0x00,0x1f),t started with 0;
{int x=t/16,s=t%16,a,a1,b,b1,i;
unsigned int out;
int r,m,m1;
out=ReadGRAM(x,data);
r=1<<(15-s);
m=out|r;
r=m;
a=r>>8;
b=(m<<8)>>8;
for(i=0;i<=0x1f;i++)
{
out=ReadGRAM(x,i)&(~r);
m1=out;
a1=out>>8;
b1=(m1<<8)>>8;
Dot(0X80|x,0X80|i);
WriteDAT(a1);
WriteDAT(b1);
}
Dot(0X80|x,0X80|data);
WriteDAT(a);
WriteDAT(b);
}





//*********液晶初始化**********************
void InitialLCD(void)
{

 delay_nms(40);      
 WriteINS(0x30);    
 delay_nus(150);     
 WriteINS(0x0c); 
 delay_nus(150);
 WriteINS(0x01);   
 delay_nms(10); 
 WriteINS(0x06); 
 delay_nus(150);
 
}

//*****************sample*******************
void sample(void)
{
int i;
for(i=0;i<5;i++)
{PORTB|=1<<7;
 DDRB|=1<<7;
 delay_1ms();
 PORTB&=~(1<<7);
 delay_1ms();
}
}

//********************SPI初始化************
void spi_masterinit(void)  //SPI初始化
{
SPCR=0x7f;
}

//*******************SPI读写一体化*********
unsigned char SPI_MasterRX(unsigned char cdata)   
{
SPDR=cdata;
while(!(SPSR&(1<<SPIF)))
;
return SPDR;
}


void main(void)
{
  unsigned char  i,x,data1,data2;
  x=0;
  data1=0;
  data2=0;
 
  port_init();
  InitialLCD();
  WriteINS(0x9a); //在9a位置写入‘波’字
  WriteDAT(0xb2); 
  WriteDAT(0xa8);
  WriteINS(0x9b); //在9b位置写入‘形’字
  WriteDAT(0xd0); 
  WriteDAT(0xce); 
  WriteINS(0x9c); //在9c位置写入‘显’字
  WriteDAT(0xcf); 
  WriteDAT(0xd4);
  WriteINS(0x9d); //在9d位置写入‘示’字
  WriteDAT(0xca); 
  WriteDAT(0xbe); 
  GraphInit();
  clear();     //清除GRAM中的数据,即向里面全部写入零。
  while(1)
{  
  spi_masterinit();
  data1=SPI_MasterRX(0);
  data2=SPI_MasterRX(0);
  sample();
  SPCR=0X0;
  port_init();
  Graph(x%127,data2>>3);
  x++;
  delay_nms(111);//setting the showing speed
}

}

⌨️ 快捷键说明

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