标题: 单片机8*8LED点阵—显示汉字实验 [打印本页]

作者: jhgvj    时间: 2019-1-15 18:47
标题: 单片机8*8LED点阵—显示汉字实验
一、读懂代码

因为自身C语言基础比较差,所以决定先把代码看懂然后再在源代码的基础上修改写成自己的点阵显示。
自己对代码的简短理解都写成注释附在下面的源代码中了,有不对的地方请指正
  1. 实现现象:下载程序后点阵上显示数字0
  2.             
  3. 注意事项:一定要将JOE短接片短接到GND端,如果不需要595后面的小灯点亮可以拔掉JP595短接片。                                                                              
  4. ***************************************************************************************/

  5. #include "reg51.h"           //此文件中定义了单片机的一些特殊功能寄存器
  6. #include<intrins.h>

  7. typedef unsigned int u16;     //对数据类型进行声明定义
  8. typedef unsigned char u8;

  9. sbit SRCLK=P3^6;//用SRCLK来表示P3口的第六位
  10. sbit RCLK=P3^5;//用RCLK来表示P3口的第五位
  11. sbit SER=P3^4;//用SER来表示P3口的第四位
  12. //SRCLK、RCLK、SER都是下面程序用到的的芯片74hc595中的引脚的名称,想对芯片进一步了解的同学可以看一下代码后面附的链接

  13. u8 ledduan[]={0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00};
  14. u8 ledwei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
  15. //二极管点亮的的条件是对应行列分别为高低电平使得电流产生。
  16. //对应本实验实验板即为列线为高电平,行线为低电平时二极管被点亮
  17. //第一行代码控制哪列为高电平即为需要此列是否点亮,第二行控制哪一行为低电平,即某一行被点亮,行列共同点亮时交叉处LED亮灯
  18. //实验板的原理图因为自己看不懂所以这里的行列可能混了【手动狗头】对这个比较清楚的同学可以帮给我指正一下,谢谢。
  19. /*******************************************************************************
  20. * 函 数 名         : delay
  21. * 函数功能         : 延时函数,i=1时,大约延时10us
  22. 死循环实现延时功能
  23. *******************************************************************************/
  24. void delay(u16 i)
  25. {
  26.     while(i--);
  27. }

  28. /*******************************************************************************
  29. * 函数名         : Hc595SendByte(u8 dat)
  30. * 函数功能         : 向74HC595发送一个字节的数据
  31. * 输入           : 无
  32. * 输出             : 无
  33. 将一个字节的信息串行输入给74HC595以后由芯片并行输出
  34. *******************************************************************************/
  35. void Hc595SendByte(u8 dat)
  36. {
  37.     u8 a;
  38.     SRCLK=0;
  39.     RCLK=0;
  40.     for(a=0;a<8;a++)
  41.     {
  42.         SER=dat>>7;
  43.         dat<<=1;

  44.         SRCLK=1;
  45.         _nop_();
  46.         _nop_();
  47.         SRCLK=0;   
  48.     }

  49.     RCLK=1;
  50.     _nop_();
  51.     _nop_();
  52.     RCLK=0;
  53. }

  54. /*******************************************************************************
  55. * 函 数 名       : main
  56. * 函数功能       : 主函数
  57. * 输    入       : 无
  58. * 输    出         : 无
  59. *******************************************************************************/
  60. void main()
  61. {           
  62.     u8 i;
  63.     while(1)//轮回点亮循环体
  64.     {
  65.         P0=0x7f;
  66.         for(i=0;i<8;i++)
  67.         {
  68.             P0=ledwei[i];         //位选
  69.             Hc595SendByte(ledduan[i]);  //发送段选数据
  70.             delay(100);        //延时
  71.             Hc595SendByte(0x00);  //消隐,如果的话点阵显示时会出现重影现象
  72.         }   
  73.     }      
  74. }
复制代码

74HC595芯片资料:http://www.51hei.com/chip/3978.html
二、修改代码

理解代码以后我们对代码进行修改来实现自己的点阵显示。
因为对亮度和别的指标没有要求,所以只需要修改和字符显示的这一段就可以啦

u8 ledduan[]={0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00};

我要显示的是佐字,对应的代码经过推断


所以代码修改为

u8 ledduan[]={0x20,0x7f,0xd0,0x71,0x51,0xdf,0x51,0x51};

三、烧录

将代码编译形成新的hex文件后下载到实验板上就OK啦,当然前提是你没有像我一样忘记JOE短接片短接到GND端



作者: yasi666    时间: 2019-1-26 21:07
真详细,好好学习
作者: 单片机菜鸟求助    时间: 2019-3-3 19:13
菜鸟求救:段和位不是应该一块修改吗我想要一下就是“佐”字的位代码
作者: 仙人抚我顶    时间: 2020-2-7 01:25
能麻烦问问怎么JOE短接片短接到GND端吗?本人小白刚入手,不会啊,球球大佬捞一把!!

作者: moshu_    时间: 2020-2-7 09:48
什么型号的开发板
作者: 原力    时间: 2020-2-15 20:52
如果用138和595控制怎么写
作者: 夏一    时间: 2020-2-21 14:14
moshu_ 发表于 2020-2-7 09:48
什么型号的开发板

我也有两块2.0的
作者: hbcqd    时间: 2020-2-21 21:10
这么的学习例程,谢谢分享
作者: 起个名字真难a    时间: 2020-3-16 21:34
原力 发表于 2020-2-15 20:52
如果用138和595控制怎么写

我也想知道
作者: diyang    时间: 2020-5-12 16:49
仙人抚我顶 发表于 2020-2-7 01:25
能麻烦问问怎么JOE短接片短接到GND端吗?本人小白刚入手,不会啊,球球大佬捞一把!!

拔下来

作者: like1234456    时间: 2021-8-1 13:52
仙人抚我顶 发表于 2020-2-7 01:25
能麻烦问问怎么JOE短接片短接到GND端吗?本人小白刚入手,不会啊,球球大佬捞一把!!

单片机上面应该自带有短接板
作者: qianhuan    时间: 2022-6-8 12:41
单片机点阵文字是固定的,还是每种单片机都不同




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1