一、实验目的:
1、掌握点阵LED的使用方法; 2、掌握1602LCD的使用方法; 3、掌握动态扫描的设计方法; 4、掌握数字钟的设计方法。 二、实验内容:
1、点阵LED显示静态及动态图形;
2、基于LCD1602的数字钟(计算机仿真)。 三、实验方法:
1、点阵LED显示静态及动态图形 单片机P1口输出行线控制字,P2口输出列线控制字。 16×16点阵LED实验板由四个8×8点阵区域组成,实验只采用其中一个。若J2口单片机P1,J3口接单片机P2,控制点亮四个点阵区域的右上角部分。
点阵LED实验板左侧20针脚的最低位最高位分别接电源正负极(5V)。
点阵LED的每个发光二极管正极接在行线上,负极接在列线上。当某个led对应行线置1,列线置0,则此led亮。
(1)点阵LED显示静态图像
用“行扫描法”或“列扫
描法”,以不低于200Hz的速度动态扫描显示静态图像。图像内容自选。
以“行扫描法”为例:先输出“00000001B”的行控制字,即将第1行所有LED的正极加高电平,其他行所有LED的正极置0。同时输出对应的列控制字。由于2~8行的LED正极已经被置低,此时第1行列控制字对应位为0的LED被点亮。
以200Hz的速度动态扫描,则在确定第1行8个LED并延时50ms后,将行控制字变为“00000010B”,同时输出列控制字,控制第2行8个LED的负极置高或置低。50ms后再控制第3行的亮灭,依次循环。
“列扫描法”方法类似,先输出列控制字“11111110B”,将第1列的LED负极全部置0,同时控制各行状态,确定第1列的亮灭。一定时间后再确定第2列,然后第3列……
参考汇编程序略。
(2)点阵LED向上滚动图像
图像内容自选。动态扫描显示图像,控制图像以0.5s一行的速度向上滚动。
先采用“行扫描法”或“列扫描法”显示出图像。然后设置函数,当全图扫描过一定轮次N后,控制将行状态字循环交换一位。让P2口输出第1行时的列状态字时,P1口点亮的是第8行;P2口输出第2行的列状态字时,P1口点亮的是第1行。
位。这样就实现了图像的向上滚动。当图像再扫描N轮后,所有的行状态字再向前循环交换一
参考汇编程序略。
(3)点阵LED向左滚动图像
先采用“行扫描法”或“列扫描法”显示出图像。当全图扫描过一定轮次N后,用“_crol_”命令,把所有的列状态字循环左移一位,行状态字不变。再过N轮扫描后,所有列状态字再循环左移一位。
参考汇编程序略。
2、基于LCD1602的数字钟(计算机仿真) 元件库中搜索“lcd”找到1602。电位器为“POT-LIN”。按照下图连接元件,LED数据命令口接单片机P2口,RS、RW、E分别接P3.0、P3.1、P3.2。
为方便检验计时逻辑及计时的准确性,不采用单片机
内部脉冲,如下图从元件库中调用信号源作为计数脉冲,
输入到单片机的外部中断1口(P3.3)。设置信号源(下图)为正脉冲形式,高电位5V,频率根据测试“时、分、秒”需要随时修改。
要求:
(1)在1602LCD第1行显示一段字符串,内容为自己的学号;
(2)第2行显示一个24小时制数字钟。
外部脉冲接外部中断1口,首先要设置外部中断服务程序,每一个外部脉冲秒计数变量自增。或者外部脉冲接P3.4计数器
0口,每若干个外部脉冲后秒变量+1。
设置好“时/分/秒”进位函数,及1602LCD服务子程序,
将时分秒三个变量显示在LCD第2行的不同位置。在显示变量值时:(1)首先采用“对10取商取余”的方法进行十六进制数的十进制显示调整;(2)由于LCD中存贮的是ASCII码形式表示字符,0x30是字符‘0’的ASCII值。所以时分秒的十位个位数均需加+0x30再交给LCD显示。
四、实验报告
1、编写C程序,采用“行扫描法”或“列扫描法”实现点阵LED显示静态图像及水平/竖直方向滚动图像。调整扫描速度测试显示效果;
2、编写C程序,运用proteus仿真软件,在LCD1602上实现数字钟;
3、提高要求:
(1)分别采用“行扫描法”和“列扫描法”控制点阵LED显示静态及动态图形;
(2)LCD1602数字钟改为12小时制显示,采用“AM/PM”区分上下午;增加显示星期几的功能。
*4、课程考核项目(最后一周): (6)利用16×16点阵LED实现一个滚动显示的公交车报站器;
(7)结合矩阵式键盘、串行通信及LCD1602实现一个单片机密码锁;
(8)采用单片机内部脉冲设计基于LCD1602数字钟,12小时计时制,显示当前星期几,具有调整时间及闹钟功能。闹铃为蜂鸣器播放一小段音乐的形式,并可选择每周
的哪几天开启闹铃,其他日子不开启。 五、思考:
1、点阵LED采用“行扫描法”或“列扫描法”的区别是什么;如何实现点阵LED不同图形的连续滚动显示;
2、1602LCD显示自选图形的操作过程和现实字符库字符的操作有什么区别。
参考C程序: #include unsigned int i; void Time0() interrupt 1 { i++; TH0=(65536-4608)/256; //5ms,200Hz速度扫描} TL0=(65536-4608)%256; void main(void) { unsigned char R[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; unsigned char C[]={0x00,0x5A,0x5A,0x3C,0x42,0x5A,0x5A,0x00}; EA=1; ET0=1; TMOD=0x01; TH0=(65536-4608)/256; TL0=(65536-4608)%256; TR0=1; i=0; while(1) { P1=R[i%8]; P2=C[i%8]; } } #include unsigned int i; void delay() interrupt 1 { i++; TH0=(65536-4608)/256; } TL0=(65536-4608)%256; void main(void) { unsigned char R[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; unsigned char C[]={0x6D,0xC7,0x93,0x39,0x6D,0xC7,0x93,0x39}; EA=1; ET0=1; TMOD=0x01; TH0=(65536-4608)/256; TL0=(65536-4608)%256; TR0=1; i=0; while(1) { P1=R[((i%8)-(i/100))%8]; } P2=C[i%8]; } #include #include void delay() interrupt 1 { i++; TH0=(65536-4608)/256; } TL0=(65536-4608)%256; void main(void) { unsigned char R[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; unsigned char C[]={0xC3,0xBD,0x5A,0x7E,0x5A,0x66,0xBD,0xC3}; EA=1; ET0=1; TMOD=0x01; TH0=(65536-4608)/256; TL0=(65536-4608)%256; TR0=1; i=0; while(1) { P1=R[i%8]; P2=_crol_(C[i%8],i/100); } } #include #include unsigned char hour,minute,second,temp; unsigned char com,dat; unsigned char addr,string; unsigned char HH,HL,MH,ML,SH,SL; #define LCD P2; sbit RS=P3^0; sbit RW=P3^1; sbit EN=P3^2; void delay(unsigned int t) { unsigned int t1,t2; for(t1=0;t1 EN=0; void inputdata(unsigned char dat) { RS=1;RW=0;EN=0; P2=dat; delay(5); EN=1; delay(5); } EN=0; void intialize() { RS=0;RW=0;EN=0; inputcom(0x38); inputcom(0x0c); inputcom(0x06); } inputcom(0x01); void stringwrite(unsigned char addr,unsigned char *string) { inputcom(addr); while(*string>0) { inputdata(*string++); delay(5); } } void exint2() interrupt 2 { if(second==59) { second=0; if(minute==59) { minute=0; if(hour==23) { hour=0; } else ++hour; } else ++minute; } else } ++second; void display() { { HH=hour/10; HL=hour%10; inputcom(0x80+0x48); inputdata(HH+0x30); inputcom(0x80+0x49); inputdata(HL+0x30); } { MH=minute/10; ML=minute%10; inputcom(0x80+0x4b); inputdata(MH+0x30); inputcom(0x80+0x4c); inputdata(ML+0x30); } { SH=second/10; SL=second%10; inputcom(0x80+0x4e); inputdata(SH+0x30); inputcom(0x80+0x4f); inputdata(SL+0x30); if(SL%2==1) { stringwrite(0x80+0x4d,\":\"); stringwrite(0x80+0x4a,\":\"); } else { stringwrite(0x80+0x4d,\" \"); stringwrite(0x80+0x4a,\" \"); } } } void main() { IT1=1; EX1=1; EA=1; intialize(); stringwrite(0x80,\"MY DIGITAL CLOCK:\"); while(1) { display(); } } 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuowenda.com 版权所有 湘ICP备2023022495号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务