📄 czz_led.c.c
字号:
#include<absacc.h>
#include<reg52.h>
#include<math.h>
#include<stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LOAD=P1^6;/*max7219*/
sbit DIN=P1^5;/*max9219*/
sbit SCK=P1^7;/*max7219时钟*/
uchar data tt[10];
uchar idata ZH_ADD;
uchar sbufjsq=0;
bit SB=0;
sbit ZK_YK=P1^1;
sbit CH1=P1^3;
sbit CH2=P1^4;
sbit ZZ_YZ=P1^0;
sbit CON=P3^4;
sbit RES=P3^5;
/*向7219写1个字节*/
void byte(uint data1)
{
uchar data i;
LOAD=0;
SCK=0;
for(i=0;i<16;i++)
{
SCK=0;
_nop_();
DIN=(bit)(data1&0x8000);
_nop_();
SCK=1;
data1<<=1;
}
LOAD=1;
_nop_();
_nop_();
_nop_();
SCK=0;
_nop_();
_nop_();
_nop_();
_nop_();
SCK=1;
_nop_();
_nop_();
_nop_();
_nop_();
LOAD=0;
SCK=0;
DIN=0;
}
/*MAX7219初始化
//字模0,1,2,3,4,5,6,7,8,9,A,E,U,-*/
uchar code s0[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x77,0x4f,0x3e,0x01};
void max7219_int()
{
LOAD=0;
SCK=0;
DIN=0;
byte(0x0f00);
byte(0x0900);/*不译码*/
byte(0x0a02);/*显示亮度0-15*/
byte(0x0b06);/*扫描范围0-7*/
byte(0x0c01);/*0关闭 1正常*/
}
void int10()
{
uint data j;
uchar code *ip=s0;
for(j=1;j<8;j++)
{
byte((j<<8)|0xff);
}
for(j=0;j<5000;j++);
for(j=1;j<8;j++)
{
byte((j<<8)|0x7e);
}
}
/*写显示数据IP为数据首址,共写7个*/
void max7219_disp()
{
void sbuf_out();
uchar code *ip=s0;
max7219_int();
if(tt[2]<20)/*显示模拟量*/
{
if(ZK_YK==1)
byte(0x0301);
else
byte(0x0349);
ip=s0;
if(tt[2]==4||tt[2]==5) //显示速度
{
byte(0x013e);
byte(0x0200|*(ip+(tt[2]-3)));
}
else if(tt[2]>=0&&tt[2]<=3)
{
byte(0x0177);//显示电流
byte(0x0200|*(ip+tt[2]+1)); //显示通道号
}
if(tt[2]==0||tt[2]==1)
{
byte(0x400|(*(ip+tt[3])));
byte(0x500|(*(ip+tt[4])));
byte(0x600|(*(ip+tt[5])));
}
else if(tt[2]==2||tt[2]==3)
{
byte(0x400|(*(ip+tt[3])));
byte(0x500|(*(ip+tt[4]))|0x80);
byte(0x600|(*(ip+tt[5])));
}
else if(tt[2]==4||tt[2]==5)
{
byte(0x400|(*(ip+tt[3]))|0x80);
byte(0x500|(*(ip+tt[4])));
byte(0x600|(*(ip+tt[5])));
}
}
byte(0x0700|tt[6]); //显示上下左右
//}
if(tt[2]>=20&&tt[2]<80)/*显示运行故障*/
{
ip=s0;
tt[2]=tt[2]-19;
byte(0x014f);
byte(0x024f);
byte(0x0301);
byte(0x0400|*(ip+tt[2]/100));
tt[2]=tt[2]%100;
byte(0x0500|*(ip+tt[2]/10));
byte(0x0600|*(ip+tt[2]%10));
byte(0x0700);
}
else if(tt[2]==80)/*开机显示,正在初始化-0000-*/
{
byte(0x0101);
byte(0x027e);
byte(0x037e);
byte(0x047e);
byte(0x057e);
byte(0x0601);
}
else if(tt[2]==81)/*开机显示,等待键盘命令-1111-*/
{
if(ZK_YK==1){byte(0x0101);byte(0x0601);}
else{byte(0x0149);byte(0x0649);}
byte(0x0230);
byte(0x0330);
byte(0x0430);
byte(0x0530);
}
}
/*串口初始化:波特率9600*/
void sbuf_init()
{
SCON=0x40;
TMOD=0x21;/*定时器1为波特率发生器,T0为定时器*/
TH0=0x3c;
TL0=0xaf;
TH1=0xfa;
TL1=0xfa;
EA=1;
ES=1;
ET0=1;
ET1=0;
TR0=1;
TR1=1;
REN=1;
}
/*定时器0中断*/
uchar data time=0;
void timer0() interrupt 1 using 2
{
TH0=0x3c;
TL0=0xaf;
TR0=1;
time++;
if(time>=150){TR0=0;time=0;}
}
/*串口接收中断,*/
void sbuff() interrupt 4 using 1
{
time=0;
TR0=1;
RI=0;
if(ZH_ADD==SBUF&&sbufjsq==0)
{
tt[0]=SBUF;
sbufjsq++;
}
else if(ZH_ADD==SBUF&&sbufjsq==1)
{
tt[1]=SBUF;
sbufjsq++;
}
else if(sbufjsq==2&&SBUF!=0xfa)
{
tt[2]=SBUF;
sbufjsq++;
}
else if(sbufjsq==3&&SBUF!=0xfa)
{
tt[3]=SBUF;
sbufjsq++;
}
else if(sbufjsq==4&&SBUF!=0xfa)
{
tt[4]=SBUF;
sbufjsq++;
}
else if(sbufjsq==5&&SBUF!=0xfa)
{
tt[5]=SBUF;
sbufjsq++;
}
else if(sbufjsq==6&&SBUF!=0xfa)
{
tt[6]=SBUF;
sbufjsq++;
}
else if(sbufjsq==7&&SBUF==0xfa)
{
SB=1;
sbufjsq=0;
//sbuf_out();
}
}
void main()
{
bit ZK_YK0=0;
uchar jjj;
sbuf_init();
int10();
while(1)
{
if(ZK_YK!=ZK_YK0)//以下是站控遥控状态转换
{
ZK_YK0=ZK_YK;
if(ZK_YK==1)
{
CON=0;
}
else
{
CON=1;
RES=0;
for(jjj=0;jjj<250;jjj++);
for(jjj=0;jjj<250;jjj++);
for(jjj=0;jjj<250;jjj++);
RES=1;
}
}
if(ZZ_YZ==0)
ZH_ADD=0xaa;/*左站*/
else if(ZZ_YZ==1)
ZH_ADD=0xab;/*右站*/
if(SB==1)
{
CH1=0;
max7219_disp();
tt[0]=0;
tt[1]=0;
tt[2]=0;
tt[3]=0;
tt[4]=0;
tt[5]=0;
tt[6]=0;
tt[7]=0;
SB=0;
sbufjsq=0;
CH1=1;
}
if(TR0==0)
{
byte(0x014f);
byte(0x024f);
byte(0x0301);
byte(0x0430);
byte(0x057e);
byte(0x067e);
byte(0x0700);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -