加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

8x8点阵实现在程序代码中画出你想要的图形!

(2011-12-01 09:01:30)
标签:

单片机

at89s52

8x8

点阵

程序

keil

led

io

函数

锁存器

16进制

2进制

10进制

分类: 单片机
   玩过单片机的大家,肯定知道对I/O口的控制可以通过对寄存器用16进制的两位数进行控制,
比如让接在P1口的一排LED灯第一个亮其他不亮只需要用keil编写代码P1=0x01(00000001)或者P1=1(转换成十进制的数的1)即可,
又比如让第二和第七个亮则P1=0x42(01000010)或者P1=66(转换成十进制的数66),这样就可以让给我么想要的灯亮了,但是这样写很麻烦,即使自己已经很熟悉了还是觉得不舒服,那怎么办呢?
我们又可以用sbit将指定的I/O定义为我们想要的字符,比如sbit P11=P1^1,这样呢我们就能直接操作P11的值来控制P1的一号口的电平了,但是这个对于操作点阵还是没什么实质性的作用。
然后我确实不想每次都去打十六进制的代码来操作图像,所以就想把8x8点阵的图像存在一个8x8的数组里面
数组画成什么样子,则显示成什么样子
           char code xy[8][8]=
  {{0,0,1,1,1,1,0,0,0},
   {0,0,1,0,0,0,0,0,0},
   {0,0,1,0,0,0,0,0,0},   
   {0,0,1,1,1,1,0,0,0},
   {0,0,0,0,0,1,0,0,0},
   {0,0,0,0,0,1,0,0,0},
   {0,0,0,0,0,1,0,0,0},
   {0,0,1,1,1,1,0,0,0}};
0代表不显示,1代表显示,则我们可以直接通过数组画出自己想的图形,然后图形的移动变换什么的,也可以通过直接增加数组的维数实现移动,这个我想我不说大家也知道了吧!
然后有一段关键的代码就是(我用了锁存器,所以只用了8个I\O口)
    char xx[8]={0,0,0,0,0,0,0,0};
    char yy[8]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};(这行代码主要是利用锁存器控制在哪一行显示,然后扫描)
unsigned int ncifang(unsigned int n)
{
    unsigned int i,a=1;
for(i=1;i<=n;i++)
  a=a*2;
return a;
}(这是下面代码所要用到的函数,把存在xy[]数组里的图形变成十进制数存进xx[],然后就可以显示啦)
        for(i=0;i<=7;i++)
   for(j=0;j<=7;j++)
  xx[i]= xx[i]+xy[i][j]*ncifang(j); 

大概的就介绍到这里,可能写的不够清楚,有什么我写的不清楚或者大家有问题的地方欢迎询问啊
PS:本人刚学单片机不久,水平不咋的,希望指教!

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有