- #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
- #include<intrins.h>
- #define DataPort P0
- //unsigned char segout[8]={0,1,2,3,4,5,6,7}; //8列
- unsigned char segout[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //8列
- unsigned char tab[]={0x0c,0x12,0x22,0x44,0x22,0x12,0x0c,0x00
- //0x00,0x6C,0x92,0x82,0x44,0x28,0x10,0x00
- };
- unsigned char dofly_DuanMa[]={0x30,0x30,0x3f,0x3e,0x79,0x6e,0x3f,0x3e};//0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 共阴显示段码值0~9
- unsigned char dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
- void Display(unsigned char FirstBit,unsigned char Num);
- unsigned char TempData[8];
- /*------------------------------------------------
- 硬件端口定义
- ------------------------------------------------*/
- sbit LATCH1=P2^6;
- sbit LATCH2=P2^7;
- sbit LATCH = P1^0;
- sbit SRCLK= P1^1;
- sbit SER = P1^2;
- sbit LATCH_B = P2^2;
- sbit SRCLK_B= P2^1;
- sbit SER_B= P2^0;
- /*------------------------------------------------
- uS延时函数,含有输入参数 unsigned char t,无返回值
- unsigned char 是定义无符号字符变量,其值的范围是
- 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
- 长度如下 T=tx2+5 uS
- ------------------------------------------------*/
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- /*------------------------------------------------
- mS延时函数,含有输入参数 unsigned char t,无返回值
- unsigned char 是定义无符号字符变量,其值的范围是
- 0~255 这里使用晶振12M,精确延时请使用汇编
- ------------------------------------------------*/
- void DelayMs(unsigned char t)
- {
- while(t--)
- {
- //大致延时1mS
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
- /*------------------------------------------------
- 发送字节程序
- ------------------------------------------------*/
- void SendByte(unsigned char dat)
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- SRCLK=0;
- SER=dat&0x80;
- dat<<=1;
- SRCLK=1;
- }
- }
- /*------------------------------------------------
- 发送双字节程序
- 595级联,n个595,就需要发送n字节后锁存
- ------------------------------------------------*/
- void Send2Byte(unsigned char dat1,unsigned char dat2)
- {
- SendByte(dat1);
- SendByte(dat2);
- }
- /*------------------------------------------------
- 595锁存程序
- 595级联发送数据后,锁存有效
- ------------------------------------------------*/
- void Out595(void)
- {
- _nop_();
- LATCH=1;
- LATCH=0;
- }
- /*------------------------------------------------
- 发送位码字节程序
- 使用另外一片单独595
- ------------------------------------------------*/
- void SendSeg(unsigned char dat)
- {
- unsigned char i;
- for(i=0;i<8;i++) //发送字节
- {
- SRCLK_B=0;
- SER_B=dat&0x80;
- dat<<=1;
- SRCLK_B=1;
- }
- LATCH_B=1; //锁存
- _nop_();
- LATCH_B=0;
- }
- void Display(unsigned char FirstBit,unsigned char Num)
- {
- static unsigned char i;
- /*for(i=0;i<Num;i++)
- {*/
- DataPort= 0x00;
- LATCH1=1;
- LATCH1=0;
- DataPort=dofly_WeiMa[i+FirstBit];
- LATCH2=1;
- LATCH2=0;
- DataPort = dofly_DuanMa[i];//TempData[i];
- LATCH1=1;
- LATCH1=0;
- /*DelayUs2x(200);
- }*/
- i++;
- if(i == Num)
- i = 0;
- }
- /*------------------------------------------------
- 主程序
- ------------------------------------------------*/
- void time0_isr(void) interrupt 1
- {
- ET0 = 0;
- TH0 = 0XFC;
- TL0 = 0X18;
- Display(0,8);
- ET0 = 1;
- }
- void main()
- {
- unsigned char i,j;
- TMOD = 0X01;
- TH0 = 0XFC;
- TL0 = 0X18;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- while(1)
- {
- for(j=0;j<60;j++)
- for(i=0;i<8;i++) //8列显示
- {
- SendSeg(segout[i]);
- Send2Byte(~tab[i],0xff);
- Out595();
- DelayMs(1);
- Send2Byte(0xff,0xff);//delay(10); //防止重影
- Out595();
- }
- //另外一种颜色
- for(j=0;j<60;j++)
- for(i=0;i<8;i++) //8列显示
- {
- SendSeg(segout[7-i]); //反向显示同样图形
- Send2Byte(0xff,~tab[i]);
- Out595();
- DelayMs(1);
- Send2Byte(0xff,0xff);//delay(10); //防止重影
- Out595();
- }
- }
- }
双色点阵心形
最新推荐文章于 2019-04-02 21:21:44 发布