stm32f10 16x16点阵灯实现
单片机源程序如下:
- #include "stm32f10x.h"
- #include"system_stm32f10x.h"
- #include "sys.h"
- #include"usart.h"
- #include"stm32f10x_rcc.h"
- #include "delay.h"
- #include"led.h"
- #include"exti.h"
- #define R_port PAout(8)
- #define D_port PAout(7)
- #define C_port PAout(6)
- #define B_port PAout(5)
- #define A_port PAout(4)
- #define G_port PAout(3)
- #define DI_port PAout(2)
- #define CLK_port PAout(1)
- #define Latch_port PAout(0)
- //#define uint unsigned int
- #define _Nop() _nop_()
- u8 r,p,q=0,x,y,flag,z=0;
- u8 i=0;
- u8 j=0; /*读取对应的高八位的第几位数据*/
- u8 k=0; /*读取对应的第八位的第几位数据*/
- u8 a[16]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
- u8 b[16]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
- unsigned char tab[8];
- unsigned char DIS[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//行数据
- /*-----------------------------------------------
- 16x16汉字取模数据
- ------------------------------------------------*/
- unsigned char hztest[][32]= //二维数组,目的是减少运算,可以用最基本的一维数组,每个汉字有32个字节数据
- {
- /*-- 调入了一幅图像:C:\Users\shifang\Desktop\电池空.bmp --*/
- /*-- 宽度x高度=16x16 --*/
- 0x00,0x00,0xC0,0x03,0xF0,0x0F,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,
- 0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0xF0,0x0F,0x00,0x00,0x00,0x00,
- /*-- 调入了一幅图像:C:\Users\shifang\Desktop\电池10%.bmp --*/
- /*-- 宽度x高度=16x16 --*/
- 0x00,0x00,0xC0,0x03,0xF0,0x0F,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,
- 0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0xF0,0x0F,0xF0,0x0F,0x00,0x00,0x00,0x00,
- /*-- 调入了一幅图像:C:\Users\shifang\Desktop\电池20%.bmp --*/
- /*-- 宽度x高度=16x16 --*/
- 0x00,0x00,0xC0,0x03,0xF0,0x0F,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,
- 0x10,0x08,0x10,0x08,0x10,0x08,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0x00,0x00,0x00,0x00,
- /*-- 调入了一幅图像:C:\Users\shifang\Desktop\电池40%.bmp --*/
- /*-- 宽度x高度=16x16 --*/
- 0x00,0x00,0xC0,0x03,0xF0,0x0F,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,
- 0x10,0x08,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0x00,0x00,0x00,0x00,
- /*-- 调入了一幅图像:C:\Users\shifang\Desktop\电池60%.bmp --*/
- /*-- 宽度x高度=16x16 --*/
- 0x00,0x00,0xC0,0x03,0xF0,0x0F,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0xF0,0x0F,
- 0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0x00,0x00,0x00,0x00,
- /*-- 调入了一幅图像:C:\Users\shifang\Desktop\电池80%.bmp --*/
- /*-- 宽度x高度=16x16 --*/
- 0x00,0x00,0xC0,0x03,0xF0,0x0F,0x10,0x08,0x10,0x08,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,
- 0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0x00,0x00,0x00,0x00,
- /*-- 调入了一幅图像:C:\Users\shifang\Desktop\电池100%.bmp --*/
- /*-- 宽度x高度=16x16 --*/
- 0x00,0x00,0xC0,0x03,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,
- 0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0x00,0x00,0x00,0x00,
- };
- /*-----------------------------------------------
- 向595写入一个字节 单红色
- ------------------------------------------------*/
- void InputByteR( unsigned char DataR1) //写一个字节
- {
- unsigned char i;
- for(i=8; i>0; i--)
- {
- R_port = !(DataR1&0x01);
- CLK_port = 0;
- CLK_port = 1;
- DataR1 = DataR1 >> 1;
- }
- }
- /*-----------------------------------------------
- 向595写入一个字节 单绿色
- ------------------------------------------------*/
- void InputByteG( unsigned char DataG1) //写一个字节
- {
- unsigned char i;
- for(i=8; i>0; i--)
- {
- G_port = !(DataG1&0x01);
- CLK_port = 0;
- CLK_port = 1;
- DataG1 = DataG1 >> 1;
- }
- }
- /*-----------------------------------------------
- 向595写入两个字节 双色
- ------------------------------------------------*/
- void Input2Byte( unsigned char DataR1,unsigned char DataG1) //写一个字节
- {
- unsigned char i;
- for(i=8; i>0; i--)
- {
- R_port = !(DataR1&0x01);
- G_port = !(DataG1&0x01);
- CLK_port = 0;
- CLK_port = 1;
- DataR1 = DataR1 >> 1;
- DataG1 = DataG1 >> 1;
- }
- }
-
- int main(void)
- {
- int cnt = 0 ;
- int a = 0 , b = 0 ;
-
- static unsigned char count,j;
- unsigned char i;
- static int num;
- static unsigned char S_Flag=0;
-
- GPIO_InitTypeDef GPIO_InitStructure;
- NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
- uart_init(9600); //串口初始化为9600
- delay_init(); //延时函数初始化
- LED_Init();
- EXTIX_Init();
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOF, ENABLE); //使能PA端口时钟
-
- 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;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
- GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化
- printf("\r\n %d \r\n",SystemCoreClock) ;
-
- while(1){
-
-
- if ( cnt % ( 1000*50 ) == 0 )
- a = 6-b % 7 ;
- cnt++ ;
- b++ ;
-
-
-
- Latch_port=0; //锁存释放
-
-
-
- for(j=0;j<1;j++) //取每个汉字的前2个字节,数据传输完成后锁存输出即可 j表示汉字个数,如果是3个汉字屏就可以修改成3
- {
- if(S_Flag==0){
- Input2Byte(hztest[j+a][i],0);
- Input2Byte(hztest[j+a][i+1],0);
- }
- else if(S_Flag==1)
- {
- Input2Byte(0,hztest[j][i]);
- Input2Byte(0,hztest[j][i+1]);
- }
- else if(S_Flag==2)
- {
- Input2Byte(0,hztest[j+1][i]);
- Input2Byte(0,hztest[j+1][i+1]);
- }
- else if(S_Flag==3)
- {
- Input2Byte(hztest[j+1][i],0);
- Input2Byte(hztest[j+1][i+1],0);
- }
- }
- G_port = 1; /*关屏显示,原理为使HC138输出全为1,从而三极管截止,点阵不显示*/
- R_port = 1;
- switch (count){
- case 0:
- A_port = 0; B_port = 0; C_port = 0; D_port = 0;
- break;
- case 1:
- A_port = 1; B_port = 0; C_port = 0; D_port = 0;
- break;
- case 2:
- A_port = 0; B_port = 1; C_port = 0; D_port = 0;
- break;
- case 3:
- A_port = 1; B_port = 1; C_port = 0; D_port = 0;
- break;
- case 4:
- A_port = 0; B_port = 0; C_port = 1; D_port = 0;
- break;
- case 5:
- A_port = 1; B_port = 0; C_port = 1; D_port = 0;
- break;
- case 6:
- A_port = 0; B_port = 1; C_port = 1; D_port = 0;
- break;
- case 7:
- A_port = 1; B_port = 1; C_port = 1; D_port = 0;
- break;
- case 8:
- A_port = 0; B_port = 0; C_port = 0; D_port = 1;
- break;
- case 9:
- A_port = 1; B_port = 0; C_port = 0; D_port = 1;
- break;
- case 10:
- A_port = 0; B_port = 1; C_port = 0; D_port = 1;
- break;
- case 11:
- A_port = 1; B_port = 1; C_port = 0; D_port = 1;
- break;
- case 12:
- A_port = 0; B_port = 0; C_port = 1; D_port = 1;
- break;
- case 13:
- A_port = 1; B_port = 0; C_port = 1; D_port = 1;
- break;
- case 14:
- A_port = 0; B_port = 1; C_port = 1; D_port = 1;
- break;
- case 15:
- A_port = 1; B_port = 1; C_port = 1; D_port = 1;
- break;
- }
- Latch_port = 1; /*允许HC595数据输出到Q1-Q8端口*/
- G_port = 0; /*HC138输出有效,打开显示*/
- R_port = 0;
- Latch_port = 0; /*锁定HC595数据输出*/
-
-
- count++;
- i+=2; //累加调用下一行数据
- if(count==16)
- count=0;
- if(i==32)
- i=0;
- }
-
- }
复制代码
所有资料51hei提供下载:
stm32f10 16x16点阵灯.rar
(283.1 KB, 下载次数: 65)
|