📄 arry_key.c
字号:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS = P2^5 ;
sbit RW = P2^6 ;
sbit E = P2^7 ;
sbit PSB = P2^4 ;
sbit RST = P2^3 ;
sbit T_CLK = P1^1; /*实时时钟时钟线引脚 */
sbit T_IO = P1^2; /*实时时钟数据线引脚 */
sbit T_RST = P1^3; /*实时时钟复位线引脚 */
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
sbit DQ=P1^0;
float tem;
int temp_lo,temp_hi;
void delayms(unsigned char ms) ;
void lcdinitial() ;
void lcdwritecom(unsigned char comm) ;
void lcdwritedata(unsigned char dat) ;
void photodis(unsigned char *s) ;
void chardis(char *ddata);
void Gunp();
void RTInputByte(uchar); /* 输入 1Byte */
uchar RTOutputByte(void); /* 输出 1Byte */
void W1302(uchar, uchar);
uchar R1302(uchar);
void Set1302(uchar *); /* 设置时间 */
void Bcd2asc(uchar,uchar *);
void Get1302(uchar curtime[]); /* 读取1302当前时间 */
unsigned char settime[]={0x00,0x19,0x22,0x12,0x05,0x01,0x08}; //秒,分,时,日,月,星期,年
unsigned char Week[]="一二参四五六日" ;
unsigned char dis1[]={"桂林电子科技大学"};
unsigned char dis2[]={"电子工程系"};
unsigned char dis3[]={"045024班"};
unsigned char dis4[]={"黎斯铭"};
unsigned char lcdy,lcdx,count1,count2,count3,flag=0;
unsigned char ucCurtime[7]={0} ;
unsigned char code tutab[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0x06,0x00,0x00,0x30,0x00,0x00,0x37,0xF8,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
0x30,0x06,0x00,0x01,0x20,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x30,0x06,0x00,0x02,0x60,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x38,0x06,0x00,0x16,0x40,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
0x3C,0x06,0x00,0x24,0x00,0x3F,0x80,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
0x3C,0x0F,0x00,0x64,0x01,0xFF,0xF0,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
0x3F,0x1F,0x00,0x60,0x0F,0xFF,0xFC,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,
0x17,0xBF,0xE0,0x60,0x3F,0xFF,0xFE,0x7F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x7F,0x80,0x80,0xFF,0x00,0x3F,0x7F,0xFF,0xC0,0x00,0x00,0x00,0x01,0x80,0x00,
0x00,0x7E,0x01,0x81,0xF8,0x00,0x0F,0x01,0xE0,0x00,0x00,0x00,0x00,0x01,0xE6,0x00,
0x00,0x0E,0x03,0x43,0xEF,0xFC,0x0F,0x80,0xC0,0x00,0x00,0x00,0x00,0x03,0x7F,0x00,
0x00,0x0E,0x03,0x07,0xCF,0xFE,0x0F,0x80,0xC0,0x00,0x00,0x00,0x00,0x06,0x19,0x80,
0x00,0x0E,0x06,0x0F,0xBF,0xFE,0x0F,0x80,0xC0,0x00,0x3F,0x80,0x00,0x06,0x00,0xC0,
0x60,0x0E,0x06,0x1F,0x3F,0xBE,0x0F,0x00,0xC0,0x00,0xFF,0xC0,0x00,0x04,0x00,0xC0,
0x60,0x0E,0x0E,0x3C,0x7F,0x9E,0x0F,0x10,0xC0,0x81,0x80,0x60,0x01,0x84,0x00,0xC0,
0x60,0x0E,0x0C,0x38,0xFF,0xFE,0x1E,0x10,0xC1,0x83,0x00,0x21,0xC6,0x8C,0x00,0x60,
0x38,0x1E,0x18,0x70,0xFF,0xFE,0x3C,0x30,0xC3,0x0E,0x00,0x63,0x2C,0x8C,0xE0,0x30,
0x7F,0x9E,0x18,0x71,0xFF,0xFC,0x78,0x70,0xC3,0x18,0x00,0x62,0x29,0x8D,0xF8,0x18,
0x3E,0xBF,0x18,0xE1,0xFF,0xFC,0xF0,0x7C,0xC2,0x10,0x01,0xC2,0x25,0xF9,0x1E,0x08,
0x30,0x76,0x18,0xC1,0xFF,0xF1,0xE0,0xEC,0xC0,0x30,0x03,0x02,0x24,0xF9,0x03,0x8C,
0x20,0x66,0x11,0xC0,0xFF,0xE7,0x80,0x82,0x60,0x10,0x02,0x06,0x64,0x19,0x00,0x84,
0x20,0xC6,0x11,0x80,0xFF,0x9F,0x00,0x00,0xF0,0x19,0xC2,0x06,0x64,0x1F,0x10,0xCC,
0x01,0xC4,0x09,0x80,0x7F,0x7C,0x00,0x00,0xF8,0x0F,0x63,0x06,0x2C,0x1E,0x38,0xC8,
0x01,0x84,0x01,0x80,0x00,0xF8,0x0C,0x00,0xD8,0x00,0x23,0x06,0x38,0x12,0x01,0x98,
0x01,0x04,0x01,0x80,0x07,0xE0,0x18,0x00,0xCC,0x00,0x31,0x03,0x19,0xF6,0x01,0xF0,
0x00,0x04,0x01,0x98,0x7F,0x00,0x30,0x00,0x86,0x00,0x11,0x01,0x18,0x37,0x81,0x80,
0x00,0x04,0x01,0xC7,0xFC,0x00,0xE0,0x00,0x87,0x00,0x19,0x81,0x98,0x1D,0x9F,0x00,
0x00,0x04,0x01,0xC0,0x00,0x01,0x80,0x01,0x83,0x80,0x18,0xF0,0x98,0x18,0x03,0x00,
0x03,0x04,0x00,0xE0,0x00,0x07,0x00,0x01,0x01,0xC0,0xF8,0xD8,0x98,0xA8,0x03,0x00,
0x07,0x04,0x00,0xF0,0x00,0x1E,0x00,0x03,0x00,0xE0,0xC0,0x08,0x99,0xEF,0x3E,0x00,
0x0E,0x04,0x00,0x7C,0x00,0x7C,0x00,0x06,0x00,0x60,0xC0,0x08,0x99,0x12,0x36,0x00,
0x1C,0x04,0x00,0x3F,0xCF,0xF0,0x00,0x0C,0x00,0x30,0x40,0x0C,0x99,0x10,0x02,0x00,
0x3C,0x04,0x00,0x0F,0xFF,0xC0,0x00,0x38,0x00,0x18,0x7F,0xF8,0xFF,0x18,0x06,0x00,
0x3C,0x04,0x00,0x03,0xFF,0x00,0x00,0x60,0x00,0x00,0x3F,0xF0,0x66,0x1F,0xFC,0x00,
0x3C,0x04,0x00,0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x3C,0x0C,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x3C,0x0C,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x3C,0x0C,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x18,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x18,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
/*温度传感器控制程序*/
void Delay15(uchar n) //延时子程序
{ do{ _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_();
n--;
}while(n);
}
void Delay10ms(uint delay_num) //延时子程序
{
uchar i;
while(delay_num--)
{
for(i=0;i<125;i++) ;
}
}
unsigned char Read18B20(void) //读温度传感器子程序
{ unsigned char ch;
unsigned char q ;
for(q=0;q<8;q++)
{ch=ch>>1;
DQ=0;
_nop_();
DQ=1;
_nop_();_nop_();_nop_();_nop_();
if(DQ==1)
{ch=ch|0x80;}
else {ch=ch&0x7f;}
Delay15(3);
DQ=1;
}
return (ch);
}
void Write18B20(uchar ch) //写温度传感器子程序
{ uchar i;
for(i=0;i<8;i++)
{ DQ=0;
Delay15(1);
DQ=ch&0x01;
Delay15(3);
DQ=1;
ch=ch>>1;
_nop_();
}
}
void Init18B20(void) //初始化温度传感器
{ DQ=0;
Delay15(33);//至少延时480us
DQ=1;
Delay15(10);//至少延时100us
}
void DData(void) //测温度、处理数据
{
uchar temp1,temp2,flag=0;
EA=0; //在测温度时要关中断,避免影响温度传感器的控制时序
Init18B20();
Write18B20(0xCC);//跳过ROM
_nop_();
Write18B20(0x44);//发送温度转换指令
Delay10ms(25);
Delay10ms(25);
Delay10ms(25);
Delay10ms(25);//等待1s转换
Init18B20();
Write18B20(0xCC);//跳过ROM
Write18B20(0xBE);//读温度转换指令
temp1=Read18B20(); //读低位温度值
temp2=Read18B20(); //读高位温度值
temp2 = (temp2 << 4)|(temp1 >> 4); //处理数据
temp1&=0x0f;
if(temp2>0x7f)
{
temp1=~temp1; //数据取反
temp2=~temp2; //数据取反
temp1&=0x0f;
if(temp1==0x0f)
temp2=temp2+1;
else
temp1=temp1+1;
flag=1;
}
tem=temp1*0.0625+temp2;
if(flag)
tem*=-1;
}
void RTInputByte(uchar d)
{
uchar i;
ACC = d;
for(i=8; i>0; i--)
{
T_IO = ACC0; /*相当于汇编中的 RRC */
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
uchar RTOutputByte(void)
{
uchar i;
for(i=8; i>0; i--)
{
ACC = ACC >>1; /*相当于汇编中的 RRC */
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
void W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
RTInputByte(ucDa); /* 写1Byte数据*/
T_CLK = 1;
T_RST = 0;
}
uchar R1302(uchar ucAddr)
{
uchar ucData;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
ucData = RTOutputByte(); /* 读1Byte数据 */
T_CLK = 1;
T_RST = 0;
return(ucData);
}
void Set1302(uchar *pClock)
{
uchar i;
uchar ucAddr = 0x80;
W1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/
for(i =7; i>0; i--)
{
W1302(ucAddr,*pClock); /* 秒 分 时 日 月 星期 年 */
pClock++;
ucAddr +=2;
}
W1302(0x8e,0x80); /* 控制命令,WP=1,写保护*/
}
void Get1302(void)
{
uchar i;
uchar ucAddr = 0x81;
for (i=0; i<7; i++)
{
ucCurtime[i] = R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
ucAddr += 2;
}
}
/*//////////////////////////////////////////////////////////////////////*/
void dis_time()
{
char sec[2],min[2],hour[2],day[2],mon[2],year[2],week;
sec[1]=(ucCurtime[0]&0x0f)|0x30;
sec[0]=((ucCurtime[0]&0x70)>>4)|0x30;
min[1]=(ucCurtime[1]&0x0f)|0x30;
min[0]=((ucCurtime[1]&0x70)>>4)|0x30;
hour[1]=(ucCurtime[2]&0x0f)|0x30;
hour[0]=((ucCurtime[2]&0x30)>>4)|0x30;
day[1]=(ucCurtime[3]&0x0f)|0x30;
day[0]=((ucCurtime[3]&0x30)>>4)|0x30;
mon[1]=(ucCurtime[4]&0x0f)|0x30;
mon[0]=((ucCurtime[4]&0x10)>>4)|0x30;
week=ucCurtime[5]&0x07;
year[1]=(ucCurtime[6]&0x0f)|0x30;
year[0]=((ucCurtime[6]&0xf0)>>4)|0x30;
lcdwritecom(0x80);
delayms(5) ;
chardis("20");
chardis(year);
chardis("年");
chardis(mon);
chardis("月");
chardis(day);
chardis("日");
chardis(" ");
lcdwritecom(0x90);
delayms(5) ;
chardis(" ");
chardis(" ");
chardis("星");
chardis("期");
if(week==3)
{
lcdwritedata(0xc8) ;
delayms(1) ;
lcdwritedata(0xfd) ;
delayms(1) ;
}
else
chardis(Week+(week-1)*2);
lcdwritecom(0x88);
delayms(5) ;
chardis(" ");
lcdwritedata(' ') ;
delayms(1) ;
chardis(hour);
lcdwritedata(':') ;
delayms(1) ;
chardis(min);
lcdwritedata(':') ;
delayms(1) ;
chardis(sec);
}
void DisTemperature( float Ddata) //显示温度
{
unsigned char z[2],x[4],flag=0,i=0,j=0;
unsigned int id,fd;
float Dd;
if(Ddata<0) //判是否负,并取绝对值
{
flag=1;
Dd=-Ddata;
}
else
Dd=Ddata;
id=(int)Dd; //取整数部分
fd=(Dd-id)*10000; //取小数部分
z[0]=id/10; //将各位数字取出
z[1]=id%10;
x[0]=fd/1000;
x[1]=(fd-x[0]*1000)/100;
x[2]=(fd/10)%10;
x[3]=fd%10;
lcdwritecom(0x98);
delayms(5) ;
chardis("温");
chardis("度");
chardis(": ");
if(flag)
{
lcdwritedata('-') ;
delayms(1) ; //判断是否负,是负输出负号
}
if(z[0]) //判断是第一个数字是否为0,若是,跳过第一个,输出第二个
{
lcdwritedata(z[0]|0x30) ;
delayms(1) ;
}
lcdwritedata(z[1]|0x30) ;
delayms(1) ;
lcdwritedata('.') ;
delayms(1) ;
lcdwritedata(x[j]|0x30) ;
delayms(1) ;
lcdwritecom(0x9e);
delayms(5) ;
chardis("度");
}
void disstr(unsigned char x,unsigned char *p)
{
int i,j;
lcdwritecom(x);
delayms(5);
for(i=0;p[i]!=0;i++)
{
lcdwritedata(p[i]) ;
delayms(1);
}
for(j=i;j<16;j++)
{
lcdwritedata(' ') ;
delayms(1);
}
}
void Gunp()
{
unsigned char a,b,c,d,t,i,j;
a=0x80;
b=0x90;
c=0x88;
d=0x98;
disstr(a,dis1);
disstr(b,dis2);
disstr(c,dis3);
disstr(d,dis4);
for(j=0;j<20;j++)
delayms(100);
for(i=1;i<9;i++)
{
t=a; a=b; b=c; c=d; d=t;
disstr(a,dis1);
disstr(b,dis2);
disstr(c,dis3);
disstr(d,dis4);
for(j=0;j<5;j++)
delayms(100);
}
for(j=0;j<20;j++)
delayms(100);
}
void main()
{
lcdinitial() ;
W1302(0x8e,0x00);
W1302(0x80,0x00);
W1302(0x90,0xa8);
W1302(0x8e,0x80);
Set1302(settime);
W1302(0x8e,0x80);
photodis(tutab);
delayms(5);
lcdinitial() ;
Gunp();
while(1)
{
Get1302();
dis_time();
delayms(5);
DData();
DisTemperature( tem );
}
}
void lcdinitial()
{
RST = 1 ;
_nop_() ;
PSB = 1 ;
_nop_() ;
lcdwritecom(0x30) ;
delayms(5) ;
lcdwritecom(0x0c) ;
delayms(5) ;
lcdwritecom(0x01) ;
delayms(5) ;
lcdwritecom(0x06) ;
delayms(5) ;
lcdwritecom(0x80) ;
delayms(5) ;
}
void lcdwritecom(unsigned char comm)
{
RS = 0 ;
RW = 0 ;
P0 = comm ;
E = 1 ;
E = 0 ;
}
void lcdwritedata(unsigned char dat)
{
RS = 1 ;
RW = 0 ;
P0 = dat ;
E = 1 ;
E = 0 ;
}
void chardis(char *ddata)
{
lcdwritedata(*ddata++) ;
delayms(1) ;
lcdwritedata(*ddata) ;
delayms(1) ;
}
void wtzb(unsigned int x,unsigned int y)
{
lcdwritecom(y);
delayms(5) ;
lcdwritecom(x);
delayms(5) ;
}
void delayms(unsigned char ms)
// 延时子程序
{
unsigned char i ;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
//********显示图形子程序****************
void photodis(unsigned char *s)
{
lcdwritecom(0x36) ;
delayms(5) ;
lcdx=0X80;
for (count3=0X02 ;count3!=0;count3--)
{
lcdy=0X80;
for (count2=0X20;count2!=0;count2--)
{
wtzb(lcdx,lcdy);
for (count1=0X10;count1!=0;count1--)
{
lcdwritedata(*s++);
delayms(1) ;
}
lcdy+=1;
}
lcdx=0X88;
}
lcdwritecom(0x34);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -