您好,欢迎来到花图问答。
搜索
您的当前位置:首页MCU实验六

MCU实验六

来源:花图问答
实验六 点阵LED与1602LCD

一、实验目的:

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 1:(1)点阵LED显示静态图像

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 (2)点阵LED向上滚动图像

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 (3)点阵LED向左滚动图像

#include unsigned int i,j;

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 2:基于LCD1602的数字钟:

#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;t1for(t2=0;t2<110;t2++); void inputcom(unsigned char com) { RS=0;RW=0;EN=0; P2=com; delay(5); EN=1; delay(5); }

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

本站由北京市万商天勤律师事务所王兴未律师提供法律服务