📄 ledshow.c
字号:
#include"c8051f040.h"
void init_port(void);
void external_osc(void);
void send_byte(unsigned char out_byte);
unsigned char receive_byte(void);
void wait_ms(unsigned int ms);
void short_delay(void);
void long_delay(void);
void writeZLG7289(unsigned char cmd,unsigned char dat);
unsigned char readZLG7289(unsigned char cmd);
unsigned char readZLG7289(unsigned char cmd);
void adc0_init();
void adc0_source(unsigned char source);
unsigned char temppage;
#define CMD_RESET 0xa4
#define CMD_TEST 0xbf
#define DECODE0 0x80
#define CMD_WRITE 0x80
#define CMD_BLINK 0x88
#define ADC0START temppage=SFRPAGE;SFRPAGE=0x00;AD0BUSY=1;SFRPAGE=temppage
#define CMD_READ 0x15
sfr16 ADC0VAL=0xbe;
sfr16 ADC0GT=0xc4;
sfr16 ADC0LT=0xc6;
sbit cs=P3^7; //p3.7引脚连接cs
sbit clk=P3^5; //p3.5引脚连接clk
sbit dat=P3^6; //p3.6引脚连接dat
sbit key=P3^4; //p3.4引脚连接key
//sbit key=P4^0;
bit isnewdata;
float temperature[20];
float temp=0.0;
void main()
{unsigned int i,disp=0,dispH=0,dispL=0;
unsigned char kk;
external_osc();
init_port();
//adc0_init();
//ADC0START;
// EA=1;
send_byte(CMD_RESET);
while(1)
{
for(i=0;i<0x2000;i++); //上电延时
//send_byte(CMD_RESET); //芯片复位
// send_byte(CMD_TEST); //芯片测试
/* for(i=0;i<3;i++)
{wait_ms(100);
}
*/
/*if(isnewdata)
{kk=ADC0H*256;
kk+=ADC0L;
temp=kk/4096.0;
temp*=2.43;
temp-=0.776;
temp/=0.00286;
isnewdata=0;
disp=(int)temp;
dispH=disp|0xf0;
dispH=dispH>>4;
dispH|=0x80;
dispL=disp|0x0f;
dispL=dispL>>4;
dispL|=0x80;
writeZLG7289(CMD_BLINK,0xff);
writeZLG7289(CMD_WRITE,dispL);
writeZLG7289(CMD_WRITE+1,dispH);
}
ADC0START;
*/
/* writeZLG7289(CMD_BLINK,0xff);
writeZLG7289(CMD_WRITE,0x80);
writeZLG7289(CMD_WRITE+1,0x81);
writeZLG7289(CMD_WRITE+2,0x82);
writeZLG7289(CMD_WRITE+3,0x83);
// writeZLG7289(CMD_BLINK,0xff);
// kk=0;
writeZLG7289(CMD_WRITE+4,0x84);
writeZLG7289(CMD_WRITE+5,0x85);
*/
/*do
{ if(!key)
{kk=readZLG7289(CMD_READ);
writeZLG7289(CMD_WRITE,kk&0x0f);
writeZLG7289(CMD_WRITE+1,kk&0xf0);
}
}while(kk!=0xff);
*/
}
}
void init_port(void)
{ SFRPAGE=CONFIG_PAGE;
XBR2=0x40; //0100 0000;
P3MDOUT=0x0f; //0000 1111 P3口的4,5,6,7脚采用开漏方式输出
P3MDIN|=0x10;
P3=0xff;
}
//晶振采用11.0592MHz
void external_osc(void)
{int n;
SFRPAGE=CONFIG_PAGE;
OSCXCN=0x77; // 0111 0111 高字节的111表示晶振的二分之一
for(n=0;n<255;n++); //延时
while(( OSCXCN & 0x80)==0); //等待晶振的稳定
CLKSEL |=0x01;
}
//send_byte(unsigned char out_byte):串行方式下字节的发送.
void send_byte(unsigned char out_byte)
{
unsigned char i;
cs=0;
long_delay();
for(i=0;i<8;i++)
{if(out_byte&0x80)
{dat=1;
}
else { dat=0;}
clk=1;
short_delay();
clk=0;
short_delay();
out_byte=out_byte*2;
}
}
//receive_byte(void):串行方式下字节的接收方式.
unsigned char receive_byte(void)
{unsigned char i,in_byte;
in_byte=0x00;
dat=1;
long_delay();
for(i=0;i<8;i++)
{clk=1;
short_delay();
in_byte=in_byte*2;
if(dat)
{in_byte=in_byte|0x01;
}
clk=0;
short_delay();
}
dat=0;
return (in_byte);
}
void wait_ms(unsigned int ms)
{unsigned int i,j;
for(i=0;i<ms;i++)
{for(j=0;j<300;j++);}
}
void short_delay(void)
{int i;
for(i=0;i<30;i++);
}
void long_delay(void)
{int i;
for(i=0;i<0x50;i++);
}
//writeZLG7289(unsigned char cmd,unsigned char dat):写ZLG7289芯片.
//参数意义: cmd---命令符,dat---要写入的数字
void writeZLG7289(unsigned char cmd,unsigned char dat)
{ send_byte(cmd);
send_byte(dat);
}
//readZLG7289(unsigned char cmd):发cmd命令后,ZLG7289返回的字节.
unsigned char readZLG7289(unsigned char cmd)
{ send_byte(cmd);
return(receive_byte());
}
void adc0_source(unsigned char source)
{SFRPAGE=0x00;
AMX0SL=source;
}
void adc0_init()
{SFRPAGE=0x00;
ADC0CF=0x80;
ADC0CN=0x80; //ADC0模块使能
REF0CN&=0x0f;
REF0CN|=0x07; //内部温度传感器工作
adc0_source(9);
EIE2|=0x02; //开ADC0的中断
}
void ADC0_ISR()interrupt 15
{SFRPAGE=0x00;
AD0INT=0;
isnewdata=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -