📄 ledm8.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 + -