?? 最終時間和溫度好用的點陣程序.txt
字號:
/*****************************************************
16*128 LED點陣屏 C 程序
******************************************************
聲明:
本程序供大家學習之用,用勿用于商業用途。尊重版權。
編寫:鄧椿薪
時間:2006年1月20日 晚
郵箱:love2151@xinhuanet.com
*******************************************************
//595連級輸出數據,138行驅動。P0_1為移動速度高速/*點陣顯示漢字程串口輸出字符數據,
//P2口輸出行掃描信號,P2_7輸出595鎖存信號。*/
#include <reg51.h>
#include<intrins.h>
sbit P2_7=P2^7;
sbit DQ =P1^2; //定義通信端口
#define uchar unsigned char
#define uint unsigned int
sbit T_CLK=P1^7; //DS1302引腳連接
sbit T_IO =P1^6;
sbit T_RST=P1^5;
sbit ACC0=ACC^0; //1bit數據存儲位
sbit ACC7=ACC^7;
void DS18b20start(void);
void RdTemp(void);
void convert(void);
void WrByte(uchar b);
uchar RdByte(void);
void RxWait(void);
bit RdBit(void);
void TxReset(void);
void delay(uint t);
uchar tplsb,tpmsb; // 溫度值低位、高位字節
void RTInputByte(uchar); /* 輸入 1Byte */
uchar RTOutputByte(void); /* 輸出 1Byte */
void W1302(uchar, uchar); // 向DS1302寫入一個字節
uchar R1302(uchar); // 從DS1302讀出一個字節
void Set1302(uchar *); // 寫DS1302時間
void Read_1302(void); //讀取時間
void DelayMs(void); // 延時
uchar yid,h; //YID為移動計數器,H為行段計數器。
uint zimuo; //字模計數器
uchar Flag;
uchar code hanzi[]; //漢字字模
uchar code hanzi0[67][32]; //數字0-59字模
uchar code ZaXiang[][32];
uchar BUFF[8]; //緩存
uchar choice,choice1;
uchar xdata HuanCun[224]; //動態緩存
void in_data(void); //調整數據
void rxd_data(void); //發送數據
void TiaoZheng(void); //調整數據
void TiaoZheng1(void); //調整數據
void TiaoZheng2(void); //調整數據
void TiaoZheng3(void); //調整數據
void TiaoZheng4(void); //調整數據
void TiaoZheng5(void); //調整數據
void TiaoZheng6(void); //調整數據
void TiaoZheng7(void); //調整數據
void Large_word(void);
void Small_word(void);
void sbuf_out(); //16段掃描
uchar year,month,day,hour,minute,second,week,temp; //時間變量
float wendu;
uchar inittime[7]={0x00,0x37,0x13,0x18,0x09,0x04,0x08}; //初始化后設置
uchar Number[12]; //存儲時間數據
unsigned code sw[16]={0x70,0x72,0x74,0x76,0x78,0x7a,0x7c,0x7e,0x60,0x62,0x64,0x66,0x68,0x6a,0x6c,0x6e }; /*16行段碼*/
/********************************************/
void main(void)
{
Set1302(inittime); //初始化
DelayMs();
W1302(0x8e,0x00); /* 控制命令,WP=0,寫操作?*/
W1302(0x90,0xa5); //打開充電二級管 一個二級管串聯一個2K電阻
while(1)
{
Small_word();
}
}
void Small_word(void)
{
uchar i,j,m,d=4;
yid=0;
zimuo=0;
DS18b20start();
DelayMs();
Read_1302();
DelayMs();
for(m=0;m<8;m++)
{
switch(choice)
{
case 0:TiaoZheng(); break;
case 1:TiaoZheng1(); break;
case 2:TiaoZheng2(); break;
case 3:TiaoZheng3(); break;
case 4:TiaoZheng4(); break;
case 5:TiaoZheng5(); break;
case 6:TiaoZheng6(); break;
case 7:TiaoZheng7(); break;
}
for(j=0;j<4;j++)
{
while(yid<16) //數據移位。
{
for(i=0;i<d;i++) //移動速度
{
sbuf_out();
}
yid++; //移動一步
}
yid=0;
zimuo=zimuo+32; //后移一個字,
if(zimuo>=128)
zimuo=0;
}
choice++; if(choice==8) {Flag=1;choice=0;Large_word();}
}
}
void DS18b20start(void)
{
delay(1); // 延時1ms
convert(); // 啟動溫度轉換,需要750ms
delay(1000); // 延時1s
RdTemp(); // 讀取溫度
delay(2000);
}
void Large_word(void)
{
uchar i,d=4;
yid=0;
zimuo=0;
for(i=0;i<12;i++)
{
while(yid<16) //數據移位。
{
for(i=0;i<d;i++) //移動速度
{
sbuf_out();
}
yid++; //移動一步
}
yid=0;
zimuo=zimuo+32; //后移一個字,
if(zimuo>=384)
zimuo=0;
choice1++;
if(choice1==12) {Flag=0;choice1=0;Small_word();}
}
}
/********************************/
void sbuf_out()
{
for(h=0;h<16;h++) //16行掃描
{
in_data(); //調整數據
rxd_data(); //串口發送數據
P2=0x7f; //關閉顯示。
P2_7=1; //鎖存為高,595鎖存信號
P2=sw[h]; //送段碼
}
}
/******************************************************/
void in_data(void)
{
char s;
if(Flag==0)
for(s=3;s>=0;s--) //h為向后先擇字節計數器,zimuoo為向后先字計數器
{
BUFF[2*s]=HuanCun[zimuo+32*s+2*h]; //把第一個字模的第一個字節放入BUFF0中,第二個字模和第一個字節放入BUFF2中
BUFF[2*s+1]=HuanCun[zimuo+1+32*s+2*h]; // 把第一個字模的第二個字節放入BUFF1中,第二個字模的第二個字節放入BUFF3中
}
if(Flag==1)
for(s=3;s>=0;s--) //h為向后先擇字節計數器,zimuoo為向后先字計數器
{
BUFF[2*s]=hanzi[zimuo+32*s+2*h]; //把第一個字模的第一個字節放入BUFF0中,第二個字模和第一個字節放入BUFF2中
BUFF[2*s+1]=hanzi[zimuo+1+32*s+2*h]; // 把第一個字模的第二個字節放入BUFF1中,第二個字模的第二個字節放入BUFF3中
}
}
/*******************************************************/
void rxd_data(void) //串行發送數據
{
char s;
uchar inc,tempyid,temp;
if(yid<8)
inc=0;
else
inc=1;
for(s=0+inc;s<6+inc;s++) //發送8字節數據
{
if(yid<8)
tempyid=yid;
else
tempyid=yid-8;
temp=(BUFF[s]>>tempyid)|(BUFF[s+1]<<(8-tempyid)); //h1左移tempyid位后和h2右移8-tempyid相或,取出移位后的數據。
temp=255-temp;
SBUF=temp;//把BUFF中的字節從大到小移位相或后發送輸出。
while(!TI);TI=0; //等待發送中斷
}
}
/*******************************************************/
void Read_1302(void)
{
second=R1302(0x81); //對取 秒 分 時 日 月 星期 年
minute=R1302(0x83);
hour=R1302(0x85);
day=R1302(0x87);
month=R1302(0x89);
week=R1302(0x8b);
year=R1302(0x8d);
Number[0]=(year/16)*10+(year%16);
Number[1]=(month/16)*10+(month%16);
Number[2]=(day/16)*10+(day%16);
Number[3]=(hour/16)*10+(hour%16);
Number[4]=(minute/16)*10+(minute%16);
Number[5]=(second/16)*10+(second%16);
Number[6]=(week/16)*10+(week%16);
}
/*******************************************************/
void TiaoZheng(void)
{
uchar i,j,number=0;
for(i=0;i<96;i++) {HuanCun[i]=0x00;}
for(j=0;j<4;j++)
{
for(i=0;i<32;i++)
{
HuanCun[96+i+number]=ZaXiang[j][i];
}
number+=32; if(number>128) number=0;
}
}
void TiaoZheng1(void)
{
uchar i,j,number1=0,k;
for(j=1;j<7;j++)
{
for(i=0;i<32;i++)
{
HuanCun[i+number1]=ZaXiang[j][i];
}
number1+=32; if(number1>192) number1=0;
}
for(i=0;i<32;i++) {HuanCun[192+i]=ZaXiang[7][i];}
}
void TiaoZheng2(void)
{
uchar i,j,k,number2=0;
for(j=5;j<7;j++)
{
for(i=0;i<32;i++)
{
HuanCun[i+number2]=ZaXiang[j][i];
}
number2+=32; if(number2>64) number2=0;
}
for(i=0;i<32;i++) {HuanCun[64+i]=ZaXiang[7][i];}
for(j=0;j<60;j++)
{
if(Number[0]==j) {for(k=0;k<32;k++) HuanCun[96+k]=hanzi0[j][k];}
}
for(i=0;i<32;i++) {HuanCun[128+i]=ZaXiang[8][i];}
for(j=0;j<60;j++)
{
if(Number[1]==j) {for(k=0;k<32;k++) HuanCun[160+k]=hanzi0[j][k];}
}
for(i=0;i<32;i++) {HuanCun[192+i]=ZaXiang[9][i];}
}
void TiaoZheng3(void)
{
uchar i,j,k;
for(i=0;i<32;i++) {HuanCun[i]=ZaXiang[8][i];}
for(j=0;j<60;j++)
{
if(Number[1]==j) {for(k=0;k<32;k++) HuanCun[32+k]=hanzi0[j][k];}
}
for(i=0;i<32;i++) {HuanCun[64+i]=ZaXiang[9][i];}
for(j=0;j<60;j++)
{
if(Number[2]==j) {for(k=0;k<32;k++) HuanCun[96+k]=hanzi0[j][k];}
}
for(i=0;i<32;i++) {HuanCun[128+i]=ZaXiang[10][i];}
for(j=0;j<60;j++)
{
if(Number[3]==j) {for(k=0;k<32;k++) HuanCun[160+k]=hanzi0[j][k];}
}
for(i=0;i<32;i++) {HuanCun[192+i]=ZaXiang[11][i];}
}
void TiaoZheng4(void)
{
uchar i,j,k;
for(i=0;i<32;i++) {HuanCun[i]=ZaXiang[10][i];}
for(j=0;j<60;j++)
{
if(Number[3]==j) {for(k=0;k<32;k++) HuanCun[32+k]=hanzi0[j][k];}
}
for(i=0;i<32;i++) {HuanCun[64+i]=ZaXiang[11][i];}
for(j=0;j<60;j++)
{
if(Number[4]==j) {for(k=0;k<32;k++) HuanCun[96+k]=hanzi0[j][k];}
}
for(i=0;i<32;i++) {HuanCun[128+i]=ZaXiang[12][i];}
for(j=0;j<60;j++)
{
if(Number[5]==j) {for(k=0;k<32;k++) HuanCun[160+k]=hanzi0[j][k];}
}
for(i=0;i<32;i++) {HuanCun[192+i]=ZaXiang[13][i];}
}
void TiaoZheng5(void)
{
uchar i,j,k;
for(i=0;i<32;i++) {HuanCun[i]=ZaXiang[12][i];}
for(j=0;j<60;j++)
{
if(Number[5]==j) {for(k=0;k<32;k++) HuanCun[32+k]=hanzi0[j][k];}
}
for(i=0;i<32;i++) {HuanCun[64+i]=ZaXiang[13][i];}
for(i=0;i<32;i++) {HuanCun[96+i]=ZaXiang[14][i];}
for(i=0;i<32;i++) {HuanCun[128+i]=ZaXiang[15][i];}
for(j=1;j<8;j++)
{
if(Number[6]==j) {for(k=0;k<32;k++) HuanCun[160+k]=hanzi0[60+j-1][k];}
}
for(i=0;i<32;i++) {HuanCun[192+i]=ZaXiang[16][i];}
}
void TiaoZheng6(void)
{
uchar i,j,k;
for(i=0;i<32;i++) {HuanCun[i]=ZaXiang[15][i];}
for(j=1;j<8;j++)
{
if(Number[6]==j) {for(k=0;k<32;k++) HuanCun[32+k]=hanzi0[60+j-1][k];}
}
for(i=0;i<32;i++) {HuanCun[64+i]=ZaXiang[16][i];}
for(i=0;i<32;i++) {HuanCun[96+i]=ZaXiang[17][i];}
for(i=0;i<32;i++) {HuanCun[128+i]=ZaXiang[19][i];}
for(j=0;j<60;j++)
{
if(temp==j) {for(k=0;k<32;k++) HuanCun[160+k]=hanzi0[j][k];}
}
for(i=0;i<32;i++) {HuanCun[192+i]=ZaXiang[18][i];}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -