一 硬件电路 (1)系统组成: 主要硬件电路:LED 点阵条屏是由 16 个 8*8 的 LED 点阵块组成,形成 16*64 矩形点阵,以AT89S51为控制核心。显示屏的其他主要硬件有: ① 带锁存输出的 8位移位寄存器74HC595,作为LED的列线驱动输入;
先解决用595实现点阵的显示,滚动功能可以通过定时改变显示内容实现。
在8X8 LED 点阵上显示柱形,让其先从左到右平滑移动1次,其次从右到左 平滑移动1次,再次从上到下平滑移动1次,最后从下到上平滑移动次,如此循环下去。LED显示原理:显示某一个点时,列值设为1,行值设为0即可
另外如果你的51还要执行别的运算,应尽量减少它们的时间,也就是让51的绝大部分时间都在驱动LED“显示”。如果还不行,那就只能在LED驱动一侧加锁存器了。
按照人的常规的视觉停留的频率计算就行了,一般地,扫描频率要50HZ以上肉眼看起来就不闪烁,就拿50HZ阀值,那么一个点阵显示的时间为1S/50=20mS,即需要20mS后再对它进行扫描;但是你每行是5mS,那么一共有8行,重复扫描时
主循环程序中,j 循环结束别加延时,那个delay(250);删掉。j 循环一次只是显示一屏,应再循环显示n屏,再 i 循环,调这个n大小,就是调滚动的速度。你现在是,一屏只显示一次,又加延时250,这等于黑屏了250的延时
做51单片机点阵LED滚动屏,如8×8的,我要显示一个L,那是不是要把L在滚动过程中的每个状态做出数据表
{ while(--t);} void main(){ unsigned char q;P1=0xfe;//1111 1110 P1口led灯,实际不是再改 while(1){ P1=0xfe;//1111 1110 for(q=0;q<8;q++){ delay(25000); //0.5S,得按照实际晶振再改
则亮度也会增加,那么完成16行的扫描时间则就增加了,所以肉眼可辨别的24Hz则就明显的感觉的刷新频率不够要闪烁。我看到过好的方式,用定时器来定时处理显示,开辟缓存区。主函数里则来处理数据。但是估计你应该不会。
没必要循环初始化你的LCD,将初始化程序放到主函数中。你的显示函数中也已经包含了清屏指令,不需要在while里面再次加入清屏指令。如果一定要用,建议你在所有清屏指令后加入的延时够大。清屏指令过多,延时太少的话,相当于
^_^,我以前做个一个类似的项目,经验认为一般每一行使用1~2ms就可以了,也就是说实际应用中20ms内完成一个周期一般是没有问题的,频率太高,显示会变暗,频率太低就会闪烁,下面是部分代码,原程序还有一个红外遥控输入
按照人的常规的视觉停留的频率计算就行了,一般地,扫描频率要50HZ以上肉眼看起来就不闪烁,就拿50HZ阀值,那么一个点阵显示的时间为1S/50=20mS,即需要20mS后再对它进行扫描;但是你每行是5mS,那么一共有8行,重复扫描时
另外如果你的51还要执行别的运算,应尽量减少它们的时间,也就是让51的绝大部分时间都在驱动LED“显示”。如果还不行,那就只能在LED驱动一侧加锁存器了。
我用51单片机串行通信方式去控制一块8×8LED点阵屏,显示的时候,文字闪烁厉害……
在8X8 LED 点阵上显示柱形,让其先从左到右平滑移动1次,其次从右到左 平滑移动1次,再次从上到下平滑移动1次,最后从下到上平滑移动次,如此循环下去。LED显示原理:显示某一个点时,列值设为1,行值设为0即可
这时可以判断开关状态 开关合上 可以让8个LED左移一位 开关断开 可以让8个LED右移一位 呵呵 按上诉算法 编写程序 就可以实现你的要求(指导可以见百度知道的消息 右上角)满意 就选满意回答
void main(void){ unsigned char tmp,i;P1=0x00;//全熄灭 while(1){ for(i=0;i<8;i++)//左移 { tmp=0x01;tmp=(tmp<
8.怎么玩转单片机-8位LED左移 包你学会单片机 单片机智能控制,单片机源代码 /*--- 名称:IO口高低电平控制 内容:左移,直至LED全部点亮,左移符号 ---*/ includereg52.h //包含头文件,一般情况不需要改动,头文件
单片机程序8x8led点阵显示心形并实现左移右移的程序
电路见图1。一片20引脚的单片机stc2032(引脚排列与at89c2051完全相同)为电子钟主体,其显示笔画数据从p1口分时输出,p3口则输出对应的六位选通信号。由于led数码管点亮时耗电较大,故不能使用at89c2051单片来完成,但是可以可以用stc89c2032
显示屏软件的主要功能是向屏体提供显示数据,并产生各种控制信号,使屏幕按设计的要求显示。根据软件分层次设计的原理,可把显示屏的软件系统分成两大层:第一层是底层的显示驱动程序,第二层是上层的系统应用程序。显示驱动程序负责向屏体送
这是1602电路,和时钟电路。元件基本差不多。电路如图 include
1、编写程序,用8255的PA口控制8X8点阵的行;8255的PC口控制8X8点阵的列;显示字符。2、按图连接线路;运行程序,观察实验结果,学会控制LED点阵显示字符。四、实验原理图 五、实验步骤 1、主机连线说明:B4区:CS(8255)
急需:求单片机80S51实训(带汇编程序) 题目要求:8乘8点阵显示 需原理图和器材清单
见下图这个问题不是很难! 我的理解是楼主可能只用单片机和点阵模块来实现,这需要单片现来做动态扫描。 首先需要你把点阵上要显示图形的代码写出来,即每种图形每行显示的数据,每个图形有8行数据,即占8个字节的空间! 如果楼主用51单片机来实现的话,可以使用P0口输出行数据,P1口作为点阵的行扫描控制。 其次要用按键控制,只需你把每种图形以不同的表存起来,再做一个按键扫描程序,当检测到有键按下时,把动态扫描的表头地址更换即可!
每屏显示时,列控制码左(右)移,就可实现点阵屏左(右)移动。 以显示“ | ” 从右向左移为例,第1 屏,右边第1 列亮1ms后灭,第2 屏,第2 列亮。。。。8 屏显示后,完成“| ”左移。
#include sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; unsigned char code image[11][8] = { {0xC3, 0x81, 0x99, 0x99, 0x99, 0x99, 0x81, 0xC3}, //数字0 {0xEF, 0xE7, 0xE3, 0xE7, 0xE7, 0xE7, 0xE7, 0xC3}, //数字1 {0xC3, 0x81, 0x9D, 0x87, 0xC3, 0xF9, 0xC1, 0x81}, //数字2 {0xC3, 0x81, 0x9D, 0xC7, 0xC7, 0x9D, 0x81, 0xC3}, //数字3 {0xCF, 0xC7, 0xC3, 0xC9, 0xC9, 0x81, 0xCF, 0xCF}, //数字4 {0x81, 0xC1, 0xF9, 0xC3, 0x87, 0x9D, 0x81, 0xC3}, //数字5 {0xC3, 0x81, 0xF9, 0xC1, 0x81, 0x99, 0x81, 0xC3}, //数字6 {0x81, 0x81, 0x9F, 0xCF, 0xCF, 0xE7, 0xE7, 0xE7}, //数字7 {0xC3, 0x81, 0x99, 0xC3, 0xC3, 0x99, 0x81, 0xC3}, //数字8 {0xC3, 0x81, 0x99, 0x81, 0x83, 0x9F, 0x83, 0xC1}, //数字9 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, //全亮 }; void main() { EA = 1; //使能总中断 ENLED = 0; //使能U4,选择LED点阵 ADDR3 = 0; TMOD = 0x01; //设置T0为模式1 TH0 = 0xFC; //为T0赋初值0xFC67,定时1ms TL0 = 0x67; ET0 = 1; //使能T0中断 TR0 = 1; //启动T0 while (1); } /* 定时器0中断服务函数 */ void InterruptTimer0() interrupt 1 { static unsigned char i = 0; //动态扫描的索引 static unsigned int tmr = 0; //1s软件定时器 static unsigned char index = 9; //图片刷新索引 TH0 = 0xFC; //重新加载初值 TL0 = 0x67; //以下代码完成LED点阵动态扫描刷新 P0 = 0xFF; //显示消隐 switch (i) { case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=image[index][0]; break; case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=image[index][1]; break; case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=image[index][2]; break; case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=image[index][3]; break; case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=image[index][4]; break; case 5: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=image[index][5]; break; case 6: ADDR2=1; ADDR1=1; ADDR0=0; i++; P0=image[index][6]; break; case 7: ADDR2=1; ADDR1=1; ADDR0=1; i=0; P0=image[index][7]; break; default: break; } //以下代码完成每秒改变一帧图像 tmr++; if (tmr >= 1000) //达到1000ms时改变一次图片索引 { tmr = 0; if (index == 0) //图片索引10~0循环 index = 10; else index--; } }
5ms×8=40ms(25次/秒),这只是人眼视觉暂留的下限。 我觉得你至少应该提高4~5倍的刷新速度才行(例如每行显示1ms)。 另外如果你的51还要执行别的运算,应尽量减少它们的时间,也就是让51的绝大部分时间都在驱动LED“显示”。 如果还不行,那就只能在LED驱动一侧加锁存器了。
你好,你那个U2是什么器件?请说明一下。或者把这个仿真文件直接发过来,实现比较快。
1 2 3 4 5 6 7 8 0 0 0 0 0 0 0 0 00h 0 0 1 0 0 0 0 0 20h 0 0 1 0 0 0 0 0 20h 0 0 1 0 0 0 0 0 20h 0 0 1 0 0 0 0 0 20h 0 0 1 0 0 0 0 0 20h 0 0 1 1 1 1 0 0 3ch 0 0 0 0 0 0 0 0 00h 00 00 7e 02 02 02 00 00 你取模是按行取,你可以尝试按列取 取成00h,00h,7eh,02h,02h,02h,00h,00h 当显示一静态"L"时, 假设由左向右扫描输出的话指针顺序是1,2,3,4,5,6,7,8。 如果你要"L"向左移,那下一帧就从2开始2,3,4,5,6,7,8,(程序设定超过8时为00h,简单点就是如果你点阵“屏”是8*8的,那你在后面加补8个00h,16*16就补32个,这样你移动N*8(或N*16)的字幕都是向左“消失”,因为最后那8(或32)个00,刚好能填满你的屏(消失)) 再下一帧就从3开始,如比类推。 当然还可以设成循环模式如 1,2,3,4,5,6,7,8 2,3,4,5,6,7,8,1 3,4,5,6,7,8,1,2 4,5,6,7,8,1,2,3 ...................... 程序我就不给你写了,你自己好好想想咯,外加我是用C的。。汇编不熟。希望能帮到你。
不用的,你可以让它的位置相对移动就行了。没必要把所有状态都做出来。那样太浪费存储空间了。只需要用代码来控制实现就行了。