#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
//数据选择
#define rs0 PORTD&=~BIT(0)
#define rs1 PORTD|=BIT(0)
#define rst DDRD|=BIT(0)
//使能端
#define en0 PORTB&=~BIT(2)
#define en1 PORTB|=BIT(2)
#define ent DDRB|=BIT(2)
//读写选择
#define rwt DDRD|=BIT(1)
#define rw0 PORTD&=~BIT(1)
#define rw1 PORTD|=BIT(1)
//并串行选择
#define psb0 PORTB&=~BIT(3)
#define psb1 PORTB|=BIT(3)
#define psbt DDRB|=BIT(3)
//初始化
#define RETT DDRB|=BIT(4)
#define RET0 PORTB &=~BIT(4)
#define RET1 PORTB |=BIT(4)
uchar const DIS1[]={"N ="};
uchar DIS2[5];
uchar const DIS3[]={"r/min"};
uchar const DIS4[]={" "};
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=1141;j>0;j--);
}
void wcmd(uchar cmd)
{
rs0;
rw0;
en1;
delay(5);
DDRC=0XFF;
PORTC=cmd;
delay(5);
en0;
}
void wdat(uchar dat)
{
rs1;
rw0;
en1;
delay(5);
PORTC=dat;
delay(5);
en0;
}
void init(void)
{
rst;
rwt;
RETT;
ent;
psbt;
psb1; //并口方式
en0;
RET0;
delay(5);
RET1;
delay(5);
wcmd(0x34); //扩充指令操作
delay(5);
wcmd(0x30); //基本指令操作
delay(5);
wcmd(0x01); //清除LCD的显示内容
delay(5);
wcmd(0x0c); //显示开,关光标
delay(5);
wcmd(0x06); //光标右移,画面不移动
delay(5);
DDRB&=~BIT(1);
PORTB|=BIT(1);
}
void pos(uchar X,uchar Y)
{
uchar pos;
if (X==1)
{X=0x80;}
else if (X==2)
{X=0x90;}
else if (X==3)
{X=0x88;}
else if (X==4)
{X=0x98;}
pos=X+Y ;
wcmd(pos); //显示地址
}
uchar i;
uint v=0,k=0;
void TC(void)
{
TCCR1B=0X07;//外部T1上升沿驱动
TCNT1H=0xff;
TCNT1L=0xdc;//当65536时溢出
TIMSK|=BIT(2);
SREG|=BIT(7);
}
void DSQ(void)
{
TCCR0=0X01;//1024分频
TCNT0=0x16;//30ms
TIMSK|=BIT(2);
SREG|=BIT(7);
}
void PWM(void)
{
DDRD|=0X30;
TCCR1A=0X63;
TCCR1B=0X1B;
OCR1A=124;
OCR1B=64;
}
void main(void)
{
delay(10); //上电,等待稳定
init();
pos(2,0); //设置显示位置为第一行
for(i=0;i<3;i++)
{
wdat(DIS1[i]);
}
pos(2,5);
for(i=0;i<5;i++)
{
wdat(DIS3[i]);
}
DSQ();
TC();
//PWM();
while(1);
}
#pragma interrupt_handler zd0:9
void zd0(void)
{
v++;
DIS2[0]=v/10000+0x30;
DIS2[1]=v%10000/1000+0x30;
DIS2[2]=v%10000%1000/100+0x30;
DIS2[3]=v%10000%1000%100/10+0x30;
DIS2[4]=v%10000%1000%100%10+0x30;
pos(2,2);
for(i=0;i<5;i++)
{
wdat(DIS2[i]);
}
TCNT1H=0x85;
TCNT1L=0xEE; //当65536时溢出
}
#pragma interrupt_handler zd1:10
void zd1(void)
{
k++;
if(k>100)//3s
{
k=0;
}
TCNT0=0x16;
}
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
//数据选择
#define rs0 PORTD&=~BIT(0)
#define rs1 PORTD|=BIT(0)
#define rst DDRD|=BIT(0)
//使能端
#define en0 PORTB&=~BIT(2)
#define en1 PORTB|=BIT(2)
#define ent DDRB|=BIT(2)
//读写选择
#define rwt DDRD|=BIT(1)
#define rw0 PORTD&=~BIT(1)
#define rw1 PORTD|=BIT(1)
//并串行选择
#define psb0 PORTB&=~BIT(3)
#define psb1 PORTB|=BIT(3)
#define psbt DDRB|=BIT(3)
//初始化
#define RETT DDRB|=BIT(4)
#define RET0 PORTB &=~BIT(4)
#define RET1 PORTB |=BIT(4)
uchar const DIS1[]={"N ="};
uchar DIS2[5];
uchar const DIS3[]={"r/min"};
uchar const DIS4[]={" "};
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=1141;j>0;j--);
}
void wcmd(uchar cmd)
{
rs0;
rw0;
en1;
delay(5);
DDRC=0XFF;
PORTC=cmd;
delay(5);
en0;
}
void wdat(uchar dat)
{
rs1;
rw0;
en1;
delay(5);
PORTC=dat;
delay(5);
en0;
}
void init(void)
{
rst;
rwt;
RETT;
ent;
psbt;
psb1; //并口方式
en0;
RET0;
delay(5);
RET1;
delay(5);
wcmd(0x34); //扩充指令操作
delay(5);
wcmd(0x30); //基本指令操作
delay(5);
wcmd(0x01); //清除LCD的显示内容
delay(5);
wcmd(0x0c); //显示开,关光标
delay(5);
wcmd(0x06); //光标右移,画面不移动
delay(5);
DDRB&=~BIT(1);
PORTB|=BIT(1);
}
void pos(uchar X,uchar Y)
{
uchar pos;
if (X==1)
{X=0x80;}
else if (X==2)
{X=0x90;}
else if (X==3)
{X=0x88;}
else if (X==4)
{X=0x98;}
pos=X+Y ;
wcmd(pos); //显示地址
}
uchar i;
uint v=0,k=0;
void TC(void)
{
TCCR1B=0X07;//外部T1上升沿驱动
TCNT1H=0xff;
TCNT1L=0xdc;//当65536时溢出
TIMSK|=BIT(2);
SREG|=BIT(7);
}
void DSQ(void)
{
TCCR0=0X01;//1024分频
TCNT0=0x16;//30ms
TIMSK|=BIT(2);
SREG|=BIT(7);
}
void PWM(void)
{
DDRD|=0X30;
TCCR1A=0X63;
TCCR1B=0X1B;
OCR1A=124;
OCR1B=64;
}
void main(void)
{
delay(10); //上电,等待稳定
init();
pos(2,0); //设置显示位置为第一行
for(i=0;i<3;i++)
{
wdat(DIS1[i]);
}
pos(2,5);
for(i=0;i<5;i++)
{
wdat(DIS3[i]);
}
DSQ();
TC();
//PWM();
while(1);
}
#pragma interrupt_handler zd0:9
void zd0(void)
{
v++;
DIS2[0]=v/10000+0x30;
DIS2[1]=v%10000/1000+0x30;
DIS2[2]=v%10000%1000/100+0x30;
DIS2[3]=v%10000%1000%100/10+0x30;
DIS2[4]=v%10000%1000%100%10+0x30;
pos(2,2);
for(i=0;i<5;i++)
{
wdat(DIS2[i]);
}
TCNT1H=0x85;
TCNT1L=0xEE; //当65536时溢出
}
#pragma interrupt_handler zd1:10
void zd1(void)
{
k++;
if(k>100)//3s
{
k=0;
}
TCNT0=0x16;
}