任务三 点阵显示屏移位显示数字
- 格式:ppt
- 大小:4.92 MB
- 文档页数:15
一、设计依据16x16点阵需要32个驱动,分别为16个列驱动及16个行驱动。
每个行与每个列可以选中一个发光管,共有256个发光管,采用动态驱动方式。
每次显示一行后再显示下一行。
本设计是利用实验仪上的16×16 LED点阵显示器,编写显示英文、汉字字符程序并进行显示,最好能移动显示。
要求在本设计过程中,通过设计合适的硬件电路及对应的软件,实现上述的控制过程,同时写出合格的课程设计说明书。
二、要求及主要内容1.硬件电路设计(1)完成89C51应用系统设计(晶振电路,上电复位电路等)(2)利用单片机I/O口或以扩展锁存器的方式控制点阵显示。
掌握单片机与16×16点阵块之间接口电路的设计方法。
2.程序设计掌握单片机与16×16点阵块之间接口电路的设计方法及编程要求完成主程序的设计及对应的子程序设计。
3.选芯片, 元件按设计连线4.完成子程序调试5.完成总调试三、途径和方法综合运用单片机和电子电路相关知识,实现本次设计。
进行程序设计时先画流程图再进行程序设计。
子程序调试按以下步骤进行:(1)实验板与PC机联机。
(2)利用实验系统16×16点阵实验单元,以两种方式控制点阵显示。
要求编制程序实现汉字点阵循环显示。
点阵时钟摘要LED点阵显示屏是利用发光二极管点阵模块或像素单元组成的平面式显示屏幕。
它具有发光效率高、使用寿命长、组态灵活、色彩丰富以及对室内外环境适应能力强等优点。
并广泛的应用于公交汽车,码头,商店,学校和银行等公共场合的信息发布和广告宣传。
LED显示屏经历了从单色,双色图文显示屏到现在的全彩色视频显示屏的发展过程,自20世纪八十年代开始,LED显示屏的应用领域已经遍布交通、电信、教育、证券、广告宣传等各方面。
LED点阵显示屏可以显示数字或符号,通常用来显示时间、速度、系统状态等。
文章给出了一种基于MCS-51单片机的16×16 点阵LED显示屏的设计方案。
#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define sudu 20/***各种声明的声明*****/sbit LAT_port=P2^0;sbit CLK_port=P2^1;sbit DI_port=P2^2;sbit G_port=P2^3;sbit A_port=P2^4;sbit B_port=P2^5;sbit C_port=P2^6;sbit D_port=P2^7;uchar move; //上移下移用的全局变量uchar temp; //缓冲用的uchar han;uchar zi;uchar code ziku[]={0xFF,0xFF,0xC7,0xE3,0x83,0xC1,0x79,0x9E,0xFE,0x7F,0xFE,0x7F,0xFE,0x7 F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFC,0x3F,0xF9,0x9F,0xE3,0xC7,0xC7,0xF1,0x1F,0xF C,0x7F,0xFE,/*"未命名文件",0*/0x7F,0xFF,0x7F,0xFF,0x01,0xC0,0x3F,0xFE,0x5F,0xFD,0x6F,0xFB,0x73,0xE 7,0x7C,0x9F,0x0F,0xF8,0xFF,0xFD,0xFF,0xFE,0x00,0x80,0x7F,0xFF,0x7F,0xFF,0x5F,0xF F,0xBF,0xFF,/*"李",0*/0xF7,0xF7,0x80,0x80,0xF7,0xF7,0xC1,0xC1,0xF7,0xF7,0x80,0x80,0xF7,0xF 7,0x03,0xE0,0xFF,0xEF,0x07,0xE0,0xFF,0xEF,0x03,0xE0,0x7F,0xFF,0xED,0xDE,0xED,0xB 7,0x1E,0xB0,/*"慧",1*/0xFF,0xFF,0x07,0xF0,0xF7,0xF7,0xF7,0xF7,0xB7,0xF7,0x77,0xF7,0x77,0xF 7,0xF7,0xF7,0x00,0x80,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xFB,0xF7,0xFB,0xF7,0xFD,0xF 5,0xFE,0xFB,/*"丹",2*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,};uchar code ziku1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0xFF,0xFF,0x07,0xF0,0xF7,0xF7,0xF7,0xF7,0xB7,0xF7,0x77,0xF7,0x77,0xF 7,0xF7,0xF7,0x00,0x80,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xFB,0xF7,0xFB,0xF7,0xFD,0xF 5,0xFE,0xFB,/*"丹",2*/0xF7,0xF7,0x80,0x80,0xF7,0xF7,0xC1,0xC1,0xF7,0xF7,0x80,0x80,0xF7,0xF 7,0x03,0xE0,0xFF,0xEF,0x07,0xE0,0xFF,0xEF,0x03,0xE0,0x7F,0xFF,0xED,0xDE,0xED,0xB 7,0x1E,0xB0,/*"慧",1*/0x7F,0xFF,0x7F,0xFF,0x01,0xC0,0x3F,0xFE,0x5F,0xFD,0x6F,0xFB,0x73,0xE 7,0x7C,0x9F,0x0F,0xF8,0xFF,0xFD,0xFF,0xFE,0x00,0x80,0x7F,0xFF,0x7F,0xFF,0x5F,0xF F,0xBF,0xFF,/*"李",0*/0xFF,0xFF,0xC7,0xE3,0x83,0xC1,0x79,0x9E,0xFE,0x7F,0xFE,0x7F,0xFE,0x7 F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFC,0x3F,0xF9,0x9F,0xE3,0xC7,0xC7,0xF1,0x1F,0xF C,0x7F,0xFE,/*"未命名文件",0*/};uchar BUF[4];/***子函数申明****/void delay(uint t);void xie595(uchar dat);void hangxuan(uchar han);void huanchong();void zhuanhuanzuoyi();void zhuanhuanyouyi();/***延时****///void delay(uint t){while(t--) ;}/****595输入函数****///void xie595(uchar dat){uchar i;CLK_port=0;for(i=0;i<8;i++){if((dat&0x80)!=0)DI_port=1;elseDI_port=0;CLK_port=1; //上升沿输入数据CLK_port=0;dat<<=1;}}/*******行扫描程序*******///void hangxuan(uchar han){switch(han){case 0:A_port = 0; B_port = 0; C_port = 0;D_port = 0;break;case 1:A_port = 1; B_port = 0; C_port = 0;D_port = 0;break;case 2:A_port = 0; B_port = 1; C_port = 0;D_port = 0;break;case 3:A_port = 1; B_port = 1; C_port = 0;D_port = 0;break;case 4:A_port = 0; B_port = 0; C_port = 1;D_port = 0;break;case 5:A_port = 1; B_port = 0; C_port = 1;D_port = 0;break;case 6:A_port = 0; B_port = 1; C_port = 1;D_port = 0;break;case 7:A_port = 1; B_port = 1; C_port = 1;D_port = 0;break;case 8:A_port = 0; B_port = 0; C_port = 0;D_port = 1;break;case 9:A_port = 1; B_port = 0; C_port = 0;D_port = 1;break;case 10:A_port = 0; B_port = 1; C_port = 0;D_port = 1;break;case 11:A_port = 1; B_port = 1; C_port = 0;D_port = 1;break;case 12:A_port = 0; B_port = 0; C_port = 1;D_port = 1;break;case 13:A_port = 1; B_port = 0; C_port = 1;D_port = 1;break;case 14:A_port = 0; B_port = 1; C_port = 1;D_port = 1;break;case 15:A_port = 1; B_port = 1; C_port = 1;D_port = 1;break;}}/*****缓冲****************/void huanchong(){uchar i;for(i=0;i<2;i++){BUF[i*2+1]=ziku[zi*32+i*32+han*2+1]; //右半部分屏的数据BUF[i*2]=ziku[zi*32+i*32+han*2]; //左半部分屏数据}}/*********左右转换********/void zhuanhuanzuoyi() //向左子函数{uchar wy;if(move<8){wy=move;temp=((BUF[2]<<(8-wy))|(BUF[1]>>wy)); //右半屏的数据处理准备移动的屏左移(8-wy)位;看得见的右移wy位xie595(temp);temp=((BUF[1]<<(8-wy))|(BUF[0]>>wy)); //左半屏同上xie595(temp);}else{wy=(move-8);temp=((BUF[3]<<(8-wy))|(BUF[2]>>wy)); //同上xie595(temp);temp=((BUF[2]<<(8-wy))|(BUF[1]>>wy));xie595(temp);}}void zhuanhuanyouyi() //向右子函数统统同上方向改变{uchar wy;if(move<8){wy=move;temp=((BUF[0]>>(8-wy))|(BUF[1]<<wy));xie595(temp);temp=((BUF[3]>>(8-wy))|(BUF[0]<<wy));xie595(temp);}else{wy=(move-8);temp=((BUF[3]>>(8-wy))|(BUF[0]<<wy));xie595(temp);temp=((BUF[2]>>(8-wy))|(BUF[3]<<wy));xie595(temp);}}/***一般显示***********/void yiban(){zi=0;han=0;LAT_port=0; // 锁住595G_port=1; //138 不使能for(zi=0;zi<4;zi++) //多少个字循环多少次{uint i;for(i=0;i<2000;i++) //刷屏N 次{xie595(ziku[zi*32+han*2+1]);xie595(ziku[zi*32+han*2]);LAT_port=1;//上升沿595输出数据LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;//关屏han++;if(han==16)han=0;}}}/**********下拉******/void xiala(){uint i,j=0;uint k;zi=0;han=0;LAT_port=0;G_port=1;for(k=0;k<64;k++) //一个字要16 {for(i=0;i<sudu*15;i++) //{xie595(ziku[zi*32+han*2+1]); //先写高位xie595(ziku[zi*32+han*2]);LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;han++;if(han==16)han=0;if(han>j)han=0;}j++;if(j>15){G_port=1;j=0;delay(50000);zi++;if(zi==4)zi=0;}}}/*********上移***********/void shangyi(){uint i=0,j=0;uchar move=0;G_port=1;LAT_port=0;zi=0;han=0;for(j=0;j<(zi+1)*16;j++){for(i=0;i<(sudu*15);i++){xie595(ziku[zi*32+han*2+1+move*2]);//......xie595(ziku[zi*32+han*2+move*2]);LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;han++;if(han==16)han=0;}move++;if(move==16){move=0;zi++;if(zi==4)zi=0;}}}/*********下移***********/void xiayi(){uint i=0,j=0;uchar move=0;G_port=1;LAT_port=0;zi=4;han=0;for(j=0;j<(zi+2)*16;j++){for(i=0;i<(sudu*15);i++){xie595(ziku1[zi*32+han*2+1-move*2]);xie595(ziku1[zi*32+han*2-move*2]);LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;han++;if(han==16)han=0;}move++;if(move==16){move=0;zi--;if(zi<0)zi=4;}}}/*******左移***************/void zuoyi(){uchar i;LAT_port=0;G_port=1;zi=0;han=0;for(zi=0;zi<4;zi++){for(move=0;move<16;move++){for(i=0;i<sudu;i++){for(han=0;han<16;han++){huanchong();zhuanhuanzuoyi();LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;}}}}}/********右移**********/void youyi(){uchar i;LAT_port=0;G_port=1;zi=0;han=0;for(zi=0;zi<4;zi++){for(move=0;move<16;move++) //移动16次置0{for(i=0;i<sudu;i++){for(han=0;han<16;han++){huanchong();zhuanhuanyouyi();LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;}}}}}void main(){while(1){yiban();delay(30000);xiala();delay(30000);shangyi(); //各种调用delay(30000);xiayi();delay(30000);zuoyi();delay(30000);youyi();}}。
目录摘要 (1)前言 (2)1 概述 (2)1.1 LED电子显示屏的分类 (2)1。
2 LED显示屏的应用示例 (2)1。
3 设计任务 (2)2 显示原理及控制方式分析 (3)2.1 LED点阵模块结构 (3)2。
2 LED 动态显示原理 (3)2.3 LED常见的控制方式 (5)3 总体方案设计与分析 (6)3.1显示单元的考虑 (6)3。
2 滚屏的实现 (6)3。
3 关于可扩展性 (6)3。
4 微控制器的考虑 (6)3.5 总体电路结构及工作原理 (6)3.5。
1 硬件电路框图 (6)3.5。
2 工作原理 (7)4 硬件电路设计 (7)4。
1 显示单元电路设计 (7)4。
1。
1 LED点阵模块的选择 (8)4.1.2 列驱动电路设计 (8)4。
1。
3 行驱动电路设计 (9)4.2 单片机控制系统电路设计 (10)4.2.1单片机的选型 (10)4。
3对于系统电源及通信电缆的选择 (11)4。
4 其它元件的选择 (11)5 单片机软件设计与仿真 (12)5.1 开发工具及语言 (12)5。
2 单片机软件流程 (13)5。
3 单片机软件中算法的实现 (14)5.4 调试及仿真结果 (15)6 PCB设计及硬件调试 (16)6。
1 PCB设计平台 (16)6.2元件布局及PCB整体结构工艺 (16)6。
3 布线工艺与准则 (16)7 总结 (17)谢辞............................................................................................ 错误!未定义书签。
参考文献. (18)附录 (19)LED点阵电子显示屏系统的设计xxx摘要:本设计使用STC系列高速单片机作为主控制模块,利用简单的外围电路来驱动16×64的点阵LED显示屏。
本LED显示屏能够以动态扫描的方式同时显示特定的四个16×16点阵汉字。
总结最近一段时间学习avr的一些收获。
结合Proteus和ICC来学习A VR 单片机以前学习51单片机接触点阵比较少,这次学习A VR单片机我注重学习点阵。
下面是我的几个关于点阵的实验,包括数字和单个汉字和多个汉字的显示,滚动。
1.显示数字,间隔1s显示数字从0到4,循环不止。
程序思想:相应的A VR程序,开发环境是ICC。
图示显示的点阵,IO口PC接的是行信号线,共阳。
IO口PD接的是列信号线,共阴。
下面是我的程序#include<iom16v.h>#include<macros.h>#define uchar unsigned char#define uint unsigned intuchar j;uchar code[][8]={{0x00,0x3C,0x46,0x42,0x42,0x66,0x3C,0x00},//0{0x00,0x08,0x38,0x08,0x08,0x08,0x3E,0x00},//1{0x00,0x3C,0x42,0x04,0x08,0x32,0x7E,0x00},//2{0x00,0x3C,0x42,0x1C,0x02,0x42,0x3C,0x00},//3{0x00,0x0C,0x14,0x24,0x44,0x3C,0x0C,0x00}};void delayms(void){uint i,j;for(i=110;i>0;i--)for(j=5;j>0;j--);}void init_timer(void){TCCR1B=0X04;TCNT1H=0X85;TCNT1L=0XEE;TIMSK|=BIT(2);SREG|=BIT(7);}void main(void){uchar m,i;DDRC|=0XFF;DDRD|=0XFF;init_timer();while(1){m=0x01;for(i=0;i<8;i++){PORTC=m;PORTD=~code[j][i];//PC扫描,PD输入显示数据 delayms();m=m<<1;}}}#pragma interrupt_handler timer1_isr:9void timer1_isr(void){j++;if(j==5){ j=0;}TCNT1H=0X85;//1sTCNT1L=0XEE;}2.数字滚动数字0向上滚动#include<iom16v.h>//滚动0 ,proteus 图点阵基础#include<macros.h>#define uchar unsigned char#define uint unsigned intuchar j;uchar code[]={0x00,0x3C,0x46,0x42,0x42,0x66,0x3C,0x00,0x00,0x3C,0x46,0x42,0x42,0x66,0x3C,0x00};/*{0x00,0x08,0x38,0x08,0x08,0x08,0x3E,0x00}, {0x00,0x3C,0x42,0x04,0x08,0x32,0x7E,0x00}, {0x00,0x3C,0x42,0x1C,0x02,0x42,0x3C,0x00}, {0x00,0x0C,0x14,0x24,0x44,0x3C,0x0C,0x00}*/ //};void delayms(void){uint i,j;for(i=110;i>0;i--)for(j=5;j>0;j--);}void init_timer(void){TCCR1B=0X04;TCNT1H=0Xc2;//85TCNT1L=0Xf7;//ee 1秒TIMSK|=BIT(2);SREG|=BIT(7);//开中断}void main(void){uchar m,i;DDRC|=0XFF;DDRD|=0XFF;init_timer();while(1){m=0x01;for(i=0;i<8;i++){PORTC=m;//扫描信号PORTD=~code[i+j];//数据信号delayms();m=m<<1;}}}#pragma interrupt_handler timer1_isr:9 void timer1_isr(void){j++;if(j==8){ j=0;}TCNT1H=0Xc2;//加快流动的速度,0.5sTCNT1L=0Xf7;}3.汉字显示取模软件网上挺多的,/s/1eQmnpmi我这次用的是该程序中的纵向取模取模软件的设置如下图所示四个8*8的点阵拼成16*16的点阵方法如下链接所示/news/69649.html上图点阵程序如下:#include<iom16v.h>#include<macros.h>#define uint unsigned int#define uchar unsigned char#define SCK_H1() PORTB|=BIT(0);#define SCK_L1() PORTB&=~BIT(0);#define SDI_H1() PORTB|=BIT(1);#define SDI_L1() PORTB&=~BIT(1);#define LCK_H1() PORTB|=BIT(2);#define LCK_L1() PORTB&=~BIT(2);#define SCK_H2() PORTB|=BIT(3);#define SCK_L2() PORTB&=~BIT(3);#define SDI_H2() PORTB|=BIT(4);#define SDI_L2() PORTB&=~BIT(4);#define LCK_H2() PORTB|=BIT(5);#define LCK_L2() PORTB&=~BIT(5);uchardiscode[]={0x40,0x20,0xF8,0x0F,0x02,0xFE,0xD2,0x52,0xF2,0x52,0 xD2,0x02,0xFE,0x00,0x00,0x00,0x00,0x00,0x7F,0x20,0x1C,0x03,0x3F,0x00,0x7F,0x10,0x1F,0x00,0x 1F,0x20,0x78,0x00};//佩//0x40,0x20,0xF8,0x0F,0x02,0xFE,0xD2,0x52,0xF2,0x52,0xD2,0x02, 0xFE,0x00,0x00,0x00,//0x00,0x00,0x7F,0x20,0x1C,0x03,0x3F,0x00,0x7F,0x10,0x1F,0x00, 0x1F,0x20,0x78,0x00,uchardiscode1[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x01,0x02, 0x04,0x08,0x10,0x20,0x40,0x80};//扫描数组void delayms(uchar z){uchar i,j;for(i=225;i>0;i--)for(j=z;j>0;j--);}void Send_data1(uchar data)//串行{uchar i;for(i=0;i<8;i++){if((data&0x80)!=0){SDI_H1();}else { SDI_L1();}data<<=1;SCK_L1();SCK_H1();}LCK_L1();LCK_H1();//LCK_L();}void Send_data2(uchar data)//串行 {uchar i;for(i=0;i<8;i++){if((data&0x80)!=0){SDI_H2();}else { SDI_L2();}data<<=1;SCK_L2();SCK_H2();}LCK_L2();LCK_H2();//LCK_L();}void main(void){uchar m,n;DDRC|=0XFF;DDRB|=0XFF;DDRD|=0XFF;while(1){PORTC|=0XFF;PORTD|=0XFF;n=0x01;for(m=0;m<8;m++){Send_data1(~discode1[m+8]);PORTB&=~BIT(6);PORTB|=BIT(7);PORTC=discode[m];PORTD=discode[m+16];delayms(5);Send_data2(~discode1[m]);PORTB|=BIT(6);PORTB&=~BIT(7);PORTC=discode[m+8];PORTD=discode[m+24];delayms(5);n=n<<1;}}}程序思想:列信号扫描,行信号PC,PD送数据。
点阵屏显示原理及实验详解讲解标题:LED点阵屏学习攻略共享资料LED点阵屏学习攻略在经历了将近一个学期断断续续的点阵屏学习后,最后终于在AVR平台下完成了128*32点阵屏的无闪烁显示。
现把整个学习过程总结如下:无论是51单片机还是AVR单片机,点阵屏的显示原理是一样的,所以首先从51讲起。
说明:以下所有试验如无特殊说明均在Keil uVision3 + Proteus 6.9 SP5下仿真完成。
一.基于51的点阵屏显示:(1)点亮第一个8*8点阵:1.首先在Proteus下选择我们需要的元件,AT89C52、74LS138、MATRIX-8*8-GREEN(在这里使用绿色的点阵)。
在Proteus 6.9中8*8的点阵总共有四种颜色,分别为MATRIX-8*8-GREEN,MATRIX-8*8-BLUE,MATRIX-8*8-ORANGE ,MATRIX-8*8-RED。
在这里请大家牢记:红色的为上列选下行选;其它颜色的为上行选下列选!而所有的点阵都是高电平选中列,低电平选中行!也就是说如果某一个点所处的行信号为低,列信号为高,则该点被点亮!此结论是我们编程的基础。
2.在选择完以上三个元件后,我们开始布线,具体如下图:这里P2是列选,P3连接38译码器后作为行选。
选择38译码器的原因:38译码器每次可输出相应一个I/O口的低电平,正好与点阵屏的低电平选中行相对,并且节省了I/O口,大大方便了我们的编程和以后的扩展。
3.下面让我们把它点亮,先看一个简单的程序:(将奇数行偶数列的点点亮,效果如下图)下面是源代码:/************8*8LED点阵屏显示*****************/#includevoid delay(int z) //延时函数{int x,y;for(x=0;x<z;x++)< p="">for(y=0;y<110;y++);}void main(){while(1){P3=0; //行选,选择第一行P2=0x55; //列选,即该行显示的数据delay(5); //延时/*****下同*****/P3=2; //第三行P2=0x55;delay(5);P3=4; //第五行P2=0x55;delay(5);P3=6; //第七行P2=0x55;delay(5);}}上面的程序实现了将此8*8点阵的奇数行偶数列的点点亮的功能。
实验三LED点阵显示实验一、实验目的1、了解8X8矩阵LED显示的基本原理和功能。
2、掌握8X8矩阵LED的软件设计方法及字符编码的原理。
二、实验说明:8X8矩阵LED 为共阳极,显示任意字符或数字。
三、实验内容及步骤:1、使用最小应用系统1模块。
单片机最小应用系统1的RXD接Din,TXD接CLK,INT0接RCLK。
2、安装好仿真器,用串行数据通信线连接计算机与仿真器,把仿真头插到模块的单片机插座中,打开模块电源,打开仿真器电源。
3、启动计算机,打开伟福仿真软件,进入仿真环境。
选择仿真器型号、仿真头型号、CPU类型;选择通信端口,测试串行口。
4、打开点阵.ASM源程序,编译无误后,全速运行程序,观察点阵显示。
四、源程序;文字静止;RXD----Din;TXD----CLK;INT0---RCLKORG 0JMP MAINORG 32HMAIN:MOV SCON,#00H ;串行口工作模式为0CLR P3.2MOV SP,#60HMOV R2,#08H ;八行MOV R0,#0LOOP:MOV DPTR,#TAB ;字符首地址MOV A,#0MOV R1,#3 ;三个字节A1: MOV A,R0MOVC A,@A+DPTRMOV SBUF,A ;发送WAIT: JNB TI,WAIT ;等待一帧发送完CLR TIINC R0DJNZ R1,A1SETB P3.2 ;显示一行CLR P3.2DJNZ R2,LOOP ;下一行JMP MAINJMP $TAB: DB 80H,07DH,001H ;第一行DB 40H,07DH,0EFH ;第二行DB 20H,07DH,0EFH ;第三行DB 10H,001H,0EFH ;第四行DB 08H,07DH,0EFH ;第五行DB 04H,07DH,0EFH ;第六行DB 02H,07DH,0EFH ;第七行DB 01H,0FFH,0FFH ;第八行END五、原理图六、作业请在实验中修改源程序,以达到在LED点阵上显示自己编程设置的字符。
单片机c语言<>欢迎进入51单片机学习网论坛讨论本站新域名开通 中国单片机编程技术普及推广第一站!25.点阵式LED“0-9”数字显示技术1.实验任务利用8X8点阵显示数字0到9的数字。
2.电路原理图图4.25.13.硬件系统连线(1).把“单片机系统”区域中的P1端口用8芯排芯连接到“点阵模块”区域中的“DR1-DR8”端口上;(2).把“单片机系统”区域中的P3端口用8芯排芯连接到“点阵模块”区域中的“DC1-DC8”端口上;4.程序设计内容(1).数字0-9点阵显示代码的形成如下图所示,假设显示数字“0”123 456 7 8●●●●●●●●●●●●●●●●00 00 3E 41 41 41 3E 00因此,形成的列代码为00H,00H,3EH,41H,41H,3EH,00H,00H;只要把这些代码分别送到相应的列线上面,即可实现“0”的数字显示。
送显示代码过程如下所示送第一列线代码到P3端口,同时置第一行线为“0”,其它行线为“1”,延时2ms左右,送第二列线代码到P3端口,同时置第二行线为“0”,其它行线为“1”,延时2ms左右,如此下去,直到送完最后一列代码,又从头开始送。
数字“1”代码建立如下图所示123 456 7 8●●●●●●●●●●其显示代码为00H,00H,00H,00H,21H,7FH,01H,00H 数字“2”代码建立如下图所示123 456 7 8●●●●●●●●●●●●●●●●●00H,00H,27H,45H,45H,45H,39H,00H数字“3”代码建立如下图所示123 456 7 8●●●●●●●●●●●●●●●00H,00H,22H,49H,49H,49H,36H,00H数字“4”代码建立如下图所示123 456 7 8●●●●●●●●●●●●●●00H,00H,0CH,14H,24H,7FH,04H,00H 数字“5”代码建立如下图所示123 456 7 8●●●●●●●●●●●●●●●●●00H,00H,72H,51H,51H,51H,4EH,00H 数字“6”代码建立如下图所示123 456 7 8●●●●●●●●●●●●●●●●●00H,00H,3EH,49H,49H,49H,26H,00H 数字“7”代码建立如下图所示123 456 7 8●●●●●●●●●●●00H,00H,40H,40H,40H,4FH,70H,00H 数字“8”代码建立如下图所示123 456 7 8●●●●●●●●●●●●●●●●●00H,00H,36H,49H,49H,49H,36H,00H 数字“9”代码建立如下图所示123 456 7 8●●●●●●●●●●●●●●●●●00H,00H,32H,49H,49H,49H,3EH,00H 5.汇编源程序TIM EQU 30HCNTA EQU 31HCNTB EQU 32HORG 00HLJMP STARTORG 0BHLJMP T0XORG 30HSTART: MOV TIM,#00HMOV CNTA,#00HMOV CNTB,#00HMOV TMOD,#01HMOV TH0,#(65536-4000)/256MOV TL0,#(65536-4000) MOD 256SETB TR0SETB ET0SETB EASJMP $T0X:MOV TH0,#(65536-4000)/256MOV TL0,#(65536-4000) MOD 256MOV DPTR,#TABMOV A,CNTAMOVC A,@A+DPTRMOV P3,AMOV DPTR,#DIGITMOV A,CNTBMOV B,#8MUL ABADD A,CNTAMOVC A,@A+DPTRMOV P1,AINC CNTAMOV A,CNTACJNE A,#8,NEXTMOV CNTA,#00HNEXT: INC TIMMOV A,TIMCJNE A,#250,NEXMOV TIM,#00HINC CNTBMOV A,CNTBCJNE A,#10,NEXMOV CNTB,#00HNEX: RETITAB: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH DIGIT: DB 00H,00H,3EH,41H,41H,41H,3EH,00HDB 00H,00H,00H,00H,21H,7FH,01H,00HDB 00H,00H,27H,45H,45H,45H,39H,00HDB 00H,00H,22H,49H,49H,49H,36H,00HDB 00H,00H,0CH,14H,24H,7FH,04H,00HDB 00H,00H,72H,51H,51H,51H,4EH,00HDB 00H,00H,3EH,49H,49H,49H,26H,00HDB 00H,00H,40H,40H,40H,4FH,70H,00HDB 00H,00H,36H,49H,49H,49H,36H,00HDB 00H,00H,32H,49H,49H,49H,3EH,00HEND6.C语言源程序#include <AT89X52.H>unsigned char code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code digittab[10][8]={ {0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00}, //0 {0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00}, //1{0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00}, //2{0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00}, //3{0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00}, //4{0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00}, //5{0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00}, //6{0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00}, //7{0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00}, //8{0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00} //9};unsigned int timecount;unsigned char cnta;unsigned char cntb;void main(void){TMOD=0x01;TH0=(65536-3000)/256;TL0=(65536-3000)%256;TR0=1;ET0=1;EA=1;while(1){;}}void t0(void) interrupt 1 using 0 {TH0=(65536-3000)/256;TL0=(65536-3000)%256;P3=tab[cnta];P1=digittab[cntb][cnta];cnta++;if(cnta==8){cnta=0;}timecount++;if(timecount==333){timecount=0;cntb++;if(cntb==10) {cntb=0; }}}。
点阵显示屏工作原理
点阵显示屏的工作原理是将整个显示屏分成一个个小矩形点,这些小矩形点被排列成一个矩阵的形式。
每个小矩形点都可以显示一个像素点,通过控制每个像素点的亮灭状态,从而实现文字、图像等内容的显示。
点阵显示屏的工作原理可以分为两个部分,即点阵的生成和显示。
1. 点阵生成:点阵的生成通常使用IC(集成电路)驱动,IC驱动器内部包含了若干个晶体管和电容器,通过控制这些晶体管和电容器的导通和断开来控制每个像素点的亮灭状态。
2. 点阵显示:通过控制每个像素点的亮灭状态,从而实现文字、图像等内容的显示。
可以通过针对每个像素点进行逐行刷新或以当前屏幕为基准点同时刷新的方式进行显示。
具体的工作原理如下:
当需要将某个像素点点亮时,控制对应的晶体管导通,导通后,电容器会充电,将电压传递给像素点,点亮该像素点。
当需要将某个像素点熄灭时,控制对应的晶体管断开,断开后,电容器将不再充电,像素点就会灭掉。
点阵显示屏通常通过扫描行和列的方式来控制每个像素点的亮灭。
扫描行指的是扫描屏幕的水平行数,扫描列指的是扫描屏幕的垂直列数。
每行每列都与一个晶体管连接,通过选通相应的行和列,实现对对应像素点的控制。
总的来说,点阵显示屏工作原理是通过控制每个像素点的亮灭状态来实现文字、图像等内容的显示。
通过控制晶体管和电容器的导通和断开,来控制每个像素点的亮灭状态,并通过扫描行和列的方式对每个像素点进行控制。