📄 ecg.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 + -