单片机汉字8x8点阵LED动态显示程序
展开全部 #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--; }}
51单片机8*8点阵显示数字5,并加按键的程序,求解答
展开全部 这个程序可以循环显示0~9.#include#include#define uchar unsigned char#define uint unsigned intuchar code Table_of_Digits[]={0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00, //00x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00, //10x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00, //20x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00, //30x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00, //40x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00, //50x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00, //60x00,0x40,0x40,0x40,0x4f,0x70,0x00,0x00, //70x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00, //80x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00, //90xff,0x81,0x81,0x81,0x81,0x81,0x81,0xff};uchar code xdat[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};uchar code ydat[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};uchar i=0,j=0,t=0,Num_Index,key,xi,yi;sbit we1=P1^1;sbit we2=P1^3;//主程序void main(){//P1=0x80;Num_Index=0; //从0 开始显示TMOD=0x01; //T0 方式0TH0=(65536-2000)/256; //2ms 定时TL0=(65536-2000)%256;IE=0x82;key=0;xi=0;yi=0;EX0=1;IT0=1;TR0=1; //启动T0while(1);}//T0 中断函数void ext_int0() interrupt 0{ key++; key&=0x03;}void LED_Screen_Display() interrupt 1{TH0=(65536-2000)/256; //2ms 定时TL0=(65536-2000)%256;switch(key){case 0: P0=0xff; we1=1; P0=~Table_of_Digits[Num_Index*8+i]; we1=0; P0=0xff; //输出位码和段码 we2=1; P0=xdat[i]; we2=0; if(++i==8) i=0; //每屏一个数字由8 个字节构成 if(++t==250) //每个数字刷新显示一段时间 { t=0; if(++Num_Index==10) Num_Index=0; //显示下一个数字 } break;case 1: we1=1; P0=~xdat[xi]; we1=0; we2=1; P0=ydat[yi]; we2=0; if(++t==250) //每个数字刷新显示一段时间 { t=0; yi++; if(yi>7){yi=0;xi++;} if(xi>7)xi=0; } break;case 2: we1=1; P0=0x00; we1=0; P0=0xff; //输出位码和段码 we2=1; P0=xdat[i]; we2=0; if(++t==250) //每个数字刷新显示一段时间 { if(++i==8) i=0; //每屏一个数字由8 个字节构成 t=0; } break;default: key=0; i=0; j=0; t=0; xi=0; yi=0; Num_Index=0; we1=1; P0=0xff; we1=0; we2=1; P1=0x80; we2=0; break;}}
跪求16X16LED点阵汉字显示的原理图,s51单片机汇编源程序,汉...
#include #include #include #include #include "math.h"#include #include #define uchar unsigned char#define uint unsigned int#define lcd_com XBYTE[0x8fff] // 定义液晶写命令的地址 1000 1111#define lcd_data XBYTE[0x87ff] // 定义液晶也数据的地址 1000 0111void delay(uint); //延时函数void check();//查忙程序void write_com(uchar);void write_data(uchar);void write_data_com(uchar,uchar);void write_data2_com(uchar,uchar,uchar);void init();//液晶初始化函数void show_point(uchar,uchar);//显示坐标为(x,y)的点uchar read_data();//读取屏幕当前地址的数据void init(){ uint i;write_com(0x9c);//显示开关设置write_com(0xa0);//光标形状设置write_com(0x80);//显示方式设置write_data2_com(0x00,0x00,0x40);write_data2_com(0x10,0x00,0x41); write_data2_com(0x00,0x04,0x42); //图形显示区首地址write_data2_com(0x10,0x00,0x43); //图形显示区宽度 write_data2_com(0x00,0x00,0x24); write_com(0xb0);for(i=0;i write_data(0);write_com(0xb2); write_data2_com(0x00,0x04,0x24); write_com(0xb0);for(i=0;i write_data(0x00);write_com(0xb2); write_data2_com(0,0x00,0x21);}void show_point(uchar x,uchar y)//显示坐标为(x,y)的点,左上角为(0,0),右下角为(127,63){uchar temp,temp_old;switch(x%8) {case 0: temp=0x80; break;case 1: temp=0x40; break;case 2: temp=0x20; break;case 3: temp=0x10; break;case 4: temp=0x08; break;case 5: temp=0x04; break;case 6: temp=0x02; break;case 7: temp=0x01; break; }write_data2_com(y%16*16+x/8,y/16+4,0x24); temp_old=read_data(); write_com(0xb0);write_data(temp|temp_old); write_com(0xb2);}uchar read_data()//读取屏幕当前地址的数据{ uchar temp; write_com(0xe0); write_com(0xc5); check(); temp=lcd_data; return temp;}void write_com(uchar my_com){check();lcd_com=my_com;}void write_data(uchar my_data){check();lcd_data=my_data;}void write_data_com(uchar my_data,uchar my_com){write_data(my_data);write_com(my_com);}void write_data2_com(uchar my_data_1,uchar my_data_2,uchar my_com){ write_data(my_data_1); write_data(my_data_2);write_com(my_com);}void check() //液晶查忙函数{uchar a;do{ a=lcd_com; a=a&0x03;}while(a!=0x03);}void delay(uint x) //延时函数{ uchar k; while(x--) { for(k=0;k {;} }}128*64点阵的,以前写的。
求keil C51完全破解版和单片机模拟仿真软件Proteus的下载地址
展开全部数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。
??① 静态显示驱动:静态驱动也称直流驱动。
静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。
静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5*8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢:),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。
??② 动态显示驱动:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
...
单片机 怎么控制点阵屏和LCD屏?
展开全部LED点阵屏和LCD屏的显示原理是不同的,LCD屏是自带的驱动芯片的,可以和单片机直接连接的。
而LED屏需要加驱动电路的,而且显示时也要采用动态扫描的方式的。
LCD屏显示汉字时,有的屏是自带字库的,不带字库的屏,就要用汉字取模软件取出显示的数据,即取出汉字的字模。
LED屏显示汉字,就必须用取模软件来取模了,不是自己像画画那样,那可画不起。
取模软件在网上可以下载的。
最后一个问题:LCD的集成电路去了当成点阵屏用吗?这是不可能的,一则LCD的集成电路是封装在PCB板上的,即软封装的,自己是用不了的,是不可能自己接线的。
二则,假如能接线,可是,LCD和LED显示原理不同,是根本不可能通用的。
举个例子吧,你能把你家的私家车挂在高铁的车头拉着跑吗?...
转载请注明出处51数据库 » c51点阵显示模拟软件