#include<reg51.h> unsigned char code table[5][32]={ //郑 {0X00,0XD8,0XDF,0XDF,0XFF,0XFC,0XFF,0XDF,0XDF,0XDF,0XD8,0X37,0XFF,0XFF,0XA7,0XFF, 0XFF,0X00,0X31,0X7D,0X3F,0X1F,0X0F,0X1F,0X3D,0X3D,0X11,0X2E,0X7F,0X73,0XF6,0X0F}, //苏 {0X00,0X06,0X46,0XE6,0XE6,0XEF,0XEF,0XF7,0XFA,0XFA,0XF6,0XEF,0XEF,0X6F,0XE6,0X86, 0X00,0X06,0X77,0X77,0X7B,0X3D,0X1E,0X1F,0X2F,0X33,0X70,0X7F,0X7E,0X3D,0X07,0X0F}, //雨 {0X02,0XF7,0XF7,0X17,0X57,0XF7,0XFF,0XFF,0XFF,0X1F,0XD7,0XF7,0XF7,0XF7,0XF7,0XF7, 0X00,0X7F,0X7F,0X71,0X36,0X0E,0X2F,0X7E,0X7F,0X31,0X06,0X6E,0X6F,0X7F,0X7F,0X7F}, //图形1 {0x00,0x00,0x7E,0xC2,0x32,0x32,0x02,0x32,0x32,0x3A,0x04,0x0C,0xF8,0x00,0x00,0x00, 0x04,0x06,0xC2,0x63,0x63,0x7E,0x67,0x67,0xC5,0xCD,0x09,0x19,0x01,0x00,0x00,0x00}, {0x08,0xDE,0x56,0x56,0x5C,0xC8,0x80,0x80,0x00,0x00,0x18,0x1C,0x96,0x92,0x1F,0x00, 0x00,0x07,0x04,0x0C,0x08,0x1F,0x10,0x11,0x1F,0x31,0x33,0x1B,0x0D,0x07,0x00,0x00} }; //延时1000+1us 函数定义 void delay1(void) { unsigned char i, j; for(i = 199; i > 0; i--) for(j = 1; j > 0; j--); } void main(void) { unsigned char i, n, m; unsigned int col = 0x0001; while(1) { for(m = 255; m > 0; m--) { P0 = table[n][i]; P2 = table[n][16+i]; P1 = ~(col & 0xff); P3 = ~(col >> 8); delay1();delay1(); P1 = 0xff; P3 = 0xff; col <<= 1; i++; if(i == 16) { i = 0; col = 0x0001; } } n++; if(n == 5) {n = 0;} } }详细讲一遍
时间: 2023-09-26 20:05:27 浏览: 47
这是一段基于51单片机的LED点阵控制程序,使用了一个二维数组来存储五个字符的点阵图形。
程序的主要逻辑如下:
1. 定义一个二维数组`table`,用来存储五个字符的点阵图形。
2. 定义一个延时函数`delay1()`,用来控制每个字符的显示时间。
3. 在主函数中定义三个变量:`i`、`n`和`m`。其中,`i`表示在点阵中显示的当前字符的列,初始值为0;`n`表示当前显示的字符的序号,初始值为0;`m`表示每个字符显示的时间,初始值为255。
4. 在一个无限循环中,先将点阵中的当前列`i`的值设置为二维数组`table`中的第`n`个字符的第`i`列的值,然后将点阵中的第16列的值设置为二维数组`table`中的第`n`个字符的第`i+16`列的值。接着,将当前行的控制信号设置为`col`的低8位的反码,将当前列的控制信号设置为`col`的高8位的反码,通过延时函数控制当前字符的显示时间,最后将控制信号设置为全高电平。
5. 将`col`左移一位,并将`i`加1。如果`i`等于16,则将`i`重置为0,将`col`重置为0x0001。
6. 将`n`加1。如果`n`等于5,则将`n`重置为0。
7. 循环执行以上步骤,实现五个字符的循环显示。
相关问题
#include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int uchar temp,t0,n,t1,qian,bai,shi,ge; //char最大只能装256 uchar code table[]={0xc0,0xf9,0xa4, 0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8c,0x7f,0xff}; uint shu; void display(uchar qian,uchar bai,uchar shi,uchar ge); void delay(uint z); void init(); void main() { init(); while(1) { } } void init()//初始化函数 { shu=432; temp=0xfe; P1=temp; TMOD=0x11; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TH1=(65536-50000)/256; TL1=(65536-50000)%256; TH1=0xd8; TL1=0xf0; EA=1; ET0=1; ET1=1; TR1=1; TR0=1;//控制流水灯 } void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; t0++; if(t0==20) { t0=0; temp=_crol_(temp,1); P1=temp; } } void timer1() interrupt 3 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; t1++; if(t1==20) { t1=0; bai=shu/100; shi=shu%100/10; ge=shu%10; qian=0; display(qian,bai,shi,ge); shu--; if(shu==0) { TR0=0; TR1=0; P1=0xff; } } } void display(uchar qian,uchar bai,uchar shi,uchar ge)//定义三个变量 { P0=0xff; P2=0xf7;// 1111 1011 P0=table[qian]; delay(5); P0=0xff; P2=0xfb;// 1111 1011 P0=table[bai]; delay(5); P0=0xff; P0=table[shi]; P2=0xfd; // 1111 1101 delay(5); P0=0xff; P0=table[ge]; P2=0xfe; // 1111 1110 delay(5); } void delay(uint z)//可以带参数 { uint x,y; for(x=z;x>0;x--) { for(y=113;y>0;y--) { } } } 、
这段代码是一个基于8051单片机的数字倒计时程序。它使用了两个定时器来控制流水灯的显示和倒计时功能。具体的功能如下:
1. 引入头文件reg52.h和intrins.h,定义了一些宏和全局变量。
2. 定义了一个数码管显示的编码表table[],其中存储了0-9和一些特殊字符的编码。
3. 定义了一个显示函数display(),用来控制数码管的显示。
4. 定义了一个延时函数delay(),用来产生一定的延时。
5. 定义了一个初始化函数init(),用来初始化各个寄存器和定时器。
6. 在主函数中,调用了初始化函数,并进入一个无限循环。
在定时器0中断函数timer0()中,通过改变P1口的值来实现流水灯效果。
在定时器1中断函数timer1()中,首先计算出百位、十位和个位数,并调用display()函数进行数码管显示。然后将倒计时数shu减1,如果倒计时数为0,则关闭定时器0和定时器1,并将P1口置为全高电平。
整个程序的功能是实现一个倒计时功能,通过数码管显示倒计时的时间。
#include <reg52.h> unsigned char *p1,*p2,*p3,*p4,*p5; unsigned char k; sbit right = P0^0; sbit left = P0^1; unsigned char code table[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f}; unsigned char code decode[][16]={ {0x00,0x00,0x00,0x06,0x06,0x0F,0x02,0x3F,0x0C,0x1E,0x3F,0x62,0xC0,0x00,0x00,0x00}, {0x00,0x00,0x00,0x6F,0xD9,0xFB,0x16,0xFE,0x26,0x66,0x64,0xD8,0xC0,0x00,0x00,0x00},/*"郑",0*/ {0x00,0x00,0x00,0x01,0x0F,0x03,0x00,0x1F,0x03,0x32,0x6C,0x18,0x63,0x00,0x00,0x00}, {0x00,0x00,0x00,0x84,0xFF,0x08,0x80,0xF8,0x1C,0x34,0x34,0x60,0xC0,0x00,0x00,0x00},/*"苏",1*/ {0x00,0x00,0x00,0x0F,0x00,0x0F,0x18,0x1E,0x37,0x31,0x29,0x7F,0x43,0x00,0x00,0x00}, {0x00,0x00,0x00,0xFF,0x60,0xFF,0xC3,0xF6,0xFE,0xAC,0xFC,0x18,0x70,0x00,0x00,0x00},/*"雨",2*/ {0x00,0x00,0x00,0x07,0x06,0x0F,0x0C,0x0F,0x00,0x7F,0x01,0x03,0x03,0x00,0x00,0x00}, {0x00,0x00,0x00,0xFF,0x03,0xFE,0x06,0xFC,0xC0,0xFE,0x80,0x00,0x00,0x00,0x00,0x00},/*"早",3*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x03,0x03,0xFF,0x00,0x00,0x00}, {0x00,0x00,0x00,0x60,0x60,0xE0,0xC0,0xFE,0x80,0x80,0x00,0x00,0xF8,0x00,0x00,0x00},/*"上",4*/ {0x00,0x00,0x00,0x03,0x06,0x1F,0x0D,0x1B,0x36,0x1C,0x1C,0x76,0xC1,0x00,0x00,0x00}, {0x00,0x00,0x00,0x1F,0x03,0x86,0x8C,0xFF,0x18,0x30,0x30,0x60,0xC0,0x00,0x00,0x00},/*"好",5*/ {0x00,0x00,0x00,0x00,0x0F,0x0B,0x1A,0x1F,0x35,0x2D,0x7A,0x63,0x04,0x00,0x00,0x00}, {0x00,0x00,0x00,0x18,0x7F,0xC6,0xFF,0xB2,0xFE,0x70,0xA6,0x64,0x78,0x00,0x00,0x00},/*"晚",6*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x03,0x03,0xFF,0x00,0x00,0x00}, {0x00,0x00,0x00,0x60,0x60,0xE0,0xC0,0xFE,0x80,0x80,0x00,0x00,0xF8,0x00,0x00,0x00},/*"上",7*/ {0x00,0x00,0x00,0x03,0x06,0x1F,0x0D,0x1B,0x36,0x1C,0x1C,0x76,0xC1,0x00,0x00,0x00}, {0x00,0x00,0x00,0x1F,0x03,0x86,0x8C,0xFF,0x18,0x30,0x30,0x60,0xC0,0x00,0x00,0x00},/*"好",8*/ }; void writetwochar(unsigned char,unsigned char,unsigned char,unsigned char,unsigned char); void delay(int); void main() { int originaladd,total; unsigned char i,j; originaladd=&decode[0][0]; total=sizeof(decode); p1=&decode[0][0]; p2=&decode[1][0]; p3=&decode[2][0]; p4=&decode[3][0]; p5=&decode[4][0]; while(1) { for(k=0;k<8;k++) { for(j=0;j<2;j++) { for(i=0;i<16;i++) { P2=table[i]; writetwochar(*(p5+i),*(p4+i),*(p3+i),*(p2+i),*(p1+i)); delay(10); } } } p1=p2;p2=p3;p3=p4;p4=p5;p5=p5+16; if(p5-originaladd==total) p5=&decode[0][0]; } }
这段代码是一个基于51单片机的LED点阵显示程序,可以循环显示一组预先定义好的汉字。主要的变量包括 `p1` 到 `p5`,这些变量是指向一个二维数组 `decode` 中各个汉字的指针,每个汉字占据二维数组中的一行。变量 `k` 用于循环计数,变量 `i` 和 `j` 用于遍历二维数组中的元素。
程序的主循环通过遍历二维数组 `decode` 中的元素,将每个汉字的点阵模式显示在LED点阵上。每个汉字占据LED点阵的两个行,因此在循环中需要进行两次显示。同时,程序还实现了一个循环队列,通过不断更新 `p1` 到 `p5` 的指向,实现了汉字的循环显示。
函数 `writetwochar` 用于将一个汉字的两行点阵模式写入到LED点阵上,函数 `delay` 用于实现延时效果。
需要注意的是,这段代码的具体实现可能与不同的硬件环境有关,因此需要根据具体的硬件环境进行相应的修改和调试。
相关推荐
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)