找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2978|回复: 2
打印 上一主题 下一主题
收起左侧

stm32f10 16x16点阵灯实现源码

[复制链接]
跳转到指定楼层
楼主
ID:284916 发表于 2018-7-24 11:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stm32f10 16x16点阵灯实现

单片机源程序如下:
  1. #include "stm32f10x.h"
  2. #include"system_stm32f10x.h"
  3. #include  "sys.h"
  4. #include"usart.h"
  5. #include"stm32f10x_rcc.h"
  6. #include  "delay.h"
  7. #include"led.h"
  8. #include"exti.h"
  9. #define R_port         PAout(8)
  10. #define D_port         PAout(7)
  11. #define C_port         PAout(6)
  12. #define B_port         PAout(5)
  13. #define A_port         PAout(4)
  14. #define G_port         PAout(3)
  15. #define DI_port        PAout(2)
  16. #define CLK_port       PAout(1)
  17. #define Latch_port     PAout(0)
  18. //#define   uint    unsigned int
  19. #define  _Nop()    _nop_()
  20. u8 r,p,q=0,x,y,flag,z=0;
  21. u8 i=0;
  22. u8 j=0; /*读取对应的高八位的第几位数据*/
  23. u8 k=0; /*读取对应的第八位的第几位数据*/
  24. u8  a[16]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
  25. u8  b[16]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};

  26. unsigned char tab[8];
  27. unsigned char DIS[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//行数据

  28. /*-----------------------------------------------
  29.              16x16汉字取模数据
  30. ------------------------------------------------*/
  31. unsigned char hztest[][32]=    //二维数组,目的是减少运算,可以用最基本的一维数组,每个汉字有32个字节数据
  32. {
  33. /*--  调入了一幅图像:C:\Users\shifang\Desktop\电池空.bmp  --*/
  34. /*--  宽度x高度=16x16  --*/
  35. 0x00,0x00,0xC0,0x03,0xF0,0x0F,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,
  36. 0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0xF0,0x0F,0x00,0x00,0x00,0x00,


  37. /*--  调入了一幅图像:C:\Users\shifang\Desktop\电池10%.bmp  --*/
  38. /*--  宽度x高度=16x16  --*/
  39. 0x00,0x00,0xC0,0x03,0xF0,0x0F,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,
  40. 0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0xF0,0x0F,0xF0,0x0F,0x00,0x00,0x00,0x00,

  41. /*--  调入了一幅图像:C:\Users\shifang\Desktop\电池20%.bmp  --*/
  42. /*--  宽度x高度=16x16  --*/
  43. 0x00,0x00,0xC0,0x03,0xF0,0x0F,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,
  44. 0x10,0x08,0x10,0x08,0x10,0x08,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0x00,0x00,0x00,0x00,

  45. /*--  调入了一幅图像:C:\Users\shifang\Desktop\电池40%.bmp  --*/
  46. /*--  宽度x高度=16x16  --*/
  47. 0x00,0x00,0xC0,0x03,0xF0,0x0F,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,
  48. 0x10,0x08,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0x00,0x00,0x00,0x00,

  49. /*--  调入了一幅图像:C:\Users\shifang\Desktop\电池60%.bmp  --*/
  50. /*--  宽度x高度=16x16  --*/
  51. 0x00,0x00,0xC0,0x03,0xF0,0x0F,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0xF0,0x0F,
  52. 0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0x00,0x00,0x00,0x00,

  53. /*--  调入了一幅图像:C:\Users\shifang\Desktop\电池80%.bmp  --*/
  54. /*--  宽度x高度=16x16  --*/
  55. 0x00,0x00,0xC0,0x03,0xF0,0x0F,0x10,0x08,0x10,0x08,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,
  56. 0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0x00,0x00,0x00,0x00,

  57. /*--  调入了一幅图像:C:\Users\shifang\Desktop\电池100%.bmp  --*/
  58. /*--  宽度x高度=16x16  --*/
  59. 0x00,0x00,0xC0,0x03,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,
  60. 0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0x00,0x00,0x00,0x00,
  61. };


  62. /*-----------------------------------------------
  63.              向595写入一个字节 单红色
  64. ------------------------------------------------*/
  65. void InputByteR( unsigned  char DataR1) //写一个字节
  66. {
  67. unsigned  char i;
  68. for(i=8; i>0; i--)
  69. {
  70. R_port = !(DataR1&0x01);                  
  71. CLK_port = 0;
  72. CLK_port = 1;
  73. DataR1 = DataR1 >> 1;
  74. }
  75. }
  76. /*-----------------------------------------------
  77.              向595写入一个字节 单绿色
  78. ------------------------------------------------*/
  79. void InputByteG( unsigned  char DataG1) //写一个字节
  80. {
  81. unsigned  char i;
  82. for(i=8; i>0; i--)
  83. {
  84. G_port = !(DataG1&0x01);                  
  85. CLK_port = 0;
  86. CLK_port = 1;
  87. DataG1 = DataG1 >> 1;
  88. }
  89. }
  90. /*-----------------------------------------------
  91.              向595写入两个字节 双色
  92. ------------------------------------------------*/
  93. void Input2Byte( unsigned  char DataR1,unsigned  char DataG1) //写一个字节
  94. {
  95. unsigned  char i;
  96. for(i=8; i>0; i--)
  97. {
  98. R_port = !(DataR1&0x01);   
  99. G_port = !(DataG1&0x01);               
  100. CLK_port = 0;
  101. CLK_port = 1;
  102. DataR1 = DataR1 >> 1;
  103. DataG1 = DataG1 >> 1;
  104. }
  105. }

  106. int main(void)
  107. {       
  108.            int cnt = 0 ;
  109.                 int a = 0 , b = 0 ;
  110.          
  111.         static unsigned char count,j;
  112.         unsigned char i;
  113.         static int num;
  114.         static unsigned char S_Flag=0;
  115.          
  116.         GPIO_InitTypeDef  GPIO_InitStructure;                                                                                                  

  117.         NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  118.         uart_init(9600);         //串口初始化为9600
  119.         delay_init();                     //延时函数初始化
  120.         LED_Init();       
  121.         EXTIX_Init();



  122.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOF, ENABLE);         //使能PA端口时钟
  123.        
  124.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;                                 
  125.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  126.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  127.   GPIO_Init(GPIOA, &GPIO_InitStructure);                                         //根据设定参数初始化

  128.   printf("\r\n %d \r\n",SystemCoreClock)        ;

  129.   while(1){
  130.        
  131.                
  132.                 if ( cnt % ( 1000*50 ) == 0 )
  133.                         a = 6-b % 7 ;
  134.                 cnt++ ;
  135.                 b++ ;
  136.                
  137.                
  138.                
  139.                 Latch_port=0;       //锁存释放
  140.    
  141.                
  142.                
  143.         for(j=0;j<1;j++) //取每个汉字的前2个字节,数据传输完成后锁存输出即可 j表示汉字个数,如果是3个汉字屏就可以修改成3
  144.         {
  145.                 if(S_Flag==0){
  146.                         Input2Byte(hztest[j+a][i],0);
  147.                         Input2Byte(hztest[j+a][i+1],0);
  148.                 }
  149.                 else if(S_Flag==1)
  150.                 {
  151.                         Input2Byte(0,hztest[j][i]);
  152.                         Input2Byte(0,hztest[j][i+1]);
  153.                 }
  154.                 else if(S_Flag==2)
  155.                 {
  156.                         Input2Byte(0,hztest[j+1][i]);
  157.                         Input2Byte(0,hztest[j+1][i+1]);
  158.                 }
  159.                 else if(S_Flag==3)
  160.                 {
  161.                         Input2Byte(hztest[j+1][i],0);
  162.                         Input2Byte(hztest[j+1][i+1],0);
  163.                 }
  164.         }
  165.         G_port = 1; /*关屏显示,原理为使HC138输出全为1,从而三极管截止,点阵不显示*/
  166.         R_port = 1;
  167.         switch (count){
  168.                 case 0:
  169.                         A_port = 0;        B_port = 0;        C_port = 0;        D_port = 0;
  170.                         break;
  171.                 case 1:
  172.                         A_port = 1;        B_port = 0;        C_port = 0;        D_port = 0;
  173.                         break;
  174.                 case 2:
  175.                         A_port = 0;        B_port = 1;        C_port = 0;        D_port = 0;
  176.                         break;
  177.                 case 3:
  178.                         A_port = 1;        B_port = 1;        C_port = 0;        D_port = 0;
  179.                         break;
  180.                 case 4:
  181.                         A_port = 0;        B_port = 0;        C_port = 1;        D_port = 0;
  182.                         break;
  183.                 case 5:
  184.                         A_port = 1;        B_port = 0;        C_port = 1;        D_port = 0;
  185.                         break;
  186.                 case 6:
  187.                         A_port = 0;        B_port = 1;        C_port = 1;        D_port = 0;
  188.                         break;
  189.                 case 7:
  190.                         A_port = 1;        B_port = 1;        C_port = 1;        D_port = 0;
  191.                         break;
  192.                 case 8:
  193.                         A_port = 0;        B_port = 0;        C_port = 0;        D_port = 1;
  194.                         break;
  195.                 case 9:
  196.                         A_port = 1;        B_port = 0;        C_port = 0;        D_port = 1;
  197.                         break;
  198.                 case 10:
  199.                         A_port = 0;        B_port = 1;        C_port = 0;        D_port = 1;
  200.                         break;
  201.                 case 11:
  202.                         A_port = 1;        B_port = 1;        C_port = 0;        D_port = 1;
  203.                         break;
  204.                 case 12:
  205.                         A_port = 0;        B_port = 0;        C_port = 1;        D_port = 1;
  206.                         break;
  207.                 case 13:
  208.                         A_port = 1;        B_port = 0;        C_port = 1;        D_port = 1;
  209.                         break;
  210.                 case 14:
  211.                         A_port = 0;        B_port = 1;        C_port = 1;        D_port = 1;
  212.                         break;
  213.                 case 15:
  214.                         A_port = 1;        B_port = 1;        C_port = 1;        D_port = 1;
  215.                         break;
  216.                 }
  217.         Latch_port = 1; /*允许HC595数据输出到Q1-Q8端口*/
  218.         G_port = 0; /*HC138输出有效,打开显示*/
  219.         R_port = 0;
  220.         Latch_port = 0;        /*锁定HC595数据输出*/
  221.        
  222.        
  223.         count++;
  224.         i+=2;              //累加调用下一行数据
  225.         if(count==16)
  226.                 count=0;
  227.         if(i==32)
  228.                 i=0;
  229.   }
  230.   
  231. }

复制代码

所有资料51hei提供下载:
stm32f10 16x16点阵灯.rar (283.1 KB, 下载次数: 65)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-7-25 01:30 | 只看该作者
此贴需要补全原理图后才可获得积分
回复

使用道具 举报

板凳
ID:405123 发表于 2019-11-22 21:14 | 只看该作者
可不可以改成流动字体 或者改颜色要怎么改啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表