LED点阵手写屏
以12单片机为核心,LED点阵屏采用微亮的动态扫描方式,通过光敏三极管制作的光笔,对动态扫描的点阵进行检测,并将检测到的LED灯的状态通过中断程序由0状态(延时1ms,微亮)变为1状态(延时15ms,亮),从而实现“写字”功能。
感谢电子发烧友论坛,在整个设计过程中,在论坛中看到了很多大神的帖子,得到了很多启示。
显示屏模块
驱动模块
光笔模块
整体
效果图
关键程序
// 点阵屏
xdata ledstate[16][32]=0; //状态数组,初值都为0;若用uint定义会出现字符过大。
/************点阵扫描*************/
void scan()
{
while(1)
{
OE=0; //595使能(可直接接地)
for(hang=0;hang<16;hang++) //16行
{
for(lie=0;lie<32;lie++) //32列
{
if(ledstate[hang][lie]!=1)
ledstate[hang][lie]=0; //标志0,进入0状态,微亮
else
ledstate[hang][lie]=1; //标志1,进入1状态,亮
hwrite(); //行扫描
lwrite(); //列扫描
}
lie=0; //列重置0
}
hang=0; //行重置0
}
}
关键程序
//行驱动程序,74HC595
/************595驱动程序*************/
void hc595data(uchar Data1,uchar Data2)
{
uchar i,j; //变量定义。
SHCP=0; //给SHCP赋初值。
STCP=0; //给STCP赋初值。
for(i=0;i<8;i++)
{
SHCP=0; //SHCP为0,
SHCP=1; //SHCP为1,形成上升沿,传送串行数据。
DS=Data1&0x80; //将Data1的最高位传送到DS。
Data1=Data1<<1;//Data1左移一位,循环8次从而将Data1的8位数据传输完毕。
}
for(j=0;j<8;j++)//第9个SHCP的上升沿数据从第1个595的Q'H引脚传送到第2个595的DS引脚。
{
SHCP=0; //SHCP为0,
SHCP=1; //SHCP为1,形成上升沿,传送串行数据。
DS=Data2&0x80; //将Data2的最高位传送到DS。
Data2=Data2<<1;//Data2左移一位,循环8次从而将Data2的8位数据传输完毕。
}
STCP=0; //STCP为0,
STCP=1; //STCP为1,形成上
升沿,数据从寄存器置入锁存器。
}
关键程序
//列驱动程序,74HC154
/************列扫描*************/
//154-1控制第1列到第16列
if(lie==0~15)//第1列~第16列
{
OE1=0;OE2=0;OE3=1;OE4=1;
A=X;Bb=X;C=X;D=X;
}
//154-2控制第17列到第32列
if(lie==0~15)//第17列~第32列
{
OE1=1;OE2=1;OE3=0;OE4=0;
E=X;F=X;G=X;H=X;
}
关键程序
//光笔程序
/************外部中断0初始化*************/
void outside_init()
{
EA=1; //开总中断
EX0=1; //打开外部中断0
IT0=1; //设置为下降沿触发
}
/************光笔外部中断0*************/
void key_scan() interrupt 0 //外部中断0
{
if(key==0)
{
delay(10);//延时函数,防止中断检测不到LED点阵屏扫描。
if(key==0)
{
ledstate[hang][lie]=1;//改变此时LED灯的状态。
} //0状态,微亮;1状态,亮。
}
}
PCB图都是双层的,看起来烟眼花,就不上传了。
进来支持一下!