⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ledm8.c

📁 arm学习开发和实验,单片机器的运用开发.完成各自功能
💻 C
字号:

#include <avr/io.h>
#include <util/delay.h>

#include "hz_pixel.h"         //字库
#define uchar unsigned char
#define uint  unsigned int

//#define SPEED 2             //定义速度
#define light 20                   //定义亮度

#define SER_PORT	PORTD
#define SER_DAT1  PD0
#define SER_SCK1  PD1
#define SER_DAT	PD4
#define SER_RCK	PD5
#define SER_SCK	PD6
#define SER_VOE	PD7
#define KEY0	PD2
#define KEY1	PD3
uchar  temp0;
uchar  temp1;
uchar speed;

uchar col,disrow;   
uint hang;                 //col为位移变量,disrow为行变量
uint word;

uchar BUFF[14];


	
/***********函数声明*****************/
//void PortInit(void);//端口初始化 
void send(uint h); //发送行选择信号子函数
void loadoneline(void);
void sendoneline(void);
//void delay(uchar t);
void temp0totemp1(uchar dat1);//实现C51的位操作
void ser_out(uchar dat);
uchar two_onebyte(uchar h1,uchar h2);
void irol(uint x);            //实现C51的irol循环位移
void getkey(void);
/********************************************/

int main(void)
{

uchar i;col=0;word=0;

//PortInit();
DDRD = 0b11110011;
PORTD = 0b11110011;
SER_PORT&=~_BV(SER_RCK);
SER_PORT&=~_BV(SER_VOE);
 hang=0xfffe;        //行选信号初始化
 speed=2;
 while(1)
   { 
     while(col<16)
      {for(i=0;i<speed;i++)
			{for(disrow=0;disrow<16;disrow++)
            
					{	 loadoneline();

						 
						 sendoneline();
					
													
 						SER_PORT|=_BV(SER_RCK);	// RCK = 1; 锁存已发送的整一行的数据
						
 						SER_PORT&=~_BV(SER_RCK);//RCK = 0;
 			
						SER_PORT&=~_BV(SER_VOE);//关闭显示
						
			 			send(hang);//发送行选择数据
			 			
						getkey();//取键值,调节速度
						
						
						SER_PORT|=_BV(SER_VOE); //  OE  = 1; 开显示,显示选中的这行
						
			 			_delay_us(light);
						
						irol(hang);							//显示下一行
						
					}	
				
			
			}
       col++; 
      }
    col=0;word=word+32;
    if(word>=608)word=0;//总字数x32
   }
}
/*******************************************************/
void ser_out(uchar dat)
{
	uchar i;

	for(i=0;i<8;i++)
	{
		if(dat&0x80)
			SER_PORT|=_BV(SER_DAT);
		else
			SER_PORT&=~_BV(SER_DAT);
		
		SER_PORT|=_BV(SER_SCK);
		
		SER_PORT&=~_BV(SER_SCK);
		dat<<=1;
	}
	
}
/*******************************************************/
void send(uint h)
{
	uchar i;

	for(i=0;i<16;i++)
	{
		if(h&0x8000)
			SER_PORT|=_BV(SER_DAT1);
		else
			SER_PORT&=~_BV(SER_DAT1);
		
		SER_PORT|=_BV(SER_SCK1);
		_delay_us(1);
		SER_PORT&=~_BV(SER_SCK1);
		h<<=1;
	}
	
}

uchar two_onebyte(uchar h1,uchar h2)
{
	uchar temp,tempcol;
 if(col<8) tempcol=col;
 else tempcol=col-8;
 temp=(h1>>tempcol)|(h2<<(8-tempcol));
 
 return temp;
}
/*******************************************************/

/****************把字模移入数组的子函数********************/
void loadoneline(void)
{uchar s;
 for(s=0;s<7;s++)                          //s为要显示的数字+1
   {BUFF[2*s]=pgm_read_byte(&hz[word+32*s+2*disrow]);
    BUFF[2*s+1]=pgm_read_byte(&hz[word+1+32*s+2*disrow]);
   }
}
/*******************发送一行的子函数************************/
void sendoneline(void)
{uchar s;uchar inc;
 
 if(col<8)inc=0;else inc=1;
 for(s=0+inc;s<=11+inc;s++)                 //s=2*要显示的数字-1
   {temp0=two_onebyte(BUFF[s],BUFF[s+1]);
      temp0totemp1(temp0);
	  
      ser_out(temp1);
	  
   }
}
/**********************************
void delay(uchar t)
{ uchar i,j;
  for(j=0;j<t;j++)
   {for(i=0;i<20;i++);}
}
*********************/
void temp0totemp1(uchar dat1)
{uchar k;
 
  for(k=0;k<8;k++) 
  {
  switch (k)
  {
    case (0):
      if (dat1&0x80) temp1|=0x08; else temp1&=0xf7;
      break;
	case (1):
      if (dat1&0x80) temp1|=0x10; else temp1&=0xef;
      break;
	case (2):
      if (dat1&0x80) temp1|=0x80; else temp1&=0x7f;
      break;
	case (3):
      if (dat1&0x80) temp1|=0x02; else temp1&=0xfd;
      break;
	case (4):
      if (dat1&0x80) temp1|=0x01; else temp1&=0xfe;
	  break;
	case (5):
      if (dat1&0x80) temp1|=0x20; else temp1&=0xdf;
      break;
	case (6):
      if (dat1&0x80) temp1|=0x04; else temp1&=0xfb;
      break;
	case (7):
      if (dat1&0x80) temp1|=0x40; else temp1&=0xbf;
      break;
	
    
  }

    dat1<<=1;
  }

}


/********************************************************
*  端口初始化                                 *

void PortInit(void)
{
    DDRD = 0xff;
	PORTD = 0xff;
	
	
}
********************************************************/

void irol(uint x)
 {

if(x&0x8000) 
{ 
    x<<=1; 
    x|=0x0001; 
	hang=x;
} 
else 
{ 
    x<<=1; 
	hang=x;
} 
}

//*********************************扫描键盘


void getkey(void)
{
   if((PIND&(1<<KEY0))==0)//如果按下按键PD2 
   {       
      _delay_ms(10);//去抖动 
      if((PIND&(1<<KEY0))==0) 
      { 
          do {; } while (bit_is_clear(PIND,KEY0)); //等待按键释放(变为高电平)
          
        	if(speed++>100) speed=1;
      } 
   } 
   
   if((PIND&(1<<KEY1))==0)//如果按下按键PD3 
   {       
      _delay_ms(10);//去抖动 
      if((PIND&(1<<KEY1))==0) 
      { 
         do {; } while (bit_is_clear(PIND,KEY1)); //等待按键释放(变为高电平) 
         if(speed--<2) speed=100;  
             
      } 
   } 
   
}   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -