单片机 8*8点阵C51程序

单片机 8*8点阵C51程序,第1张

一.基于51的点阵屏显示:(1)点亮第一个8*8点阵:

1.首先在Proteus下选择我们需要的元件,AT89C51、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点阵屏显示*****************/

#include<reg51.h>

void delay(int z) //延时函数

{

int x,y

for(x=0x<zx++)

for(y=0y<110y++)

}

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点阵的奇数行偶数列的点点亮的功能。重点让我们看while循环内,首先是行选P3=0,此时38译码器的输入端为000,则输出端为01111111,即B0端为低电平,此时选中了点阵屏的第一行,接着列选我们给P2口赋0x55,即01010101,此时又选中了偶数列,紧接着延时。然后分别对第三、五、七行进行相同的列选。这样就点亮了此点阵屏奇数行偶数列交叉的点。

完成这个程序,我们会发现其实点阵屏的原理是如此简单,和数码管的动态显示非常相似,只不过换了一种方式而已。

对不起啦,我传了三次图片都没传上,郁闷哪!希望你能理解哈! 不过我有传一份WORD文档在我的空间里面

用Java语言画的点阵渐开线代码如下

import java.awt.Graphics

import java.util.ArrayList

import java.util.List

import javax.swing.JFrame

public class Involute extends JFrame{

 Involute(){

  super("点阵渐开线")

  setSize(400, 400)

  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

  setLocationRelativeTo(null)

  setVisible(true)

 }

 public void paint(Graphics g){

  super.paint(g)

  double alfa=10

  double r=10

  double theta=0

  List<Integer> lx=new ArrayList<Integer>()

  List<Integer> ly=new ArrayList<Integer>()

  int CenterX=this.getWidth()/2 

  int CenterY=this.getHeight()/2

  for(int i=0i<60*2i++){

   int x=CenterX+(int)(r*Math.cos((theta+alfa)*Math.PI/180)+(theta+alfa)*Math.PI/180*r*Math.sin((theta+alfa)*Math.PI/180))

   lx.add(x)

   int y=CenterY-(int)(r*Math.sin((theta+alfa)*Math.PI/180)-(theta+alfa)*Math.PI/180*r*Math.cos((theta+alfa)*Math.PI/180))

   ly.add(y)

   theta=theta+6

  }

  for(int i=0i<60*2i++){

   g.fillOval(lx.get(i), ly.get(i), 5, 5)

  }

 }

 public static void main(String[] args) {

  new Involute()

 }

}

运行结果

#include <reg52.h>

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=0ADDR1=0ADDR0=0i++P0=image[index][0]break

case 1: ADDR2=0ADDR1=0ADDR0=1i++P0=image[index][1]break

case 2: ADDR2=0ADDR1=1ADDR0=0i++P0=image[index][2]break

case 3: ADDR2=0ADDR1=1ADDR0=1i++P0=image[index][3]break

case 4: ADDR2=1ADDR1=0ADDR0=0i++P0=image[index][4]break

case 5: ADDR2=1ADDR1=0ADDR0=1i++P0=image[index][5]break

case 6: ADDR2=1ADDR1=1ADDR0=0i++P0=image[index][6]break

case 7: ADDR2=1ADDR1=1ADDR0=1i=0P0=image[index][7]break

default: break

}

//以下代码完成每秒改变一帧图像

tmr++

if (tmr >= 1000) //达到1000ms时改变一次图片索引

{

tmr = 0

if (index == 0) //图片索引10~0循环

index = 10

else

index--

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12082739.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存