16x64 nokta vuruşlu program
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
- /***********************************************************
- 名称: 16*64点阵
- MCU: 89C52
- 晶振: 12M
- 时间: 2008年12月06日
- 外部器件: 16*64点阵,ds1302
- 接线: 见ds1302.h和本主文件
- 版本: V1.0
- ------------------更新记录---------------------------------
- 20081206 开始记录编辑过程,养成良好习惯.添加了1302.h的头文件.实现了实时时钟的显示.
- 因还未添加按键部分,故只能在proteus仿真.
- ***********************************************************/
- #include <REGX52.H>
- //#include <intins.h>
- #include "DS1302.h"
- #include "ascii.h"
- #define SPEED 5 //移动速度,数字越大越慢
- sbit H_CLK = P1^3;
- sbit H_D = P1^2;
- sbit L_CLK = P3^1;
- sbit L_D = P3^0;
- sbit L_STB = P1^0;
- sbit L_OE = P1^1;
- SYSTEMTIME CurrentTime;
- unsigned char date[]=
- {
- ' ',' ',' ',' ',' ',' ',' ',' ', //开头8个空格
- '2','0', //21世纪
- '0','8', //年数据 No.10,11
- 'Y','Y', //“年”
- '1','2', //月数据 No.14,15
- 'M','M', //“月”
- '0','6', //日数据 No.18,19
- 'D','D', //“日”
-
- 0, //空格
-
- 'W','E','E','K', //“星期”
- '?','?', //星期几 No.27,28
-
- 0, //空格
-
- '1','9', //小时数据 No.30,31
- ':', //':' No.32
- '4','1', //分钟数据 No.33,34
- ':', //':' No.35
- '0','0', //秒数据 No.36,37
-
- ' ',' ',' ',' ',' ',' ',' ',' ',
- ' ',' ',' ',' ',' ', //数组最大用到No.52
- ' ',' ',' ',' ',' ',' ',' ',' ', //末尾8个空格
- };
- void time_to_buff(void);
- void delay_nms(unsigned int count);
- void set_row(unsigned char row);
- void sendRbyte(unsigned char wdata); //模拟spi的方式往列4094传送字模数据
- void sendR2byte(unsigned char wdata,unsigned char n); //模拟spi的方式往列4094传送字模数据
- void time_to_buff(void);
- void main(void)
- {
- unsigned char i,offset=0,disrow=0,j,k=0;
- Initial_DS1302();
- L_OE=0; //列不输出
- for(i=0;i<16;i++) //行驱动的4094填16个1,使行不输出,去掉大概也没问题.反正就一会
- {
- H_CLK=0;
- H_D=1;
- H_CLK=0;
- }
- while(1)
- {
- for(j=0;j<SPEED;j++,offset++)
- {
- for(disrow=0;disrow<16;disrow++) //disrow,当前扫描的行
- {
- set_row(disrow); //行4094的输出.依次点亮1~16行.
- L_STB=0; //STB low
-
- for(i=0;i<8;i++) //送往8个4094的数据.
- sendRbyte(~a[date[k+i]-32][disrow]); //acsii-32 就是实际的字模位置
- sendR2byte(~a[date[k+8]-32][disrow],offset);
- if(offset==8)
- {
- offset=0;k++;
- if(k>45) k=0;
- }
-
- L_STB=1; //STB high
- L_OE=1; //列4094输出
- delay_nms(2); //此处延时,请根据点阵闪烁状况加以调整,仿真时候无法仿真闪烁.
- L_OE=0;
- }
- }
- time_to_buff();
- }
- }
- void delay_nms(unsigned int count)
- {
- unsigned int i,j;
- for(i=0;i<count;i++)
- for(j=0;j<120;j++);
- }
- void set_row(unsigned char row)
- {
- H_CLK=0; //行4094的输出.依次点亮1~16行.
- if(row==0) H_D=0;
- else H_D=1;
- H_CLK=1;
- }
- void sendRbyte(unsigned char wdata) //模拟spi的方式往列4094传送字模数据
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- L_CLK=0; //时钟拉低
- L_D=wdata&0x80;
- L_CLK=1; //时钟拉高,产生上升沿
- wdata <<= 1; //左移一位
- }
- }
- void sendR2byte(unsigned char wdata,unsigned char n) //模拟spi的方式往列4094传送字模数据
- {
- unsigned char i;
- for(i=0;i<n;i++)
- {
- L_CLK=0; //时钟拉低
- L_D=wdata&0x80;
- L_CLK=1; //时钟拉高,产生上升沿
- wdata <<= 1; //左移一位
- }
- }
- /*
- void send_0_pulse(unsigned char n) //送n个脉冲,
- {
- unsigned char i;
- L_D=1; //其实应该是0,仿真时用1
- for(i=0;i<n;i++)
- {
- L_CLK=0; //时钟拉低
- L_CLK=1; //时钟拉高,产生上升沿
- }
- }
- */
- void time_to_buff(void)
- {
- DS1302_GetTime(&CurrentTime);
- DateToStr(&CurrentTime);
- TimeToStr(&CurrentTime);
- date[10]=CurrentTime.DateString[0];
- date[11]=CurrentTime.DateString[1];
- date[14]=CurrentTime.DateString[3];
- date[15]=CurrentTime.DateString[4];
- date[18]=CurrentTime.DateString[6];
- date[19]=CurrentTime.DateString[7];
- date[30]=CurrentTime.TimeString[0];
- date[31]=CurrentTime.TimeString[1];
- date[33]=CurrentTime.TimeString[3];
- date[34]=CurrentTime.TimeString[4];
- date[36]=CurrentTime.TimeString[6];
- date[37]=CurrentTime.TimeString[7];
- }
复制代码
单片机源程序如下:
所有资料51hei提供下载:
16X64点阵左右移动模式.7z
(1.41 MB, 下载次数: 180)
程序+fz.7z
(37.19 KB, 下载次数: 106)
|