LED3216点阵屏程序.docx

上传人:b****6 文档编号:7950264 上传时间:2023-01-27 格式:DOCX 页数:29 大小:169.44KB
下载 相关 举报
LED3216点阵屏程序.docx_第1页
第1页 / 共29页
LED3216点阵屏程序.docx_第2页
第2页 / 共29页
LED3216点阵屏程序.docx_第3页
第3页 / 共29页
LED3216点阵屏程序.docx_第4页
第4页 / 共29页
LED3216点阵屏程序.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

LED3216点阵屏程序.docx

《LED3216点阵屏程序.docx》由会员分享,可在线阅读,更多相关《LED3216点阵屏程序.docx(29页珍藏版)》请在冰豆网上搜索。

LED3216点阵屏程序.docx

LED3216点阵屏程序

帮同学修改的,显示的是Ta的名字。

Main

/********************************************************

程序名称:

LED3216点阵大屏交替显示时间和温度V1.0

简要说明:

P0口接上行线,P2口接下行线,P1口接扫描线

P1.6接左屏译码器使能端(CS1)

P1.7接右屏译码器使能端(CS2)

晶振12M

编写:

twbin

最后更新:

15/01/02晚于实验室

********************************************************/

//#include//AT89S52单片机头文件

#include//DS1302时钟芯片头文件

#include//DS18B20温度传感器芯片头文件

#include//字库文件

#defineucharunsignedchar

#defineuintunsignedint//宏定义

#definehang1P0//上半屏行线

#definehang2P2//下半屏行线

#definelieP1//扫描列线

#defineSETP3_2//定义设置(调整选择)键

#defineADDP3_3//定义增加键

uchardian1,dian2,dian3,dian4;//用于时间闪烁的冒号

ucharmin,hour;//定义时间映射全局变量

ucharset_st=0;//调整选择标志0:

正常走时;1:

调时;2:

调分

ucharset_key_st=0;//设置标志,为1则调用一次SET键处理

ucharadd_key_st=0;//增加标志,为1则调用一次调时函数

uchark=1;//秒闪烁及选中闪烁标志

/*****参数调整项*****/

#definelight180//显示亮度调节,数值不可过大,以不感到屏幕闪烁为准

ucharm,n,p,t;//全局变量

uchardisbuf[64];//显示缓存

ucharx=0,y=0,z=0;//用于系统时基

/*****延时子程序*****/

voiddelay(void)//专门设置的延时程序用来改变扫描速度以方便调节亮度

