📄 1302+18b20+点阵屏.c
字号:
/*****************************************************
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;
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 + -