单片机实物制作--点阵时钟程序
- 格式:doc
- 大小:242.50 KB
- 文档页数:8
数字钟、万年历制作(基于单片机)电路原理图:程序://********************20131206****数字钟程序#pragma SMALL#include <reg51.h>#include <absacc.h>#include <intrins.h>//********************************************************* *********编译预处理void display(unsigned char *p); //显示函数,P为显示数据首地址unsigned char keytest(); //按键检测函数unsigned char search(); //按键识别函数void alarm(); //闹钟判断启动函数void ftion0(); //始终修改函数void ftion1(); //闹钟修改函数void ftion3(); //日期修改函数void cum(); //加1修改函数void minus(); //减1修改函数void jinzhi(); //进制修改函数void riqi(); //日期void stopwatch(); //秒表函数//********************************************************* *******函数声明sbit P2_7=P2^7;//********************************************************* *******端口定义unsigned char clockbuf[3]={0,0,0};unsigned char bellbuf[3]={0,0,0};unsigned char date[3]={1,1,1}; //日期存放数组unsigned char stop[3]={0,0,0};unsigned char msec1,msec2;unsigned char timdata,rtimdata,dtimdata;unsigned char count;unsigned char *dis_p;unsigned char or; //12进制控制标志unsigned char ri; //日期显示控制标志位unsigned char mb; //秒表控制标志位bit arm,rtim,rhour,rmin,hour,min,sec,day,mon,year; //定义位变量//********************************************************* *****全局变量定义void main(){unsigned char a;or=0; //12进制修改标志清零ri=0;mb=0;P2_7=0;arm=0;msec1=0;msec2=0;timdata=0;rtimdata=0;count=0;TMOD=0x12;TL0=0x06;TH0=0x06;TH1=(65536-10000)/256;TL1=(65536-10000)%256;EA=1;ET0=1;ET1=1;TR0=1;TR1=0;dis_p=clockbuf;while(1){a=keytest();if(a==0x78) //判断是否有键按下{display(dis_p);if(arm==1) alarm();}else{display(dis_p);a=keytest();if(a!=0x78){a=search();switch(a){case 0x00:ftion0();break;case 0x01:ftion1();break;case 0x02:cum();break;case 0x06:jinzhi();break;case 0x03:riqi();break;case 0x04:ftion3();break;case 0x05:minus();break;case 0x07:stopwatch();break;case 0x09:TR1=1;break;case 0x0a:TR1=0;break;case 0x0b:stop[0]=0;stop[1]=0;stop[2]=0;break;default:break;}}}}}//********************************************主函数【完】void display(unsigned char *p){unsigned char buffer[]={0,0,0,0,0,0};unsigned char k,i,j,m,temp;unsigned char led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};buffer[0]=p[0]/10;buffer[1]=p[0]%10;buffer[2]=p[1]/10;buffer[3]=p[1]%10;buffer[4]=p[2]/10;buffer[5]=p[2]%10;if((sec==0)&&(min==0)&&(hour==0)&&(rmin==0)&&(rhour==0)&&( day==0)&&(mon==0)&&(year==0)) //没有修改标志,正常显示{for(k=0;k<3;k++){temp=0x01;for(i=0;i<6;i++){P0=0x00; //段选端口j=buffer[i];P0=led[j];P1=~temp; //位选端口temp<<=1;for(m=0;m<200;m++);}}}else //若有修改标志,则按以下标志分别显示{if(sec==1||day==1){P1=0x1f;i=buffer[5];P0=led[i];for(m=0;m<200;m++);P1=0x2f;j=buffer[4];P0=led[j];for(m=0;m<200;m++);}if(min==1||rmin==1||mon==1){P1=0x3b;i=buffer[2];P0=led[i];for(m=0;m<200;m++);P1=0x37;j=buffer[3];P0=led[j];for(m=0;m<200;m++);}if(hour==1||rhour==1||year==1) {P1=0x3e;i=buffer[0];P0=led[i];for(m=0;m<200;m++);P1=0x3d;j=buffer[1];P0=led[j];for(m=0;m<200;m++);}}}//**********************************LED显示函数【完】unsigned char keytest(){unsigned char c;P2=0x78; //检测是否有键按下c=P2;c=c&0x78;return(c);}//******************************************键盘检测函数【完】unsigned char search(){unsigned char a,b,c,d,e;c=0x3f;a=0; //行号while(1){P2=c;d=P2;d=d&0x07;if(d==0x03){b=0;break;} //列号else if(d==0x05){b=1;break;}else if(d==0x06){b=2;break;}a++;c>>=1;if(a==5){a=0;c=0x3f;}}e=a*3+b;do{display(dis_p);}while((d=keytest())!=0x78);return(e);}//***********************************************查键值函数【完】void alarm(){if((clockbuf[0]==bellbuf[0])&&(clockbuf[1]==bellbuf[1])){P2_7=1;rtim=1;if(count==10){count=0;P2_7=0;arm=0;rtim=0;}}}//****************************************闹钟判断启动函数【完】void ftion0(){TR0=0;rhour=0;rmin=0;dis_p=clockbuf;rtimdata=0;timdata++;switch(timdata){case 0x01:sec=1;break;case 0x02:sec=0;min=1;break;case 0x03:min=0;hour=1;break;case 0x04:timdata=0;hour=0;TR0=1;break;default:break;}}//*********************************************时钟设置函数【完】void ftion1(){if(TR0==0) TR0=1;sec=0;min=0;hour=0;dis_p=bellbuf;timdata=0;rtimdata++;switch(rtimdata){case 0x01:rmin=1;break;case 0x02:rmin=0;rhour=1;break;case 0x03:rtimdata=0;rhour=0;arm=1;dis_p=clockbuf;break;default:break;}}//*********************************************闹钟设置函数【完】void ftion3(){if(TR0==0) TR0=1;day=0;mon=0;year=0;dis_p=date;timdata=0;rtimdata=0;dtimdata++;switch(dtimdata){case 0x01:day=1;break;case 0x02:day=0;mon=1;break;case 0x03:mon=0;year=1;break;case 0x04:dtimdata=0;year=0;dis_p=clockbuf;break;default:break;}}//*************************************************日期修改函数【完】void minus(){if(sec==1){if(0==clockbuf[2]) clockbuf[2]=59;else clockbuf[2]--;}else if(min==1){if(0==clockbuf[1]) clockbuf[1]=59;else clockbuf[1]--;}else if(hour==1){if(or==0) //判断进制{if(0==clockbuf[0]) clockbuf[0]=23;else clockbuf[0]--;}if(or==1){if(1==clockbuf[0]) clockbuf[0]=12;else clockbuf[0]--;}}else if(rmin==1){if(bellbuf[1]==0) bellbuf[1]=59;else bellbuf[1]--;}else if(rhour==1){if(or==0){if(bellbuf[0]==0) bellbuf[0]=23;else bellbuf[0]--;}if(or==1){if(bellbuf[0]==1) bellbuf[0]=12;else bellbuf[0]--;}}else if(day==1){if(date[2]==1) date[2]=31;else date[2]--;}else if(mon==1){if(date[1]==1) date[1]=12;else date[1]--;}else if(year==1){if(date[0]==1) date[0]=99;else date[0]--;}}//*************************************减1修改功能函数【完】void cum(){if(sec==1){if(59==clockbuf[2]) clockbuf[2]=0;else clockbuf[2]++;}else if(min==1){if(59==clockbuf[1]) clockbuf[1]=0;else clockbuf[1]++;}else if(hour==1){if(or==0) //判断进制{if(23==clockbuf[0]) clockbuf[0]=0;else clockbuf[0]++;}if(or==1){if(12==clockbuf[0]) clockbuf[0]=1;else clockbuf[0]++;}}else if(rmin==1){if(bellbuf[1]==59) bellbuf[1]=0;else bellbuf[1]++;}else if(rhour==1){if(or==0){if(bellbuf[0]==23) bellbuf[0]=0;else bellbuf[0]++;}if(or==1){if(bellbuf[0]==12) bellbuf[0]=1;else bellbuf[0]++;}}else if(day==1){if(date[2]==31) date[2]=1;else date[2]++;}else if(mon==1){if(date[1]==12) date[1]=1;else date[1]++;}else if(year==1){if(date[0]==99) date[0]=0;else date[0]++;}}//*************************************加1修改功能函数【完】void jinzhi(){if(or==0) or=1;else or=0;}//***********************************进制修改控制函数【完】void riqi(){if(ri==0){dis_p=date;}if(ri==1){dis_p=clockbuf;}ri++;if(ri==2) ri=0;}//********************************日期控显示函数【完】void stopwatch(){if(mb==0){dis_p=stop;mb=1;}else{mb=0;dis_p=clockbuf;}}//************秒表**********秒表**********秒表函数【完】void clock() interrupt 1{EA=0;if(msec1!=0x14) msec1++; //6MHz晶振定时10mselse{msec1=0;if(msec2!=100) msec2++; //定时1selse{if(rtim==1) count++; //闹钟启动标志计时10smsec2=0;if(clockbuf[2]!=59) clockbuf[2]++;else{clockbuf[2]=0;if(clockbuf[1]!=59) clockbuf[1]++;else{clockbuf[1]=0;if(or==0){if(clockbuf[0]!=23) clockbuf[0]++;else{clockbuf[0]=0;if((date[1]==1)||(date[1]==1)||(date[1]==1)||(date[1]==3)||(date[ 1]==5)||(date[1]==7)||(date[1]==8)||(date[1]==10)||(date[1]==12)){if(date[2]!=30) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}if((date[1]==4)||(date[1]==6)||(date[1]==9)||(date[1]==11)){if(date[2]!=29) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}if(date[1]==2){if((((date[0]%4==0)&&(date[0]%100!=0))||(date[0]%400==0))){if(date[2]!=28) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}else{if(date[2]!=27) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}}}}if(or==1){if(clockbuf[0]!=12) clockbuf[0]++;else{clockbuf[0]=0;if((date[1]==1)||(date[1]==1)||(date[1]==1)||(date[1]==3)||(date[ 1]==5)||(date[1]==7)||(date[1]==8)||(date[1]==10)||(date[1]==12)){if(date[2]!=30) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}if((date[1]==4)||(date[1]==6)||(date[1]==9)||(date[1]==11)){if(date[2]!=29) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}if(date[1]==2){if((((date[0]%4==0)&&(date[0]%100!=0))||(date[0]%400==0))){if(date[2]!=28) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}else{if(date[2]!=27) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}}}}}}}}EA=1;}//*******************************定时器0中断函数【完】void miaobiao() interrupt 3{TH1=(65536-10000)/256;TL1=(65536-10000)%256;if(stop[2]!=99) stop[2]++;else{stop[2]=0;if(stop[1]!=59) stop[1]++;else{stop[1]=0;if(stop[0]!=59) stop[0]++;else stop[0]=0;}}}//***********************************定时器1中断函数【完】。
"单片机原理"课程设计说明书题目LED点阵显示电子钟设计系(部)专业(班级)**指导教师起止日期"单片机原理及应用"课程设计任务书15系(部):电信系专业:指导教师:学院课程设计鉴定表目录1. 系统总体方案选择与说明42. 各单元硬件设计说明及计算方法53. 软件设计与说明〔包括流程图〕5 5. 调试结果与必要的调试说明12 6. 使用说明12 7. 课程设计体会12 8. 参考文献131. 系统总体方案选择与说明本方案基于AT89S52单片机设计的,还用到13块74HC573和1块74HC138芯片,8快8*8LED 点阵,原理比拟简单,但所有硬件本钱较高,不适应商业用途。
一个是硬件构造的设计,一个是控制的总体思想。
在本小节中将对这两局部容进展简单的表达1.1硬件构造根据工程的功能和要求,可采用AT89S52单片机作为核心控制器。
LED 点阵电子钟系统组成包括:显示电路模块、显示驱动电路模块、按键电路模块以及电源模块。
框图如图1.1所示。
1.2 控制思想LED 点阵电子钟程序主要功能是屏幕显示时间稳定,准确。
所以按照分块设计的方法可以把程序分为主程序、显示程序、调整程序。
主程序主要是用来初始化系统和控制各个子程序之间执行的顺序。
显示程序用来完成数字在LED 点阵上的显示,时钟的显示是使用8块8×8点阵显示屏。
2. 各单元硬件设计说明及计算方法74HC13874HC138 作用原理于高性能的存贮译码或要求传输延迟时间短的数据传输系统在 高性能存贮器系统中,用这种译码器可以提高译码系统的效率。
将快速赋能电路用于高速存贮器时,译码器的延迟时间和存贮器的赋能时间通常小于存贮器的典型存取时间,这就是说由肖特基钳位的系统译码器所引起的有效系统延迟可以忽略不计。
HC138 按照三位二进制输入码和赋能输入条件,从8 个输出端中译出一个 低电平输出。
两个低电平有效的赋能输入端和一个高电平有效的赋能输入端减少了扩展所需要的外接门或倒相器,扩展成24 线译码器不需外接门;扩展成32 线译码器,只需要接一个外接倒相器。
#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar m1,m2,m3,m4,m5,m6,temp1,temp2,temp3;sbit load=P3^4; //每一字节时钟sbit clk=P3^3; //每一位时钟sbit di=P3^2; //数据输入sbit mx=P1^7; // 138总选通端sbit hx=P1^6; // 138选通端sbit a8=P1^3;sbit b8=P1^4;sbit c8=P1^5;//寄存器宏定义#define WRITE_SECOND 0x80#define WRITE_MINUTE 0x82#define WRITE_HOUR 0x84#define READ_SECOND 0x81#define READ_MINUTE 0x83#define READ_HOUR 0x85#define WRITE_PROTECT 0x8E//位寻址寄存器定义sbit ACC_7 = ACC^7;sbit SCLK = P3^7; // DS1302时钟信号7脚sbit DIO= P3^6; // DS1302数据信号6脚sbit CE = P3^5 ; // DS1302片选5脚char code shuzi[20][16]={0x00,0x00,0x00,0x07,0x1C,0x38,0x38,0x78,0x78,0x38,0x38,0x38,0x1C,0x07,0x00,0x00,//0 0x00,0x00,0x00,0xF0,0x38,0x1C,0x1C,0x1E,0x1E,0x1C,0x1C,0x1C,0x38,0xE0,0x00,0x00, 0x00,0x00,0x00,0x01,0x0F,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x1F,0x00,0x00,//1 0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xF8,0x00,0x00, 0x00,0x00,0x00,0x0F,0x18,0x38,0x38,0x00,0x00,0x01,0x07,0x0C,0x3F,0x3F,0x00,0x00,//2 0x00,0x00,0x00,0xF0,0x18,0x1C,0x1C,0x38,0x70,0xC0,0x00,0x04,0xFC,0xFC,0x00,0x00, 0x00,0x00,0x00,0x0F,0x38,0x38,0x00,0x03,0x03,0x00,0x00,0x38,0x38,0x1F,0x00,0x00,//3 0x00,0x00,0x00,0xF0,0x38,0x18,0x38,0xF0,0xF0,0x18,0x1C,0x1C,0x18,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x0C,0x18,0x30,0x3F,0x00,0x00,0x03,0x00,0x00,//4 0x00,0x00,0x00,0x30,0xF0,0xF0,0x70,0x70,0x70,0x70,0xFE,0x70,0x70,0xFE,0x00,0x00,0x00,0x00,0x00,0x1F,0x18,0x18,0x18,0x1F,0x18,0x00,0x10,0x38,0x38,0x0F,0x00,0x00,//5 0x00,0x00,0x00,0xFC,0x00,0x00,0xC0,0xF8,0x1C,0x1C,0x1C,0x1C,0x18,0xF0,0x00,0x00, 0x00,0x00,0x00,0x07,0x0C,0x18,0x38,0x3F,0x7C,0x78,0x38,0x38,0x1C,0x0F,0x00,0x00,//6 0x00,0x00,0x00,0xF8,0x38,0x10,0x00,0xF8,0x1C,0x0C,0x0E,0x0C,0x18,0xF0,0x00,0x00, 0x00,0x00,0x00,0x1F,0x38,0x30,0x00,0x00,0x00,0x01,0x03,0x03,0x03,0x03,0x00,0x00,//7 0x00,0x00,0x00,0xFE,0x0C,0x10,0x30,0x60,0xC0,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x0F,0x38,0x30,0x3C,0x1F,0x0F,0x38,0x70,0x70,0x38,0x0F,0x00,0x00,//80x00,0x00,0x00,0xF0,0x1C,0x0C,0x1C,0xF0,0xF0,0x78,0x1C,0x0C,0x18,0xF0,0x00,0x00, 0x00,0x00,0x00,0x0F,0x38,0x30,0x70,0x70,0x38,0x1F,0x00,0x18,0x3C,0x1F,0x00,0x00,//9 0x00,0x00,0x00,0xF0,0x18,0x1C,0x1C,0x1C,0x3C,0xDC,0x1C,0x38,0x70,0xE0,0x00,0x00 };/*“时”*/uchar code shi[2][16]={0x00,0x04,0x7E,0x44,0x47,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x7C,0x44,0x00,0x00, 0x08,0x08,0x08,0x08,0xFE,0x08,0x08,0x88,0x48,0x48,0x08,0x08,0x08,0x48,0x28,0x10//时};/*“分”*/uchar code fen[2][16]={0x00,0x04,0x04,0x08,0x08,0x10,0x20,0x4F,0x84,0x04,0x04,0x04,0x04,0x08,0x11,0x20,0x80,0x80,0x40,0x40,0x20,0x10,0x08,0xEE,0x24,0x20,0x20,0x20,0x20,0x20,0x40,0x80//分};/*年*/uchar code nian[2][16]={0x08,0x08,0x1F,0x11,0x21,0x41,0x1F,0x11,0x11,0x11,0xFF,0x01,0x01,0x01,0x01,0x01,0x00,0x08,0xFC,0x00,0x00,0x10,0xF8,0x00,0x00,0x04,0xFE,0x00,0x00,0x00,0x00,0x00//年};/*月*/uchar code yue[2][16]={0x00,0x0F,0x08,0x08,0x08,0x0F,0x08,0x08,0x08,0x0F,0x08,0x08,0x10,0x10,0x20,0x40,0x10,0xF8,0x10,0x10,0x10,0xF0,0x10,0x10,0x10,0xF0,0x10,0x10,0x10,0x10,0x50,0x20//月};void delay() //延时函数{uint m;for(m=100;m>0;m--);}//////////////////////////////////////////////////////////////////////////////////////////void data_595(uchar dat) //595送数据{uchar i;for(i=8;i>0;i--){clk=0;di=(bit)(dat&0x01);dat>>=1;clk=1;}}/////////////////////////////////////////////////////////////////////////////////////////void hang_138(uchar din) //138行选{uchar tem;tem=din;load=1;load=0;a8=(bit)(tem&0x01);b8=(bit)(tem&0x02);c8=(bit)(tem&0x04);mx=(bit)(tem&0x08);hx=0;delay();hx=1;}void Write1302 ( unsigned char addr,dat ){unsigned char i,temp;CE=0; //CE引脚为低,数据传送中止SCLK=0; //清零时钟总线CE = 1; //CE引脚为高,逻辑控制有效//发送地址for ( i=8; i>0; i-- ) //循环8次移位{SCLK = 0;temp = addr;DIO = (bit)(temp&0x01); //每次传输低字节addr >>= 1; //右移一位SCLK = 1;}//发送数据for ( i=8; i>0; i-- ){SCLK = 0;temp = dat;DIO = (bit)(temp&0x01);dat >>= 1;SCLK = 1;}SCLK=1;CE = 0;}//数据读取子程序unsigned char Read1302 ( unsigned char addr ){unsigned char i,temp,dat1,dat2;CE=0;SCLK=0;CE = 1;//发送地址for ( i=8; i>0; i-- ) //循环8次移位{SCLK = 0;temp = addr;DIO = (bit)(temp&0x01); //每次传输低字节addr >>= 1; //右移一位SCLK = 1;}//读取数据for ( i=8; i>0; i-- ){ACC_7=DIO;SCLK = 1;ACC>>=1;SCLK = 0;}SCLK=1;CE=0;dat1=ACC;dat2=dat1/16; //数据进制转换dat1=dat1%16; //十六进制转十进制dat1=dat1+dat2*10;return (dat1);}//初始化DS1302(选择性使用)void init1302(void){// Write1302 (WRITE_PROTECT,0X00); //禁止写保护Write1302 (WRITE_SECOND,0x00); //秒位初始化Write1302 (WRITE_MINUTE,0x29); //分钟初始化Write1302 (WRITE_HOUR,0x06); //小时初始化//Write1302 (0x80,0x80); //时钟暂停//Write1302 (0x86,0x17); //日初始化//Write1302 (0x88,0x06); //月初始化//Write1302 (0x8c,0x13); //年初始化//Write1302 (WRITE_PROTECT,0x80); //允许写保护}/*BCD码转化为十六进制*/uchar BCD_Decimal(uchar bcd){uchar Decimal;Decimal=bcd>>4;return(Decimal=Decimal*10+(bcd&=0x0f));}/*十六进制转化为BCD*/uchar Dec_BCD(uchar Dec){uchar BCD;BCD=(Dec)/10*16+(Dec)%10;return(BCD);}void display4(void){uchar i,h4=0x08;uint a;temp1= BCD_Decimal(Read1302(0x81)); //读取秒的数据temp2= BCD_Decimal(Read1302(0x83)); //读取分的数据temp3= BCD_Decimal(Read1302(0x85)); //读取时的数据m1=(temp1%10)*2;m2=(temp1/10)*2;m3=(temp2%10)*2;m4=(temp2/10)*2;m5=(temp3%10)*2;m6=(temp3/10)*2;for(a=0;a<200;a++){for(i=0;i<16;i++){data_595(~shuzi[m1+1][i]);data_595(~shuzi[m1][i]);data_595(~shuzi[m2+1][i]);data_595(~shuzi[m2][i]);data_595(~fen[1][i]);data_595(~fen[0][i]);data_595(~shuzi[m3+1][i]);data_595(~shuzi[m3][i]);data_595(~shuzi[m4+1][i]);data_595(~shuzi[m4][i]);//data_595(~shi[1][i]);//data_595(~shi[0][i]);data_595(~shuzi[m5+1][i]);data_595(~shuzi[m5][i]);data_595(~shuzi[m6+1][i]);data_595(~shuzi[m6][i]);hang_138(h4);h4++;}}}void main(){init1302(); //1302初始化temp1=BCD_Decimal(Read1302(0x81)); //读取秒的数据temp2=BCD_Decimal(Read1302(0x83)); //读取分的数据temp3=BCD_Decimal(Read1302(0x85)); //读取时的数据// temp4=BCD_Decimal(Read1302(0x87)); //读取日的数据// temp5=BCD_Decimal(Read1302(0x89)); //读取月的数据// temp6=BCD_Decimal(Read1302(0x8d)); //读取年的数据display4();}[文档可能无法思考全面,请浏览后下载,另外祝您生活愉快,工作顺利,万事如意!]。
//------------------------------定义头文件#include <reg51.h>//MCS-51单片机//------------------------------定义缩写字符#define uchar unsigned char#define uint unsigned int//------------------------------定义扬声器接口,低电平使能sbit Bell_Out = P1 ^ 5;//扬声器驱动//------------------------------定义DS18B20音sbit DQ = P1 ^ 6;//ds1820data(单总线)//------------------------------定义DS1302时钟接口sbit clock_clk = P3 ^ 5;//ds1302_clk(时钟线)sbit clock_dat = P3 ^ 6;//ds1302_dat(数据线)sbit clock_Rst = P3 ^ 7;//ds1302_Rst(复位线)//-----------------------------定义数据口#define Led_13 P0 //第1、3屏数据口#define Led_24 P2 //第2、4屏数据口#define Led_E P1 //74HC154的BCD列驱动(P1.0~P1.4)sbit Led_EA = P1 ^ 4;//显示列驱动器(74HC154)使能//-----------------------------独立键盘定义sbit Add_Key = P3 ^ 1;//前位加1键sbit Add2_Key = P3 ^ 0;//后位加1键sbit OK_Key = P3 ^ 2;//确定键sbit int_Key = P3 ^ 3;//中断入口//-----------------------------定义累加器A中的各位sbit a0 = ACC ^ 0;sbit a1 = ACC ^ 1;sbit a2 = ACC ^ 2;sbit a3 = ACC ^ 3;sbit a4 = ACC ^ 4;sbit a5 = ACC ^ 5;sbit a6 = ACC ^ 6;sbit a7 = ACC ^ 7;//------------------------------------定义全局变量bit txx = 0;uchar settime;//定义标志位uchar yy,mo,dd,xq,hh,mm,bn;//定义时间映射全局变量(专用寄存器)static uchar timecount = 0;//定义静态软件计数器变量static uchar pp = 0;//定义静态小时更新用数据变量//------------------------------------函数声明(按字母顺序排列)void Beep(void);void Beep_key(void);void Beep_set(void);void clearRAM (void);uchar clock_in(void);void clock_out(uchar dd);void Delay(int num);void DelayM(uint a);void display (void);void display_s (void);void Init_1302(void);void int1 (void);void putin (uchar u);uchar read_clock(uchar ord);void read_clockS(void);void Set_time(unsigned char sel);void setput (uchar k);void Timer0(void);void Timer0_Init(void);void write_clock(uchar ord, uchar dd);uchar DL (uchar);uchar DSS (void);//-----------------------------定义显示缓冲寄存器(32个字节全局变量)uchar Ledplay [35];////-----------------------------定义字符数据表单(二维数组)uchar code no[][10]={//-----------------------------------数字字符表{0x7E,0xFF,0x81,0x81,0xFF,0x7E,0},//0{0x82,0xFF,0xFF,0x80,0}, //1{0xC6,0xE7,0xB1,0x99,0x8F,0x86,0},//2{0x42,0xC3,0x89,0x89,0xFF,0x76,0},//3{0x30,0x28,0xA6,0xFF,0xFF,0xA0,0},//4{0x4F,0xCF,0x89,0x89,0xF9,0x71,0},//5{0x7E,0xFF,0x89,0x8B,0xFB,0x70,0},//6{0x03,0x03,0xF9,0xFF,0x07,0},//7{0x76,0xFF,0x89,0x89,0xFF,0x76,0},//8{0x0E,0xDF,0xD1,0x91,0xFF,0x7E,0},//9//-----------------------------------星期字符表{0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x10,0},//一10{0x40,0x44,0x44,0x44,0x44,0x44,0x44,0x40,0},//二{0x82,0x92,0x92,0x92,0x92,0x92,0x82,0x80,0},//三{0xFE,0xA2,0x9E,0x82,0x9E,0xA2,0xFE,0},//四{0x80,0x89,0xFF,0x89,0x89,0x89,0xF9,0x80,0},//五{0x88,0x68,0x38,0x0E,0x38,0x68,0x88,0},//六{0xFE,0x92,0x92,0x92,0x92,0xFE,0},//日10+6//-----------------------------------特殊字符表{0x6C,0x6C,0},//“:”17{0x18,0x18,0x18,0x18,0},//“-”18{0x06,0x06,0x78,0xFC,0x84,0x84,0x84,0x80,0},//“oC”19{0x02,0x8E,0xFC,0xFC,0x8E,0x02,0},//“Y”(在调时时表示年)20{0x80,0x7E,0x15,0x15,0x95,0xFF,0},//“月”21{0xFE,0x92,0x92,0x92,0x92,0xFE,0}//“日”22};//-----------------------------------开机画面,显示“DYDIY”uchar code dydiy[]={//显示“DYDIY”0x82,0xFE,0xFE,0x82,0xFE,0x7C,0,0x02,0x8E,0xFC,0xFC,0x8E,0x02,0,0x82,0xFE,0xFE,0x82,0xFE,0x7C,0,0x82,0xFE,0xFE,0x82,0,0x02,0x8E,0xFC,0xFC,0x8E,0x02,0,0x99};//---------------------------------------延时函数2uS/次void Delay(int num){for (;num>0;num--);}//---------------------------------------延时函数1MS/次void DelayM(unsigned int a){unsigned char i;while( --a != 0){for(i = 0; i < 125; i++); //一个; 表示空语句,CPU空转。
Southwest university of science and technology本科毕业设计(论文)基于单片机的点阵式时钟电子显示屏设计与实现学院名称信息工程学院专业名称电子信息工程学生姓名王钧仟学号指导教师郭锋二〇一〇年六月相关资料下载地址:打包放送,欢迎下载,谢谢!里面包括:源程序包iarLed1664proteus仿真文件74HC154 74HC595资料AVR_fighterLED点阵取模软件ATmage8 芯片中文资料硬件电路板和usbasp下载器的Pcb文件毕业设计论文基于单片机的点阵式时钟电子显示屏设计与实现摘要:电子时钟,它最大的特点在于走时精准和功能的多样化,为咱们带来了极大的方便。
而LED点阵式显示屏,具有亮度高、功耗小、寿命长等优势。
假设以LED 点阵来作为电子时钟的显示屏,那么可实现远距离、大视角的时钟显示。
从而超级适合于在公开场合中显示时刻。
本设计的重点在于对点阵式显示屏的显示研究。
从宏观上来上,显示屏可分为两个部份:显示器件和微操纵器。
由微操纵器操纵显示器件的亮灭、颜色转变,从而组合出所需要的图相。
在这次设计中,采纳了16 x 64 个单色LED作为显示器件,用Mega8作为微操纵器,以静止和左移的方式进行时钟显示。
由于充分考虑了软硬件的易扩充性,用本设计的构架思想可很方便地进行点阵扩充和多个汉字或图形的显示。
设计中所涉及的知识点要紧有:点阵显示原理,字模提取,显示左移算法的实现,单片机Meg8和编译器IAR的利用。
和在软硬件设计调试进程中的各类现象及解决方案。
关键词: 电子时钟;点阵显示原理;LED点阵;单片机;Mega8;IAR;74HC154;74HC595;Design and Implementation of Dot-matrix ClockDisplay ScreenAbstract: Electronic clock system, which features that time is very accurate and function are diversity, brought us great ,The LED dot matrix have advantage of high brightness, low power consumption, long lifetime etc. If use LED dot matrix as screen to display electronic clock, can achieve long-range, large angle of the clock display very suitable to display the time in public places.This design focuses on the display of dot matrix .Look from the macro, the design can be divided into two parts: the screen part and microcontroller part. The micro-controller control the Leds off and on. In this design, using 16 x 64 monochrome LED as the display screen, using Mega8 as micro-controller,We can get an effect of static display and left-move full consideration to the ease Expansion of hardware and software , the framework of ideas can be easily expanded to dispaly a large number of Chinese characters or expanded to more dot-matrix Led screenThe knowledge involved in this design are: dot matrix display principle, font data extraction, left-move showe algorithm, Meg8 and the use of IAR the solutions to problem Encountered in the process of debugging software and hardware.Keywords: electronic clock; dot matrix display principle; LED dot matrix; SCM; Mega8; IAR; 74HC154; 74HC595;目录摘要Abstract引言...............................................................................................................................错误!未定义书签。
单片机8X16点阵滚动显示的时钟一、8X16点阵滚动显示的时钟这作品的运行方式是:接上电源,8*16的点阵屏就会以滚动左移显示时间。
有2个按键。
按键1:是用来调整时间的,长按下按键1,就可以进入时间调整。
调整的顺序为小时十位,小时个位,分钟十位,然后再按下按键1时返回显示状态,操作很简单。
按键2:调整显示模式的,按下就是停止滚动,当前位置静态显示时间。
再按多次就恢复滚动显示。
显示部分:显示部分是本次设计最核心的部分,对于LED8*16点阵显示有以下两种方案:方案一:静态显示,将一帧图像中的每一个二极管的状态分别用0 和1 表示,若为0 ,则表示L ED 无电流,即暗状态;若为1 则表示二极管被点亮。
若给每一个发光二极管一个驱动电路,一幅画面输入以后,所有L ED 的状态保持到下一幅画。
对于静态显示方式方式,所需的译码驱动装置很多,引线多而复杂,成本高,且可靠性也较低。
方案二:动态显示,对一幅画面进行分割,对组成画面的各部分分别显示,是动态显示方式。
动态显示方式方式,可以避免静态显示的问题。
但设计上如果处理不当,易造成亮度低,闪烁问题。
因此合理的设计既应保证驱动电路易实现,又要保证图像稳定,无闪烁。
动态显示采用多路复用技术的动态扫描显示方式, 复用的程度不是无限增加的, 因为利用动态扫描显示使我们看到一幅稳定画面的实质是利用了人眼的暂留效应和发光二极管发光时间的长短, 发光的亮度等因素. 我们通过实验发现, 当扫描刷新频率(发光二极管的停闪频率) 为50Hz, 发光二极管导通时间≥1m s 时, 显示亮度较好, 无闪烁感.。
鉴于上述原因, 我们采用方案二数字时钟数字时钟是本设计的重要的部分。
根据需要,可利用两种方案实现。
方案一:本方案完全用软件实现数字时钟。
原理为:在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。
利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将时字节清零。
ORG 0000H ;定义程序开始地址LJMP MAIN ;初始化复位入口ORG 0003H ;定义MAIN起始地址为0003HLJMP PINT0ORG 000BHLJMP INTT0 ;初始化中断入口ORG 0013HLJMP PINT1ORG 0030H ;主程序MAIN: MOV SP,#60H ;把立即数0x60植入SPMOV TMOD,#01H ;送立即数01H到定时器的寄存器MOV TL0,#0e0H ;送立即数0e0H到定时/计数器0 的低8位MOV TH0,#0b1H ;送立即数0b1H到定时/计数器0 的高8位MOV IE,#87H ;送立即数0x87到中端允许寄存器MOV 30H,#01H ;时十位MOV 31H,#02H ;时个位MOV 32H,#0AH ;光标点位MOV 33H,#00H ;分十位MOV 34H,#00H ;分个位MOV 35H,#00H ;秒十位MOV 36H,#00H ;秒个位SETB IT0 ;外部中断0中断触发方式选择位,为0是低电平触发,为1是下降沿触发SETB IT1 ;外部中断1中断触发方式选择位,为0是低电平触发,为1是下降沿触发SETB PT0SETB TR0 ;定时/计数器0开始运行LOOP0: LCALL DISPLJMP LOOP0INTT0: MOV TL0,#0e0HMOV TH0,#0b1HPUSH ACCPUSH PSWINC 36HMOV A,36HCJNE A,#25,PLLMOV 32H,#0BHPLL: CJNE A,#50,ENDD ;1SMOV 32H,#0AHMOV 36H,#00HINC 35HMOV A,35HCJNE A,#60,ENDd ;分个位 MOV 35H,#00H INC 34HMOV A,34HCJNE A,#0AH,ENDd ;分个位 MOV 34H,#00H INC 33HMOV A,33HCJNE A,#06H,ENDd ;分十位 MOV 33H,#00H INC 31HMOV A,30HCJNE A,#02H,END1MOV A,31HCJNE A,#04H,END1 ;时个位 MOV 31H,#00H MOV 30H,#00HEND1: MOV A,31HCJNE A,#0AH,ENDd ;时个位 MOV 31H,#00H INC 30HENDd: POP PSWPOP ACCRETIDISP: PUSH ACCPUSH PSWMOV A,30H ;显示要显示的数字 MOV B,#08H MUL ABMOV 3BH,AMOV R4,#00HMOV R5,#08HLOOP00: MOV A,3BHMOV DPTR,#TABEMOVC A,@A+DPTRMOV P2,R4MOV P0,AMOV P1,#0FEHINC 3BHINC R4LCALL DELAYDJNZ R5,LOOP00MOV A,31H ;显示要显档的数字 MOV B,#08H MUL ABMOV 3BH,AMOV R4,#00HMOV R5,#08HLOOP11: MOV A,3BHMOV DPTR,#TABEMOVC A,@A+DPTRMOV P2,R4MOV P0,AMOV P1,#0FDHINC 3BHINC R4LCALL DELAYDJNZ R5,LOOP11MOV A,32H ;显示要显档的数字 MOV B,#08H MUL ABMOV 3BH,AMOV R4,#00HMOV R5,#08HLOOP22: MOV A,3BHMOV DPTR,#TABEMOVC A,@A+DPTRMOV P2,R4MOV P0,AMOV P1,#0FBHINC 3BHINC R4LCALL DELAYDJNZ R5,LOOP22MOV A,33H ;显示要显档的数字 MOV B,#08H MUL ABMOV 3BH,AMOV R4,#00HMOV R5,#08HLOOP33: MOV A,3BHMOV DPTR,#TABEMOVC A,@A+DPTRMOV P2,R4MOV P0,AMOV P1,#0F7HINC 3BHINC R4LCALL DELAYDJNZ R5,LOOP33MOV A,34H ;显示要显档的数字 MOV B,#08H MUL ABMOV 3BH,AMOV R4,#00HMOV R5,#08HLOOP44: MOV A,3BHMOV DPTR,#TABEMOVC A,@A+DPTRMOV P2,R4MOV P0,AMOV P1,#0EFHINC 3BHINC R4LCALL DELAYDJNZ R5,LOOP44POP PSWPOP ACCRETDELAY: MOV 37H,#50DEL: MOV 38H,#4DJNZ 38H,$DJNZ 37H,DELRETTABE: ;0DB 00H,18H,24H,24H,24H,24H,18H,00H ;1DB 00H,10H,30H,10H,10H,10H,38H,00H ;2DB 00H,18H,24H,04H,18H,20H,3CH,00H ;3DB 00H,18H,24H,18H,04H,24H,18H,00H ;4DB 00H,08H,18H,28H,7CH,08H,08H,00H ;5DB 00H,1CH,10H,18H,04H,24H,18H,00H ;6DB 00H,18H,24H,38H,24H,24H,18H,00H ;7DB 00H,3CH,28H,08H,10H,10H,10H,00H ;8DB 00H,18H,24H,18H,24H,24H,18H,00H ;9DB 00H,18H,24H,24H,1CH,24H,18H,00H ;:DB 00H,00H,18H,18H,00H,18H,18H,00H ;DB 00H,00H,00H,00H,00H,00H,00H,00H RET PINT0: MOV 4AH,#20DJNZ 4AH,$JB P3.2, END_DDMOV 36H,#00HINC 34HMOV A,34HCJNE A,#0AH,END_DD ;分个位 MOV 34H,#00H INC 33HMOV A,33HCJNE A,#06H,END_DD ;分十位 MOV 33H,#00H END_DD: RETIPINT1: MOV 4AH,#20DJNZ 4AH,$JB P3.3,END_DINC 31HMOV A,30HCJNE A,#02H,END_1MOV A,31HCJNE A,#04H,END_1 ;时个位 MOV 31H,#00H MOV 30H,#00HEND_1: MOV A,31HCJNE A,#0AH,END_d ;时个位 MOV 31H,#00H INC 30HEND_D: RETIEND。
[DIY]二十四小时的感动(现代版) 自制LED点阵电子时钟十六楼已经上传全部电路图和PCB板图文件,以及全套C语言源代码,包括工程文件。
十八年前的我,每次路过学校门卫室的时候,总要驻留一刻,瞄一眼墙上那个会发着红光的电子钟,那时,我一直不知道它是怎么做到的...到现今,这个会发光的可以显示数字的,名叫LED数码管的东东,遍地皆是......算是圆自己的一个小小梦想吧,自己动手做一个点阵LED电子时钟。
先来一组靓照:最喜欢这个夜晚朦胧的感觉......并且亮度可以根据环境光线的强弱自动调节,就像我们的液晶电视,或者汽车仪表盘的背景灯光一样。
放在客厅,让每天每分每秒,都感动着......=============================================================================== ==制作这个点阵LED电子钟,一共使用了30个5x7方形点阵的LED点阵模块。
采用的是我比较熟悉的C8051F系列的MCU,51内核,但CPU速度能到50M。
时钟芯片当然采用的是较常用的DS1302,要想准,晶振是问题。
所以千方百计找精度高的32.768kHz晶体。
后来功夫不负有心人,弄到了几颗精度在±5ppm的西铁城原装晶体。
并且安装了一颗备份锂电池的安装座,掉电情况下时钟一样会接着走,不用重新对时。
LED店镇模块可以显示三行,每行10个字符。
按照我的规划,要可以同时显示日期、时间、星期内容。
注意,是方形点阵哦,比我们平时视觉疲劳的圆形点阵感觉要好看很多。
并且还集成了高精度温度传感器18B20,也是大家最常用的一款1WIRE操作方式的温度传感器,可以实时显示当前环境温度。
但是使用18B20要注意,最好把管脚接长一点,避免电路板附近元器件发热后通过管脚将传感器的温度拉高,那样就不准啦。
由于这个电路板板面尺寸很大,有很多利用的价值,所以我在上面还集成了SIEMENS 的GSM模块安装位置和接口,以后可以基于这个模块,显示SMS等等信息或者短信控制等。
单片机LED点阵显示方法与程序代码点阵的接法有共阴和共阳两种(共阳指的是对每一行LED来讲是共阳)。
由于51单片机驱动能力有限,亮度不够,所以一般需要三极管驱动,以下图为一个8X8点阵原理图,仅仅是仿真,如果需要接实物的话,加上三极管才足够亮。
显示的方法有两种:1、逐列扫描方式。
如以下图所示,P1口输出列码决定哪一列能亮(相当于位码),P2口输出行码(列数据)决定列上哪些LED亮(相当于段码),能亮的列从左向右扫描完8列(相当于位码循环移位8次)即显示出一帧完整的图像。
2、逐行扫描方式,与逐列扫描调换,即P2口输出位码,P1口输出段码,扫描完8行显示出一帧图像。
以逐行扫描为例,从上图可以很明了的知道点阵的显示原理了(红色表示高电平,绿色表示低电平),当把扫描速度加快,人的视觉停留,看见的就是一幅图或一个字了,如以下图所示。
一、行扫描静态显示,用51单片机实现上图静态显示的程序如下:#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar code TAB[]={0x81,0xFD,0xFD,0xC1,0xBF,0xBF,0xBD,0xC3};uchar i,t;delay(uchar t){while (t--){;}}void main(void){while(1){P2=0x01;for(i=0;i<8;i++){P1=TAB;delay(100);P2=P2<<1|P2>>7;}}}二、行扫描翻页显示字码取模方式为逐行第一次从字码数组中取出第1~8个数据置于列上,行扫描顺序为1~8行,显示一帧,第二次取第9~16个数据,行扫描顺序仍为1~8行,显示第二帧,第三次取第17~24个数据,…… 实现图显示效果的程序如下:/*8X8行扫描,翻页显示*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar code TAB[]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, //空屏0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xC1,0xFF, //L0xE3,0xDD,0xDD,0xDD,0xDD,0xDD,0xE3,0xFF, //O0xDD,0xDD,0xDD,0xDD,0xDD,0xEB,0xF7,0xFF, //V0xC1,0xFD,0xFD,0xC1,0xFD,0xFD,0xC1,0xFF, //E0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, //空屏};uchar i,t;delay(uchar t){while (t--){;}}void main(void){ uchar N,T;while(1){for(N=0;N<6;N++) //循环扫描一遍6帧for(T=0;T<100;T++) //速度{P2=0x01;for(i=0;i<8;i++){P1=TAB[i+8*N];delay(100);P2=P2<<1|P2>>7;}}}}三、行扫描上下移动显示。
51单片机8*8点阵LED显示原理及程序更多在8X8点阵LED上显示柱形,让其先从左到右平滑移动三次,其次从右到左平滑移动三次,再次从上到下平滑移动三次,最后从下到上平滑移动三次,如此循环下去。
1.程序设计内容8X8点阵LED工作原理说明:8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮;因此要实现一根柱形的亮法,如图49所示,对应的一列为一根竖柱,或者对应的一行为一根横柱,因此实现柱的亮的方法如下所述:一根竖柱:对应的列置1,而行则采用扫描的方法来实现。
一根横柱:对应的行置0,而列则采用扫描的方法来实现。
2.硬件电路3.汇编源程序ORG 00HSTART: NOPMOV R3,#3LOP2: MOV R4,#8MOV R2,#0LOP1: MOV P1,#0FFHMOV DPTR,#TABAMOV A,R2MOVC A,@A+DPTR MOV P3,AINC R2LCALL DELAY DJNZ R4,LOP1 DJNZ R3,LOP2MOV R3,#3LOP4: MOV R4,#8 MOV R2,#7LOP3: MOV P1,#0FFH MOV DPTR,#TABA MOV A,R2MOVC A,@A+DPTR MOV P3,ADEC R2LCALL DELAY DJNZ R4,LOP3 DJNZ R3,LOP4MOV R3,#3LOP6: MOV R4,#8 MOV R2,#0LOP5: MOV P3,#00H MOV DPTR,#TABB MOV A,R2MOVC A,@A+DPTR MOV P1,AINC R2LCALL DELAY DJNZ R4,LOP5 DJNZ R3,LOP6 MOV R3,#3LOP8: MOV R4,#8 MOV R2,#7LOP7: MOV P3,#00H MOV DPTR,#TABB MOV A,R2MOVC A,@A+DPTR MOV P1,ADEC R2LCALL DELAYDJNZ R4,LOP7DJNZ R3,LOP8LJMP STARTDELAY: MOV R5,#10D2: MOV R6,#20D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1DJNZ R5,D2RETTABA: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH TABB: DB 01H,02H,04H,08H,10H,20H,40H,80HEND4.C51语言源程序#include <AT89X52.H>unsigned CHAR code taba[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned CHAR code tabb[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};void DELAY(void){unsigned CHAR i,j;for(i=10;i>0;i--)for(j=248;j>0;j--);}void DELAY1(void){unsigned CHAR i,j,k;for(k=10;k>0;k--)for(i=20;i>0;i--)for(j=248;j>0;j--);}void main(void){unsigned CHAR i,j;while(1){for(j=0;j<3;j++)//FROM left to right 3 time {for(i=0;i<8;i++){P3=taba[i];P1=0xff;DELAY1();}}for(j=0;j<3;j++)//FROM right to left 3 time{for(i=0;i<8;i++){P3=taba[7-i];P1=0xff;DELAY1();}}for(j=0;j<3;j++)//FROM top to bottom 3 time {for(i=0;i<8;i++){P3=0x00;P1=tabb[7-i];DELAY1();}}for(j=0;j<3;j++)//FROM bottom to top 3 time {for(i=0;i<8;i++){P3=0x00;P1=tabb[i];DELAY1();}}}}。
附件:新8*16点阵万年历c程序/*===========================================*/ /*=======新8*16点阵万年历c程序================*/ /*=====STC12C5A60S2=======晶振11.0592=========*/ /*===作者:罗俊杰=====2010.6.16~2010.6.28==========*/ /*===========================================*/ #include <STC12C5A.H>#include "ds1302.h"#include "intrins.h"#define uint unsigned int#define uchar unsigned char#define JJ_LOGOSPEED 10 //设置开机LOGO部分的流动速度#define JJ_DELAY 12 //设置每一个点显示的时间长度(1~20)#define JJ_DIS_RAM 60 //设置时间显示缓冲区大小data uchar Ledplay [JJ_DIS_RAM]; //定义显示缓冲寄存器data uchar DIS_BIT = 0; //多种信息的切换显示data uchar cou = 0; // 软计数器,对10ms时基信号累加到1sdata uchar bn; //扫描映射全局变量idata uchar PWM; //显示亮度idata uchar PWM2; //显示暂存idata uchar JJ_B_SPEED; //流动速度idata uchar MENU; //菜单切换标志位idata uchar KEY_BIT = 0; //按键值idata uchar pp=1; //最终显示程序调用的普通变量sbit BEEP = P1^0; //扬声器sbit DS1302_CLK = P2^0; //实时时钟时钟线引脚sbit DS1302_IO = P2^1; //实时时钟数据线引脚sbit DS1302_RST = P2^2; //实时时钟复位线引脚sbit KEY1 = P1^1; //按键1(M键)sbit KEY2 = P3^1; //按键2(+键)sbit KEY3 = P3^5; //按键3(-键)sbit ACC0 = ACC^0;sbit ACC7 = ACC^7;char temp = 0x00;//******左点阵高位sbit LED1_H1 =P4 ^ 7;sbit LED1_H2 =P1 ^ 3;sbit LED1_H3 =P0 ^ 7;sbit LED1_H4 =P1 ^ 5;sbit LED1_H5 =P0 ^ 0;sbit LED1_H6 =P0 ^ 6;sbit LED1_H7 =P0 ^ 1;sbit LED1_H8 =P0 ^ 4;//******左点阵低位sbit LED1_L1 =P1 ^ 4;sbit LED1_L2 =P0 ^ 2;sbit LED1_L3 =P0 ^ 3;sbit LED1_L4 =P1 ^ 7;sbit LED1_L5 =P0 ^ 5;sbit LED1_L6 =P1 ^ 6;sbit LED1_L7 =P1 ^ 2;sbit LED1_L8 =P1 ^ 1;//******右点阵高位sbit LED2_H1 =P3 ^ 7;sbit LED2_H2 =P3 ^ 2;sbit LED2_H3 =P2 ^ 3;sbit LED2_H4 =P3 ^ 4;sbit LED2_H5 =P4 ^ 6;sbit LED2_H6 =P2 ^ 4;sbit LED2_H7 =P4 ^ 5;sbit LED2_H8 =P2 ^ 6;//*****右点阵低位sbit LED2_L1 =P3 ^ 3;sbit LED2_L2 =P4 ^ 4;sbit LED2_L3 =P2 ^ 7;sbit LED2_L4 =P3 ^ 6;sbit LED2_L5 =P2 ^ 5;sbit LED2_L6 =P3 ^ 5;sbit LED2_L7 =P3 ^ 1;sbit LED2_L8 =P3 ^ 0;//PxM1=0,PxM1=1,该I/O口为强推挽输出,输出电流达20mA//PxM1=0,PxM1=0,该I/O口为传统模式,灌电流20mA,拉电流230UA#define P0M1SET 0x00 //00000000#define P0M0SET 0xd3 //11010011#define P1M1SET 0x00 //00000000#define P1M0SET 0x28 //00101000#define P2M1SET 0x00 //00000000#define P2M0SET 0x58 //01011000#define P2M0SET2 0xA0 //10100000#define P3M1SET 0x00 //00000000#define P3M0SET 0x94 //10010100#define P4M1SET 0x00 //00000000#define P4M0SET 0xe0 //11100000/*************DS1302时钟部分子程序***************/uchar Second;uchar Minute;uchar Hour;uchar Week;uchar Day;uchar Month;uchar Year;#define AM(X) X#define PM(X) (X+12) // 转成24小时制#define DS1302_Second 0x80 //时钟芯片的寄存器位置,存放时间#define DS1302_Minute 0x82#define DS1302_Hour 0x84#define DS1302_Week 0x8A#define DS1302_Day 0x86#define DS1302_Month 0x88#define DS1302_Year 0x8Cvoid DS1302InputByte(uchar d) //实时时钟写入一字节(内部函数){uchar i;ACC = d;for(i=8; i>0; i--){DS1302_IO = ACC0; //相当于汇编中的RRCDS1302_CLK = 1;DS1302_CLK = 0;ACC = ACC >> 1;}}uchar DS1302OutputByte(void) //实时时钟读取一字节(内部函数){uchar i;for(i=8; i>0; i--){ACC = ACC >>1; //相当于汇编中的RRCACC7 = DS1302_IO;DS1302_CLK = 1;DS1302_CLK = 0;}return(ACC);}void Write1302(uchar ucAddr, uchar ucDa)//ucAddr: DS1302地址,ucData: 要写的数据{DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr); // 地址,命令DS1302InputByte(ucDa); // 写1Byte数据DS1302_CLK = 1;DS1302_RST = 0;}uchar Read1302(uchar ucAddr) //读取DS1302某地址的数据{uchar ucData;DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr|0x01); // 地址,命令ucData = DS1302OutputByte(); // 读1Byte数据DS1302_CLK = 1;DS1302_RST = 0;return(ucData);}void DS1302_SetProtect(bit flag) //是否写保护{if(flag)Write1302(0x8E,0x10);elseWrite1302(0x8E,0x00);}void DS1302_SetTime(uchar Address, uchar Value)// 设置时间函数{DS1302_SetProtect(0);Write1302(Address, ((Value/10)<<4 | (Value%10)));}void DS1302_GetTime() //获取时钟芯片的时钟数据到自定义的结构型数组{uchar ReadValue;ReadValue = Read1302(DS1302_Second);Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_Minute);Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_Hour);Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_Day);Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_Week);Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_Month);Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_Year);Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);}void Initial_DS1302(void) //初始化ds1302{uchar Second=Read1302(DS1302_Second);if(Second&0x80)DS1302_SetTime(DS1302_Second,0);DS1302_SetTime(DS1302_Minute,58);DS1302_SetTime(DS1302_Hour,12);DS1302_SetTime(DS1302_Week,6);DS1302_SetTime(DS1302_Day,25);DS1302_SetTime(DS1302_Month,6);DS1302_SetTime(DS1302_Year,11);}unsigned char code Vx[] ={0,0,0,0,0,0xD2,0x0A,0xC6,0x1F,0xC6,0x0A,0xD2, // -杰-0,0,0,0,0};/**********定义字符数据表单(二维数组)****** **********/unsigned char code no[][10]=//-{{0x7E,0xA1,0x99,0x85,0x7E,0},//0{0 ,0x82,0xFF,0x80,0 }, //1{0xC2,0xA1,0x91,0x8A,0x84,0},//2{0x42,0x81,0x89,0x89,0x76,0},//3{0x30,0x2C,0x22,0xFF,0x20,0},//4{0x4F,0x89,0x89,0x89,0x70,0},//5{0x7C,0x8A,0x89,0x89,0x70,0},//6{0x03,0xC1,0x31,0x0D,0x03,0},//7{0x76,0x89,0x89,0x89,0x76,0},//8{0x0E,0x91,0x91,0x91,0x7E,0},//9//-----------------------------------星期字符表{0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x10,0},//一10{0x40,0x44,0x44,0x44,0x44,0x44,0x44,0x40,0},//二{0x82,0x92,0x92,0x92,0x92,0x92,0x82,0x80,0},//三{0xFE,0xA2,0x9E,0x82,0x9E,0xA2,0xFE,0},//四{0x80,0x89,0xFF,0x89,0x89,0x89,0xF9,0x80,0},//五{0x88,0x68,0x38,0x0E,0x38,0x68,0x88,0},//六{0xFE,0x92,0x92,0x92,0x92,0xFE,0},//日10+6//-----------------------------------特殊字符表{0x6C,0x6C,0},//“:”17{0x18,0x18,0x18,0x18,0},//“-”18{0x01,0x0c,0x12,0x12,0},//“oC”19{0x24,0x3b,0x2a,0xfe,0x2a,0x22,0},//年20{0,0x80,0x7E,0x15,0x15,0x55,0xFF,0},//月21{0,0xFE,0x92,0x92,0x92,0xFE,0},//日22{0x80,0x7f,0x75,0x5f,0x75,0xFF,0},//周23{0x7c,0x54,0x7c,0x04,0x94,0xFF,0x04,0},//“时”24{0x08,0x94,0x52,0x30,0x93,0xF4,0x08,0},//分25};/*******************************************/unsigned char code wanan[] = // ASCII 睡眠亮度{0x00,0x18,0x91,0x3F,0x3F,0x06,0x1B,0x46,0xFB,0x7F,0x5B,0x16,0xDF,0x36,0xDB,0x7F,0xDB,0x36,0xDF,0x36,0x5B,0x16,0xFB,0x7F,0x1B,0x06,0x1F,0x06,0x09,0x26,0xC0,0x3F,0,0,0x40,0x20,0xD1,0x7F,0xFF,0x30,0xDB,0x30,0xDB,0x30,0xDF,0x3F,0xDB,0x2C,0xDB,0x0C,0xDF,0x7F,0xDB,0x0C,0xDB,0x0C,0xDF,0x18,0xDB,0x18,0xC0,0x1B,0xE0,0x70,0x60,0x20,0,0,0xC0,0x00,0x80,0x11,0xFE,0x3F,0x08,0x08,0xF8,0x1F,0x18,0x0C,0xF8,0x0F,0x0A,0x24,0xFE,0x7F,0x13,0x34,0xF1,0x1F,0x30,0x06,0x38,0x26,0x18,0x26,0x0C,0x7E,0x02,0x3C,0,0,0x00,0x01,0x04,0x23,0xFC,0x7F,0x4C,0x04,0xCC,0x2C,0xFC,0x7F,0xCC,0x0C,0xCC,0x0F,0x4C,0x14,0xEC,0x3F,0xCC,0x18,0x86,0x0D,0x06,0x07,0x82,0x1D,0xC1,0x78,0x30,0x20,0,0};unsigned char code zhengchang[] = // ASCII 正常亮度{0x00,0x10,0xFE,0x3F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x88,0x09,0x98,0x1F,0x98,0x01,0x98,0x01,0x98,0x01,0x98,0x01,0x98,0x01,0x98,0x21,0xFF,0x7F,0x00,0x00,0,0,0x88,0x09,0xB0,0x19,0xA4,0x25,0xFE,0x7F,0x17,0x30,0xF2,0x1F,0x30,0x0C,0x30,0x0C,0xF0,0x0F,0x88,0x11,0xF8,0x3F,0x98,0x19,附件第1 页0x98,0x19,0x98,0x1D,0x88,0x09,0x80,0x01,0,0,0xC0,0x00,0x80,0x11,0xFE,0x3F,0x08,0x08,0xF8,0x1F,0x18,0x0C,0xF8,0x0F,0x0A,0x24,0xFE,0x7F,0x13,0x34,0xF1,0x1F,0x30,0x06,0x38,0x26,0x18,0x26,0x0C,0x7E,0x02,0x3C,0,0,0x00,0x01,0x04,0x23,0xFC,0x7F,0x4C,0x04,0xCC,0x2C,0xFC,0x7F,0xCC,0x0C,0xCC,0x0F,0x4C,0x14,0xEC,0x3F,0xCC,0x18,0x86,0x0D,0x06,0x07,0x82,0x1D,0xC1,0x78,0x30,0x20,0,0};unsigned char code shezhishijian[] = // “设置时间”{0x04,0x11,0x0C,0x3F,0x18,0x1B,0x08,0x1B,//0x10,0xF9,0xBE,0x71,0xD8,0x20,0xB8,0x7F,0x18,0x31,0x18,0x32,0x18,0x1E,0x58,0x0C,0x38,0x1E,0x1C,0x33,0x88,0xE1,0x60,0x40,0,0,0xFC,0x7F,0xCC,0x66,0xCC,0x66,0xFC,0x7F,//0x80,0x01,0xFE,0xFF,0x90,0x11,0xF0,0x3F,0x30,0x18,0xF0,0x1F,0x30,0x18,0xF0,0x1F,0x30,0x18,0xF0,0x1F,0x30,0x58,0xFE,0xFF,0,0,0x00,0x10,0x42,0x30,0xFE,0x30,0x66,0x30,//0x66,0xFF,0x66,0x30,0x7E,0x31,0x66,0x33,0x66,0x36,0x66,0x36,0x66,0x32,0x7E,0x30,0x26,0x30,0x02,0x30,0x00,0x3C,0x00,0x10,0,0,0x0C,0x40,0xB8,0xFF,0x12,0x60,0x06,0x60,//0x26,0x64,0xE6,0x6F,0x66,0x66,0x66,0x66,0xE6,0x67,0x66,0x66,0x66,0x66,0xE6,0x67,0x26,0x62,0x06,0x60,0x06,0x78,0x02,0x20,0,0};unsigned char code liudongsudu[] = // “流动速度”{0x02,0x03,0x04,0x26,0xEC,0x7F,0x0C,0x03,0x81,0x19,0xC2,0x30,0xE6,0x7F,0xD6,0x2A,0xC8,0x1A,0xC8,0x1A,0xCD,0x1A,0xC6,0x1A,0xC6,0x5A,0x6E,0x5A,0x2C,0x7A,0x14,0x32,0,0,0x00,0x02,0x20,0x06,0x7E,0x06,0x00,0x26,0x80,0x7F,0x40,0x36,0xFF,0x36,0x18,0x36,0x0C,0x36,0x2C,0x36,0x66,0x33,0x7F,0x33,0xA6,0x31,0xC0,0x30,0x40,0x1C,0x20,0x08,0,0,0x00,0x03,0x02,0x13,0xF6,0x3F,0x2C,0x13,0xE4,0x3F,0x68,0x1B,0xFF,0x1F,0x2C,0x0B,0x8C,0x07,0xCC,0x0F,0x4C,0x1B,0x2C,0x33,0x1C,0x13,0x36,0x01,0xE3,0x7F,0xC2,0x3F,0,0,0x00,0x01,0x04,0x23,0xFC,0x7F,0x4C,0x04,0xCC,0x2C,0xFC,0x7F,0xCC,0x0C,0xCC,0x0F,0x4C,0x14,0xEC,0x3F,0xCC,0x18,0x86,0x0D,0x06,0x07,0x82,0x1D,0xC1,0x78,0x30,0x20,0,0};unsigned char code xianshiliangdu[] = // “显示亮度”{0x08,0x08,0xF8,0x1F,0x18,0x0C,0x18,0x0C,0xF8,0x0F,0x18,0x0C,0x18,0x0C,0xF8,0x0F,0x68,0x0B,0x62,0x13,0x64,0x33,0x6C,0x1B,0x6C,0x0F,0x64,0x07,0x60,0x23,0xFF,0x7F,0,0,0x00,0x08,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00,0x20,0xFE,0x7F,0x80,0x01,0x90,0x03,0xB0,0x05,0x98,0x0D,0x98,0x19,0x8C,0x39,0x8C,0x71,0x86,0x61,0xE1,0x21,0x80,0x00,0,0,0xC0,0x00,0x80,0x11,0xFE,0x3F,0x08,0x08,0xF8,0x1F,0x18,0x0C,0xF8,0x0F,0x0A,0x24,0xFE,0x7F,0x13,0x34,0xF1,0x1F,0x30,0x06,0x38,0x26,0x18,0x26,0x0C,0x7E,0x02,0x3C,0,0,0x00,0x01,0x04,0x23,0xFC,0x7F,0x4C,0x04,0xCC,0x2C,0xFC,0x7F,0xCC,0x0C,0xCC,0x0F,0x4C,0x14,0xEC,0x3F,0xCC,0x18,0x86,0x0D,0x06,0x07,0x82,0x1D,0xC1,0x78,0x30,0x20,0,0};unsigned char code wancheng[] = // “完成{0x80,0x01,0x08,0x43,0xFC,0xFF,0x0E,0x60,0x04,0x28,0xF0,0x1F,0x00,0x00,0x00,0x20,0xFC,0x7F,0x60,0x06,0x60,0x06,0x60,0x46,0x30,0x46,0x30,0xC6,0x18,0xFE,0x06,0x7C,0,0,0x00,0x05,0x00,0x3B,0x04,0x13,0xFC,0x7F,0x0C,0x03,0x0C,0x23,0x8C,0x66,0xFC,0x37,0xCC,0x36,0xCC,0x16,0xCC,0x1E,0xCC,0x0C,0x76,0x5C,0x26,0x5E,0x02,0x73,0x81,0x60,0,0};void delay (unsigned int a)// 用于点扫描的延时{unsigned int i;while( --a != 0){for(i = 0; i < JJ_DELAY; i++);}}/*****1ms延时程序(12MHz 10倍于51单片机速度时)******/void delay1ms (unsigned int a)//{unsigned int i;while( --a != 0){for(i = 0; i < 600; i++);}}/************蜂鸣器***************************/void P_BEEP (unsigned char p)//{BEEP = 1;delay1ms (p);//延时1.5秒BEEP = 0;}/****************************************************/void dis_off (void){P0 = ~P0M0SET; //将原来的强推挽设为普通I/O,所有显示关闭P1 = ~P1M0SET;P2 = P2M0SET2;P3 = ~P3M0SET;P4 = ~P4M0SET;if(KEY1 == 0 || KEY2 == 0 || KEY3 == 0) //如果有键按下则开始处理{delay1ms (20);if(KEY1 == 0){KEY_BIT = 1;P_BEEP(500);while(KEY1 == 0);//等待按键放开}if(KEY2 == 0){KEY_BIT = 2;P_BEEP(100);while(KEY2 == 0);//等待按键放开}if(KEY3 == 0){KEY_BIT = 3;P_BEEP(100);while(KEY3 == 0);//等待按键放开}}delay(10-PWM);}/*****************************************/void displayHH1 (unsigned char d)//第1列横向显示程序{unsigned char i;i = d & 0x01;if(i == 0x01){LED1_H1 = 1;LED1_L1 = 0;delay(PWM);dis_off();}i = d & 0x02;if(i == 0x02){LED1_H2 = 1;LED1_L1 = 0;delay(PWM);dis_off();}i = d & 0x04;if(i == 0x04){LED1_H3 = 1;LED1_L1 = 0;delay(PWM);dis_off();}i = d & 0x08;if(i == 0x08){LED1_H4 = 1;LED1_L1 = 0;delay(PWM);dis_off();}i = d & 0x10;if(i == 0x10){LED1_H5 = 1;LED1_L1 = 0;delay(PWM);dis_off();}i = d & 0x20;if(i == 0x20){LED1_H6 = 1;LED1_L1 = 0;delay(PWM);dis_off();}i = d & 0x40;if(i == 0x40){LED1_H7 = 1;LED1_L1 = 0;delay(PWM);dis_off();}i = d & 0x80;if(i == 0x80){LED1_H8 = 1;LED1_L1 = 0;delay(PWM);dis_off();}}/************************************************/void displayHH2 (unsigned char d) //第2列横向显示程序{unsigned char i;i = d & 0x01;if(i == 0x01){LED1_H1 = 1;LED1_L2 = 0;delay(PWM);dis_off();}i = d & 0x02;if(i == 0x02){LED1_H2 = 1;LED1_L2 = 0;delay(PWM);dis_off();}i = d & 0x04;if(i == 0x04){LED1_H3 = 1;LED1_L2 = 0;delay(PWM);dis_off();}i = d & 0x08;if(i == 0x08){LED1_H4 = 1;LED1_L2 = 0;delay(PWM);dis_off();}i = d & 0x10;if(i == 0x10){LED1_H5 = 1;LED1_L2 = 0;delay(PWM);dis_off();}i = d & 0x20;if(i == 0x20){LED1_H6 = 1;LED1_L2 = 0;delay(PWM);dis_off();}i = d & 0x40;if(i == 0x40){LED1_H7 = 1;LED1_L2 = 0;delay(PWM);dis_off();}i = d & 0x80;if(i == 0x80){LED1_H8 = 1;LED1_L2 = 0;delay(PWM);dis_off();}}/***************************************************/void displayHH3 (unsigned char d)//第3列横向显示程序{unsigned char i;i = d & 0x01;if(i == 0x01){LED1_H1 = 1;LED1_L3 = 0;delay(PWM);dis_off();}i = d & 0x02;if(i == 0x02){LED1_H2 = 1;LED1_L3 = 0;delay(PWM);dis_off();}i = d & 0x04;if(i == 0x04){LED1_H3 = 1;LED1_L3 = 0;delay(PWM);dis_off();}i = d & 0x08;if(i == 0x08){LED1_H4 = 1;LED1_L3 = 0;delay(PWM);dis_off();}i = d & 0x10;if(i == 0x10){LED1_H5 = 1;LED1_L3 = 0;delay(PWM);dis_off();}i = d & 0x20;if(i == 0x20){LED1_H6 = 1;LED1_L3 = 0;delay(PWM);dis_off();}i = d & 0x40;if(i == 0x40){LED1_H7 = 1;LED1_L3 = 0;delay(PWM);dis_off();}i = d & 0x80;if(i == 0x80){LED1_H8 = 1;LED1_L3 = 0;delay(PWM);dis_off();}}/***************************************************/void displayHH4 (unsigned char d)//第4列横向显示程序{unsigned char i;i = d & 0x01;if(i == 0x01){LED1_H1 = 1;LED1_L4 = 0;delay(PWM);dis_off();}i = d & 0x02;if(i == 0x02){LED1_H2 = 1;LED1_L4 = 0;delay(PWM);dis_off();}i = d & 0x04;附件第2 页if(i == 0x04){LED1_H3 = 1;LED1_L4 = 0;delay(PWM);dis_off();}i = d & 0x08;if(i == 0x08){LED1_H4 = 1;LED1_L4 = 0;delay(PWM);dis_off();}i = d & 0x10;if(i == 0x10){LED1_H5 = 1;LED1_L4 = 0;delay(PWM);dis_off();}i = d & 0x20;if(i == 0x20){LED1_H6 = 1;LED1_L4 = 0;delay(PWM);dis_off();}i = d & 0x40;if(i == 0x40){LED1_H7 = 1;LED1_L4 = 0;delay(PWM);dis_off();}i = d & 0x80;if(i == 0x80){LED1_H8 = 1;LED1_L4 = 0;delay(PWM);dis_off();} }/*************************************************/ void displayHH5 (unsigned char d)//第5列横向显示程序{unsigned char i;i = d & 0x01;if(i == 0x01){LED1_H1 = 1;LED1_L5 = 0;delay(PWM);dis_off();}i = d & 0x02;if(i == 0x02){LED1_H2 = 1;LED1_L5 = 0;delay(PWM);dis_off();}i = d & 0x04;if(i == 0x04){LED1_H3 = 1;LED1_L5 = 0;delay(PWM);dis_off();}i = d & 0x08;if(i == 0x08){LED1_H4 = 1;LED1_L5 = 0;delay(PWM);dis_off();}i = d & 0x10;if(i == 0x10){LED1_H5 = 1;LED1_L5 = 0;delay(PWM);dis_off();}i = d & 0x20;if(i == 0x20){LED1_H6 = 1;LED1_L5 = 0;delay(PWM);dis_off();}i = d & 0x40;if(i == 0x40){LED1_H7 = 1;LED1_L5 = 0;delay(PWM);dis_off();}i = d & 0x80;if(i == 0x80){LED1_H8 = 1;LED1_L5 = 0;delay(PWM);dis_off();} }/***************************************************/ void displayHH6 (unsigned char d) //第6列横向显示程序{unsigned char i;i = d & 0x01;if(i == 0x01){LED1_H1 = 1;LED1_L6 = 0;delay(PWM);dis_off();}i = d & 0x02;if(i == 0x02){LED1_H2 = 1;LED1_L6 = 0;delay(PWM);dis_off();}i = d & 0x04;if(i == 0x04){LED1_H3 = 1;LED1_L6 = 0;delay(PWM);dis_off();}i = d & 0x08;if(i == 0x08){LED1_H4 = 1;LED1_L6 = 0;delay(PWM);dis_off();}i = d & 0x10;if(i == 0x10){LED1_H5 = 1;LED1_L6 = 0;delay(PWM);dis_off();}i = d & 0x20;if(i == 0x20){LED1_H6 = 1;LED1_L6 = 0;delay(PWM);dis_off();}i = d & 0x40;if(i == 0x40){LED1_H7 = 1;LED1_L6 = 0;delay(PWM);dis_off();}i = d & 0x80;if(i == 0x80){LED1_H8 = 1;LED1_L6 = 0;delay(PWM);dis_off();}}/************************************************/void displayHH7 (unsigned char d)//第7列横向显示程序{unsigned char i;i = d & 0x01;if(i == 0x01){LED1_H1 = 1;LED1_L7 = 0;delay(PWM);dis_off();}i = d & 0x02;if(i == 0x02){LED1_H2 = 1;LED1_L7 = 0;delay(PWM);dis_off();}i = d & 0x04;if(i == 0x04){LED1_H3 = 1;LED1_L7 = 0;delay(PWM);dis_off();}i = d & 0x08;if(i == 0x08){LED1_H4 = 1;LED1_L7 = 0;delay(PWM);dis_off();}i = d & 0x10;if(i == 0x10){LED1_H5 = 1;LED1_L7 = 0;delay(PWM);dis_off();}i = d & 0x20;if(i == 0x20){LED1_H6 = 1;LED1_L7 = 0;delay(PWM);dis_off();}i = d & 0x40;if(i == 0x40){LED1_H7 = 1;LED1_L7 = 0;delay(PWM);dis_off();}i = d & 0x80;if(i == 0x80){LED1_H8 = 1;LED1_L7 = 0;delay(PWM);dis_off();}}/***************************************************/void displayHH8 (unsigned char d)//第8列横向显示程序{unsigned char i;i = d & 0x01;if(i == 0x01){LED1_H1 = 1;LED1_L8 = 0;delay(PWM);dis_off();}i = d & 0x02;if(i == 0x02){LED1_H2 = 1;LED1_L8 = 0;delay(PWM);dis_off();}i = d & 0x04;if(i == 0x04){LED1_H3 = 1;LED1_L8 = 0;delay(PWM);dis_off();}i = d & 0x08;if(i == 0x08){LED1_H4 = 1;LED1_L8 = 0;delay(PWM);dis_off();}i = d & 0x10;if(i == 0x10){LED1_H5 = 1;LED1_L8 = 0;delay(PWM);dis_off();}i = d & 0x20;if(i == 0x20){LED1_H6 = 1;LED1_L8 = 0;delay(PWM);dis_off();}i = d & 0x40;if(i == 0x40){LED1_H7 = 1;LED1_L8 = 0;delay(PWM);dis_off();}i = d & 0x80;if(i == 0x80){LED1_H8 = 1;LED1_L8 = 0;delay(PWM);dis_off();}}/****************************************************/void displayHH9 (unsigned char d)//第9列横向显示程序{unsigned char i;i = d & 0x01;if(i == 0x01){LED2_H1 = 1;LED2_L1 = 0;delay(PWM);dis_off();}i = d & 0x02;if(i == 0x02){LED2_H2 = 1;LED2_L1 = 0;delay(PWM);dis_off();}i = d & 0x04;if(i == 0x04){LED2_H3 = 1;LED2_L1 = 0;delay(PWM);dis_off();}i = d & 0x08;if(i == 0x08){LED2_H4 = 1;LED2_L1 = 0;delay(PWM);dis_off();}i = d & 0x10;if(i == 0x10){LED2_H5 = 1;LED2_L1 = 0;delay(PWM);dis_off();}i = d & 0x20;if(i == 0x20){LED2_H6 = 1;LED2_L1 = 0;delay(PWM);dis_off();}i = d & 0x40;if(i == 0x40){LED2_H7 = 1;LED2_L1 = 0;delay(PWM);dis_off();}i = d & 0x80;if(i == 0x80){LED2_H8 = 1;LED2_L1 = 0;delay(PWM);dis_off();}}/****************************************************/void displayHH10 (unsigned char d)//第10列横向显示程序{unsigned char i;i = d & 0x01;if(i == 0x01){LED2_H1 = 1;LED2_L2 = 0;delay(PWM);dis_off();}i = d & 0x02;if(i == 0x02){LED2_H2 = 1;LED2_L2 = 0;delay(PWM);dis_off();}i = d & 0x04;if(i == 0x04){LED2_H3 = 1;LED2_L2 = 0;delay(PWM);dis_off();}i = d & 0x08;if(i == 0x08){LED2_H4 = 1;LED2_L2 = 0;delay(PWM);dis_off();}i = d & 0x10;if(i == 0x10){LED2_H5 = 1;LED2_L2 = 0;delay(PWM);dis_off();}i = d & 0x20;if(i == 0x20){LED2_H6 = 1;LED2_L2 = 0;delay(PWM);dis_off();}i = d & 0x40;if(i == 0x40){LED2_H7 = 1;LED2_L2 = 0;delay(PWM);dis_off();}i = d & 0x80;if(i == 0x80){LED2_H8 = 1;LED2_L2 = 0;delay(PWM);dis_off();}}/**********************************************/void displayHH11 (unsigned char d)//第11列横向显示程序{unsigned char i;i = d & 0x01;if(i == 0x01){LED2_H1 = 1;LED2_L3 = 0;delay(PWM);dis_off();}i = d & 0x02;if(i == 0x02){LED2_H2 = 1;LED2_L3 = 0;delay(PWM);dis_off();}i = d & 0x04;if(i == 0x04){LED2_H3 = 1;LED2_L3 = 0;delay(PWM);dis_off();}i = d & 0x08;if(i == 0x08){LED2_H4 = 1;LED2_L3 = 0;delay(PWM);dis_off();}i = d & 0x10;if(i == 0x10){LED2_H5 = 1;LED2_L3 = 0;delay(PWM);dis_off();}i = d & 0x20;if(i == 0x20){LED2_H6 = 1;LED2_L3 = 0;delay(PWM);dis_off();}i = d & 0x40;if(i == 0x40){LED2_H7 = 1;LED2_L3 = 0;delay(PWM);dis_off();}i = d & 0x80;if(i == 0x80){LED2_H8 = 1;LED2_L3 = 0;delay(PWM);dis_off();}}/****************************************************/void displayHH12 (unsigned char d)//第12列横向显示程序{unsigned char i;i = d & 0x01;if(i == 0x01){LED2_H1 = 1;LED2_L4 = 0;delay(PWM);dis_off();}i = d & 0x02;if(i == 0x02){LED2_H2 = 1;LED2_L4 = 0;delay(PWM);dis_off();}i = d & 0x04;if(i == 0x04){LED2_H3 = 1;LED2_L4 = 0;delay(PWM);dis_off();}i = d & 0x08;if(i == 0x08){LED2_H4 = 1;LED2_L4 = 0;delay(PWM);dis_off();}i = d & 0x10;if(i == 0x10){LED2_H5 = 1;LED2_L4 = 0;delay(PWM);dis_off();}i = d & 0x20;if(i == 0x20){LED2_H6 = 1;LED2_L4 = 0;delay(PWM);dis_off();}i = d & 0x40;if(i == 0x40){LED2_H7 = 1;LED2_L4 = 0;delay(PWM);dis_off();}i = d & 0x80;if(i == 0x80){LED2_H8 = 1;LED2_L4 = 0;delay(PWM);dis_off();}}/****************************************************/void displayHH13 (unsigned char d) //第13列横向显示程序{unsigned char i;i = d & 0x01;if(i == 0x01){LED2_H1 = 1;LED2_L5 = 0;delay(PWM);dis_off();}i = d & 0x02;if(i == 0x02){LED2_H2 = 1;LED2_L5 = 0;delay(PWM);dis_off();}i = d & 0x04;if(i == 0x04){LED2_H3 = 1;LED2_L5 = 0;delay(PWM);dis_off();}i = d & 0x08;if(i == 0x08){LED2_H4 = 1;LED2_L5 = 0;delay(PWM);dis_off();}i = d & 0x10;if(i == 0x10){LED2_H5 = 1;LED2_L5 = 0;delay(PWM);dis_off();}i = d & 0x20;if(i == 0x20){LED2_H6 = 1;LED2_L5 = 0;delay(PWM);dis_off();}i = d & 0x40;if(i == 0x40){LED2_H7 = 1;LED2_L5 = 0;delay(PWM);dis_off();}i = d & 0x80;if(i == 0x80){LED2_H8 = 1;LED2_L5 = 0;delay(PWM);dis_off();}}/**************************************************/附件第3 页void displayHH14 (unsigned char d)//第14列横向显示程序{unsigned char i;i = d & 0x01;if(i == 0x01){LED2_H1 = 1;LED2_L6 = 0;delay(PWM);dis_off();}i = d & 0x02;if(i == 0x02){LED2_H2 = 1;LED2_L6 = 0;delay(PWM);dis_off();}i = d & 0x04;if(i == 0x04){LED2_H3 = 1;LED2_L6 = 0;delay(PWM);dis_off();}i = d & 0x08;if(i == 0x08){LED2_H4 = 1;LED2_L6 = 0;delay(PWM);dis_off();}i = d & 0x10;if(i == 0x10){LED2_H5 = 1;LED2_L6 = 0;delay(PWM);dis_off();}i = d & 0x20;if(i == 0x20){LED2_H6 = 1;LED2_L6 = 0;delay(PWM);dis_off();}i = d & 0x40;if(i == 0x40){LED2_H7 = 1;LED2_L6 = 0;delay(PWM);dis_off();}i = d & 0x80;if(i == 0x80){LED2_H8 = 1;LED2_L6 = 0;delay(PWM);dis_off();} }/************************************************/ void displayHH15 (unsigned char d)//第15列横向显示程序{unsigned char i;i = d & 0x01;if(i == 0x01){LED2_H1 = 1;LED2_L7 = 0;delay(PWM);dis_off();}i = d & 0x02;if(i == 0x02){LED2_H2 = 1;LED2_L7 = 0;delay(PWM);dis_off();}i = d & 0x04;if(i == 0x04){LED2_H3 = 1;LED2_L7 = 0;delay(PWM);dis_off();}i = d & 0x08;if(i == 0x08){LED2_H4 = 1;LED2_L7 = 0;delay(PWM);dis_off();}i = d & 0x10;if(i == 0x10){LED2_H5 = 1;LED2_L7 = 0;delay(PWM);dis_off();}i = d & 0x20;if(i == 0x20){LED2_H6 = 1;LED2_L7 = 0;delay(PWM);dis_off();}i = d & 0x40;if(i == 0x40){LED2_H7 = 1;LED2_L7 = 0;delay(PWM);dis_off();}i = d & 0x80;if(i == 0x80){LED2_H8 = 1;LED2_L7 = 0;delay(PWM);dis_off();} }/**************************************************/ void displayHH16 (unsigned char d)//第16列横向显示程序{unsigned char i;i = d & 0x01;if(i == 0x01){LED2_H1 = 1;LED2_L8 = 0;delay(PWM);dis_off();}i = d & 0x02;if(i == 0x02){LED2_H2 = 1;LED2_L8 = 0;delay(PWM);dis_off();}i = d & 0x04;if(i == 0x04){LED2_H3 = 1;LED2_L8 = 0;delay(PWM);dis_off();}i = d & 0x08;if(i == 0x08){LED2_H4 = 1;LED2_L8 = 0;delay(PWM);dis_off();}i = d & 0x10;if(i == 0x10){LED2_H5 = 1;LED2_L8 = 0;delay(PWM);dis_off();}i = d & 0x20;if(i == 0x20){LED2_H6 = 1;LED2_L8 = 0;delay(PWM);dis_off();}i = d & 0x40;if(i == 0x40){LED2_H7 = 1;LED2_L8 = 0;delay(PWM);dis_off();}i = d & 0x80;if(i == 0x80){LED2_H8 = 1;LED2_L8 = 0;delay(PWM);dis_off();}}/***************************************************/void diplay_data (unsigned char l,d)//显示的列位置{switch (l){case 1://displayHH1(d); //将显示数据送入break;//case 2://displayHH2(d); //将显示数据送入break;//case 3://displayHH3(d); //将显示数据送入break;//case 4://displayHH4(d); //将显示数据送入break;//case 5://displayHH5(d); //将显示数据送入break;//case 6://displayHH6(d); //将显示数据送入break;//case 7://displayHH7(d); //将显示数据送入break;//case 8://displayHH8(d); //将显示数据送入break;//case 9://displayHH9(d); //将显示数据送入break;//case 10://displayHH10(d); //将显示数据送入break;//case 11://displayHH11(d); //将显示数据送入break;//case 12://displayHH12(d); //将显示数据送入break;//case 13://displayHH13(d); //将显示数据送入break;//case 14://displayHH14(d); //将显示数据送入break;//case 15://displayHH15(d); //将显示数据送入break;//case 16://displayHH16(d); //将显示数据送入break;//}}/*************************************************/void displayLL1 (unsigned char d,unsigned char c)//第1列横向显示程序{unsigned char i;i = d & 0x01;if(i == 0x01){ // 第一屏的8列LED1_H1 = 1;LED1_L1 = 0;delay(PWM);dis_off();}i = d & 0x02;if(i == 0x02){LED1_H1 = 1;LED1_L2 = 0;delay(PWM);dis_off();}i = d & 0x04;if(i == 0x04){LED1_H1 = 1;LED1_L3 = 0;delay(PWM);dis_off();}i = d & 0x08;if(i == 0x08){LED1_H1 = 1;LED1_L4 = 0;delay(PWM);dis_off();}i = d & 0x10;if(i == 0x10){LED1_H1 = 1;LED1_L5 = 0;delay(PWM);dis_off();}i = d & 0x20;if(i == 0x20){LED1_H1 = 1;LED1_L6 = 0;delay(PWM);dis_off();}i = d & 0x40;if(i == 0x40){LED1_H1 = 1;LED1_L7 = 0;delay(PWM);dis_off();}i = d & 0x80;if(i == 0x80){LED1_H1 = 1;LED1_L8 = 0;delay(PWM);dis_off();}i = c & 0x01;if(i == 0x01){ // 第二屏的8列LED2_H1 = 1;LED2_L1 = 0;delay(PWM);dis_off();}i = c & 0x02;if(i == 0x02){LED2_H1 = 1;LED2_L2 = 0;delay(PWM);dis_off();}i = c & 0x04;if(i == 0x04){LED2_H1 = 1;LED2_L3 = 0;delay(PWM);dis_off();}i = c & 0x08;if(i == 0x08){LED2_H1 = 1;LED2_L4 = 0;delay(PWM);dis_off();}i = c & 0x10;if(i == 0x10){LED2_H1 = 1;LED2_L5 = 0;delay(PWM);dis_off();}i = c & 0x20;if(i == 0x20){LED2_H1 = 1;LED2_L6 = 0;delay(PWM);dis_off();}i = c & 0x40;if(i == 0x40){LED2_H1 = 1;LED2_L7 = 0;delay(PWM);dis_off();}i = c & 0x80;if(i == 0x80){LED2_H1 = 1;LED2_L8 = 0;delay(PWM);dis_off();}}/****************************************************/void displayLL2 (unsigned char d,unsigned char c)//第2列横向显示程序{unsigned char i;i = d & 0x01;if(i == 0x01){ // 第一屏的8列LED1_H2 = 2;LED1_L1 = 0;delay(PWM);dis_off();}i = d & 0x02;if(i == 0x02){LED1_H2 = 2;LED1_L2 = 0;delay(PWM);dis_off();}i = d & 0x04;if(i == 0x04){LED1_H2 = 2;LED1_L3 = 0;delay(PWM);dis_off();}i = d & 0x08;if(i == 0x08){LED1_H2 = 2;LED1_L4 = 0;delay(PWM);dis_off();}i = d & 0x10;if(i == 0x10){LED1_H2 = 2;LED1_L5 = 0;delay(PWM);dis_off();}i = d & 0x20;if(i == 0x20){LED1_H2 = 2;LED1_L6 = 0;delay(PWM);dis_off();}i = d & 0x40;if(i == 0x40){LED1_H2 = 2;LED1_L7 = 0;delay(PWM);dis_off();}i = d & 0x80;if(i == 0x80){LED1_H2 = 2;LED1_L8 = 0;delay(PWM);dis_off();}i = c & 0x01;if(i == 0x01){ // 第二屏的8列LED2_H2 = 2;LED2_L1 = 0;delay(PWM);dis_off();}i = c & 0x02;if(i == 0x02){LED2_H2 = 2;LED2_L2 = 0;delay(PWM);dis_off();}i = c & 0x04;if(i == 0x04){LED2_H2 = 2;LED2_L3 = 0;delay(PWM);dis_off();}i = c & 0x08;if(i == 0x08){LED2_H2 = 2;LED2_L4 = 0;delay(PWM);dis_off();}i = c & 0x10;if(i == 0x10){LED2_H2 = 2;LED2_L5 = 0;delay(PWM);dis_off();}i = c & 0x20;if(i == 0x20){LED2_H2 = 2;LED2_L6 = 0;delay(PWM);dis_off();}i = c & 0x40;if(i == 0x40){LED2_H2 = 2;LED2_L7 = 0;delay(PWM);dis_off();}i = c & 0x80;if(i == 0x80){LED2_H2 = 2;LED2_L8 = 0;delay(PWM);dis_off();}}/**************************************************/void displayLL3 (unsigned char d,unsigned char c)//第3列横向显示程序{unsigned char i;i = d & 0x01;if(i == 0x01){ // 第一屏的8列LED1_H3 = 1;LED1_L1 = 0;delay(PWM);dis_off();}i = d & 0x02;if(i == 0x02){LED1_H3 = 1;LED1_L2 = 0;delay(PWM);dis_off();}i = d & 0x04;if(i == 0x04){LED1_H3 = 1;LED1_L3 = 0;delay(PWM);dis_off();}i = d & 0x08;附件第4 页。