{

uchari;

for(i=0;i

}

/*****(n)ms延时子程序*****/

voiddelayms(uintn)

{

uchari;

while(n--)

{

for(i=0;i<125;i++);

}

}

/*****初始化定时器*****/

voidinitTimer(void)

{

TMOD=0x1;//定时器0工作方式1

TH0=0x3c;

TL0=0xb0;//赋初值,定时50ms

}

/*****定时器0中断服务程序*****/

voidtimer0(void)interrupt1

{

TH0=0x3c;

TL0=0xb0;//重新赋初值

x++;y++;z++;

if(x>10){k=~k;x=0;}//0.5秒k取反一次,用于秒的冒号闪烁和调时选中闪烁

if(y>=300){y=0;}//系统时基、工作节拍控制

}

/*****外部中断0服务程序*****/

voidint0(void)interrupt0

{

EX0=0;

set_key_st=1;//开启设置键标志

}

/*****外部中断1服务程序*****/

voidint1(void)interrupt2

{

EX1=0;

add_key_st=1;//开启增加键标志

}

/*****初始化DS1302(用于系统第一次使用)*****/

voidinit_1302(void)//(2009年1月1日00时00分00秒星期一)

{

write_clock(0x8e,0x00);//允许写操作

write_clock(0x8c,0x09);//年

write_clock(0x8a,0x01);//星期

write_clock(0x88,0x01);//月

write_clock(0x86,0x01);//日

write_clock(0x84,0x00);//小时

write_clock(0x82,0x00);//分钟

write_clock(0x80,0x00);//秒

write_clock(0x90,0xa5);//充电

write_clock(0x8e,0x80);//禁止写操作

}

/*****常用时钟数据读取*****/

voidread_clockS(void)

{

hour=read_clock(0x85);//读取小时数据

min=read_clock(0x83);//读取分钟数据

}

/*****SET键处理程序*****/

voidset_key(void)

{

if(SET==0){set_st++;z=0;}

if(set_st>2)set_st=0;//调整功能标志加一

set_key_st=0;//关闭设置键标志

}

/*****设置时间函数*****/

voidSet_time(unsignedcharsel)//引入调整选择标志

{

signedcharaddress,item;

signedcharmax,mini;

if(sel==1){address=0x84;max=23;mini=0;}//小时

if(sel==2){address=0x82;max=59;mini=0;}//分钟

item=((read_clock(address+1))/16)*10+(read_clock(address+1))%16;//读取1302某地址上的数值转换成10进制赋给item

if(ADD==0){item++;z=0;}

if(item>max)item=mini;//查看数值有效范围

if(item

write_clock(0x8e,0x00);//允许写操作

write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302

write_clock(0x8e,0x80);//写保护,禁止写操作

add_key_st=0;//关闭增加键标志

}

/*****读取时间*****/

voidcheck_shijian(void)

{

read_clockS();//读取时间

m=hour/16;//计算得到小时十位数字

n=hour&0x0f;//计算得到小时个位数字

p=min/16;//计算得到分钟十位数字

t=min&0x0f;//计算得到分钟个位数字

}

/*****读取温度*****/

voidcheck_wendu(void)

{

uinti;

i=ReadTemperature()-5;//获取温度值并减去DS18B20的温漂误差

m=i/100;//计算得到十位数字

n=i%10/10;//计算得到个位数字

p=i%10;//计算得到小数位数字

}

/*****将待显示时间内容存至缓冲区*****/

voidload_shijian(void)

{

uchara;

if(set_st==1&&k==1)//调时,小时位闪烁,x的取反频率为闪烁频率

{

for(a=0;a<16;a++){disbuf[a]=0;}

for(a=16;a<32;a++){disbuf[a]=0;}

}

else//正常显示,加载小时信息

{

for(a=0;a<16;a++){disbuf[a]=shuzi1[m*16+a];}

for(a=16;a<32;a++){disbuf[a]=shuzi2[n*16+a-16];}

}

if(set_st==2&&k==1)//调分,分钟位闪烁,x的取反频率为闪烁频率

{

for(a=32;a<48;a++){disbuf[a]=0;}

for(a=48;a<64;a++){disbuf[a]=0;}

}

else//正常显示,加载分钟信息

{

for(a=32;a<48;a++){disbuf[a]=shuzi3[p*16+a-32];}

for(a=48;a<64;a++){disbuf[a]=shuzi4[t*16+a-48];}

}

}

/*****将待显示温度内容存至缓冲区*****/

voidload_wendu(void)

{

uchara;

for(a=0;a<16;a++)

{

if(m==0)

disbuf[a]=0x00;//如果十位为0则不显示,目的在于消除前置0

else

disbuf[a]=shuzi[m*16+a];

}//加载温度十位信息

for(a=16;a<32;a++){disbuf[a]=shuzi[n*16+a-16];}//加载温度个位信息

for(a=32;a<48;a++){disbuf[a]=shuzi[p*16+a-32];}//加载温度小数位信息

for(a=48;a<64;a++){disbuf[a]=fuhao[a-48];}//加载摄氏度符号

}

/*****显示子程序*****/

voiddisplay(void)

{

uchari;

for(i=0;i<8;i++)

{

lie=i|0xB0;//左屏列扫描信号输出

hang1=disbuf[i];

hang2=disbuf[i+8];//行信号输出

delay();//扫描延时

hang1=0;hang2=0;

}

for(i=8;i<16;i++)

{

lie=i|0xB0;//左屏列扫描信号输出

hang1=disbuf[i-8+16];

if(i==15)hang1=dian1;//显示冒号

hang2=disbuf[i+16];//行信号输出

if(i==15)hang2=dian2;//显示冒号

delay();//扫描延时

hang1=0;hang2=0;

}

for(i=0;i<8;i++)

{

lie=i|0x70;//右屏列扫描信号输出

hang1=disbuf[i+32];

if(i==0)hang1=dian3;//显示冒号

hang2=disbuf[i+8+32];//行信号输出

if(i==0)hang2=dian4;//显示冒号

delay();//扫描延时

hang1=0;hang2=0;

}

for(i=8;i<16;i++)

{

lie=i|0x70;//右屏列扫描信号输出

hang1=disbuf[i-8+48];

hang2=disbuf[i+48];//行信号输出

delay();//扫描延时

hang1=0;hang2=0;

}

}

/*****显示图片子程序*****/

voiddisplay_pic(uchar*pic)

{

uchari;

for(i=0;i<16;i++)

{

hang1=hang2=0;

lie=i|0xb0;//左屏列扫描信号输出

hang1=pic[i];//上半屏行信号输出

hang2=pic[i+32];//下半屏行信号输出

delay();hang1=hang2=0;

}

for(i=16;i<32;i++)

{

hang1=hang2=0;

lie=i|0x70;//右屏列扫描信号输出

hang1=pic[i];//上半屏行信号输出

hang2=pic[i+32];//下半屏行信号输出

delay();hang1=hang2=0;

}

}

/*****主程序*****/

voidmain(void)

{

P1=0xff;

delayms(500);//等待芯片复位,目的是稳定检测是否需要初始化

while(SET==0)//通电前按下SET键不放,接通电源时便初始化时间信息

{

init_1302();

display_pic(init_pic);//显示初始化提示画面

}

initTimer();//初始化定时器

TR0=1;//开启定时器0

ET0=1;

EA=1;//开中断总开关

y=0;//系统时基清零

while(y<20)

{

display_pic(LED3216);//开机标识

}

while(y<40)

{

display_pic(kecheng);

}

while(y<60)

{

display_pic(sheji);

}

while(y<80)

{

display_pic(tanyue);

}

while(y<100)

{

display_pic(xia);

}

IT0=1;//开启外部中断0

EX0=1;

IT1=1;//开启外部中断1

EX1=1;

check_wendu();//开机时读取一次温度信息,使DS18B20稳定

y=0;//系统时基清零

while

(1)

{

while(set_key_st)//设置键按下

{

delayms

(1);set_key();EX0=1;

}

if(set_st==1||set_st==2)//进入调时选中状态后如果长时间无调整则自动退出

{

if(z>=200){set_st=0;z=0;}

}

if(set_st==1||set_st==2)y=0;//系统时基清零

if(y<150||set_st==1||set_st==2)

{

check_shijian();//读取时间信息

while(add_key_st&&set_st>0)//增加键按下

{

Set_time(set_st);EX1=1;

}

if(k==1)//控制秒冒号闪烁

{dian1=dian3=0x30;dian2=dian4=0x18;}//秒闪烁,x取反频率即为闪烁频率

else{dian1=dian3=0x00;dian2=dian4=0x00;}

load_shijian();//加载时间

display();//显示

}

elseif(y<152&&set_st==0)

{

check_wendu();//读取温度信息

}

elseif(y<210&&set_st==0)

{

dian1=dian3=dian4=0x00;dian2=0x40;

load_wendu();//加载温度

display();//显示

}

elseif(y<300&&set_st==0)

{

display_pic(xiaxia);//显示霞霞

}

}

}

Ziku

/*****温度显示字形编码*****/

unsignedcharcodeshuzi[]=

{

/*--文字:

0--*/

0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,

/*--文字:

1--*/

0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,

/*--文字:

2--*/

0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,

/*--文字:

3--*/

0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,

/*--文字:

4--*/

0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,

/*--文字:

5--*/

0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,

/*--文字:

6--*/

0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,

/*--文字:

7--*/

0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,

/*--文字:

8--*/

0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,

/*--文字:

9--*/

0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00

};

/*****小时十位字形编码*****/

unsignedcharcodeshuzi1[]=

{

0x00,0xF8,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x3F,0x20,0x20,0x20,0x20,0x3F,0x00,//"未命名文件",0

0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,//"未命名文件",1

0x00,0x08,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x3F,0x21,0x21,0x21,0x21,0x21,0x00,//"未命名文件",2

0x00,0x08,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x21,0x21,0x21,0x21,0x21,0x3F,0x00,//"未命名文件",3

0x00,0xF8,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x3F,0x00,//"未命名文件",4

0x00,0xF8,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x21,0x21,0x21,0x21,0x21,0x3F,0x00,//"未命名文件",5

0x00,0xF8,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x3F,0x21,0x21,0x21,0x21,0x3F,0x00,//"未命名文件",6

0x00,0x08,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,//"未命名文件",7

0x00,0xF8,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x3F,0x21,0x21,0x21,0x21,0x3F,0x00,//"未命名文件",8

0x00,0xF8,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x21,0x21,0x21,0x21,0x21,0x3F,0x00//"未命名文件",9

};

/*****小时个位字形编码*****/

unsignedcharcodeshuzi2[]=

{

0xF8,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x3F,0x20,0x20,0x20,0x20,0x3F,0x00,0x00,//"未命名文件",0

0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,//"未命名文件",1

0x08,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x3F,0x21,0x21,0x21,0x21,0x21,0x00,0x00,//"未命名文件",2

0x08,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x21,0x21,0x21,0x21,0x21,0x3F,0x00,0x00,//"未命名文件",3

0xF8,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x3F,0x00,0x00,//"未命名文件",4

0xF8,0x08,0x08,0x08,0x08

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 生物学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1