//数据正确显示,但是LCD屏幕闪烁
#include <pic.h>
#define uchar unsigned char
#define uint unsigned int
#define A1 SEG0COM0
#define B1 SEG1COM0
#define A2 SEG2COM0
#define B2 SEG3COM0
#define A3 SEG4COM0
#define B3 SEG5COM0
#define F1 SEG0COM1
#define G1 SEG1COM1
#define F2 SEG2COM1
#define G2 SEG3COM1
#define F3 SEG4COM1
#define G3 SEG5COM1
#define E1 SEG0COM2
#define C1 SEG1COM2
#define E2 SEG2COM2
#define C2 SEG3COM2
#define E3 SEG4COM2
#define C3 SEG5COM2
#define P1 SEG0COM3
#define D1 SEG1COM3
#define P2 SEG2COM3
#define D2 SEG3COM3
#define P3 SEG4COM3
#define D3 SEG5COM3
uint i=0;
uchar flag=0;
uint count=0;
uint xianshi=0;
uchar bai,shi,ge;
void lcdshowbai(uchar data)
{
switch(data)
{
case 0:
{A1=B1=C1=D1=E1=F1=1;break;}
case 1:
{C1=B1=1;break;}
case 2:
{A1=B1=G1=D1=E1=1;break;}
case 3:
{A1=B1=C1=D1=G1=1;break;}
case 4:
{ F1=B1=C1=G1=1;break;}
case 5:
{ A1=F1=C1=D1=G1=1;break;}
case 6:
{ A1=F1=C1=D1=G1=E1=1;break;}
case 7:
{ A1=B1=C1=1; break;}
case 8:
{ A1=B1=C1=D1=G1=E1=F1=1;break;}
case 9:
{ A1=B1=C1=D1=G1=F1=1;break;}
}
}
void lcdshowshi(uchar data)
{
switch(data)
{
case 0:
{A2=B2=C2=D2=E2=F2=1;break;}
case 1:
{ B2=C2=1;break;}
case 2:
{ A2=B2=G2=D2=E2=1;break;}
case 3:
{ A2=B2=C2=D2=G2=1;break;}
case 4:
{F2=B2=C2=G2=1;break;}
case 5:
{A2=F2=C2=D2=G2=1;break;}
case 6:
{A2=F2=C2=D2=G2=E2=1;break;}
case 7:
{A2=B2=C2=1;break;}
case 8:
{A2=B2=C2=D2=G2=E2=F2=1;break;}
case 9:
{A2=B2=C2=D2=G2=F2=1;break;}
}
}
void lcdshowge(uchar data)
{
switch(data)
{
case 0:
{A3=B3=C3=D3=E3=F3=1;break;}
case 1:
{C3=B3=1;break;}
case 2:
{A3=B3=G3=D3=E3=1;break;}
case 3:
{A3=B3=C3=D3=G3=1;break;}
case 4:
{F3=B3=C3=G3=1;break;}
case 5:
{A3=F3=C3=D3=G3=1;break;}
case 6:
{A3=F3=C3=D3=G3=E3=1;break;}
case 7:
{A3=B3=C3=1;break;}
case 8:
{A3=B3=C3=D3=G3=E3=F3=1;break;}
case 9:
{A3=B3=C3=D3=G3=F3=1;break;}
}
}
void delay100ms(uchar dat) //误差 -1us
{
unsigned char a,b,c;
for(c=dat;c>0;c--)
for(b=202;b>0;b--)
for(a=81;a>0;a--);
}
void shownum()
{
if(count<1200)
{xianshi=0.1*count;}
else
{xianshi=0.5*count/6;}
// xianshi=count;
bai=(uchar)(xianshi%1000/100);
shi=(uchar)(xianshi%100/10);
ge=(uchar)(xianshi%10);
lcdshowbai(bai);
lcdshowshi(shi);
lcdshowge(ge);
}
//将shownum拆分
/*uchar shuju()
{
if(count<1200)
{xianshi=0.1*count;}
else
{xianshi=0.5*count/6;}
bai=(uchar)(xianshi%1000/100);
shi=(uchar)(xianshi%100/10);
ge=(uchar)(xianshi%10);
if(flag==1)
return 1;
else return 0;
}
void show()
{
lcdshowbai(bai);
lcdshowshi(shi);
lcdshowge(ge);
}
*/
void cshio()
{
TRISA=0B11000000; //初始化RA5-RA0的输入输出方向
TRISB=0B00000000; //初始化RB7-RB0的输入输出方向
TRISC=0B00010000; //初始化RC7-RC0的输入输出方向
TRISD=0B00000000; //初始化RD7-RD0的输入输出方向
PORTA=0B00000000; //初始化RA5-RA0数值
PORTB=0B00000000; //初始化RB7-RB0的数值
PORTC=0B00010000; //初始化RC7-RC0的数值
PORTD=0B00000000; //初始化RD7-RD0的数值
}
void cshtimer()
{
//***定时器TMR0初始化***
T0CS=0; //TMRO时钟源选择内部指令周期时钟(Fosc/4)
PSA=1; //预分频器分配给WDT
TMR0=0x06; //定时250微秒,置初值为256-250
T0IF=0; //清除TMR0的中断标志
T0IE=1; //TMR0中断允许
//计数1初始化
T1CON=0B00000011;
TMR1H=TMR1L=0;
// T1OSCEN=0;
// TMR1CS=1;
TMR1IF=0;
TMR1IE=0;
TMR1ON=1;
//***开全局中断设置****
//定时器T0设置了中断允许,此处要开全局中断
GIE=1; //开全局中断
}
//初始化LCD
void cshlcd()
{
LCDDATA0=0X00;
LCDDATA3=0X00;
LCDDATA6=0X00;
LCDDATA9=0X00;
LCDPS=0b00110000;
LCDSE0=0xff;
LCDCON=0b10011011;
LCDIF=0;
LCDIE=0;
/* LCDREF=0b10001110;
LCDRL=0xf0;
LCDCST=0;*/
LCDEN=1;
}
void main() //主函数,单片机开机后就是从这个函数开始运行
{
TRISC5=1;
OSCCON=0b01100111;
// cshio();
cshlcd();
cshtimer();
while(flag==0);
while(1) //死循环,单片机初始化后,将一直运行这个死循环
{
shownum();
while(flag==0);
shownum();
}
}
void interrupt ISR(void) //PIC单片机的所有中断都是这一个入口
{
if(T0IF==1) //需要进一步判断是否是T0中断
{
TMR0=0x06; //定时器中断后,要重置初值,以备下次中断
T0IF=0; //清中断标志位,以备下次中断
//***此处用户自行添加定时器T0中断处理程序***
TMR1ON=1;
i++;
// flag=0;
if(i==4001)
{
TMR1ON=0;
i=0;
count=TMR1H*256+TMR1L;
flag=1;
TMR1H=TMR1L=0;
}
}
}
|