2016-08-14 16:29:54 qq_32173789 阅读数 538
  • LED点阵-第1季第8部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第8个课程,讲解了16*16LED点阵的驱动方式和文字显示。本课程的学习目标是理解点阵式LED屏幕的驱动方式、74HC595的时序和编程等。

    2252 人正在学习 去看看 朱有鹏

感谢大熙熙 对51单片机点阵代码的详细分析

http://www.cnblogs.com/one-meter/p/4188277.html

网址阐述了他对代码的解析


不过部分代码解析不够透彻

我融入了个人对代码的理解

并且做了详细的解析


代码参考了普中给的代码

网上代码很多可以自己下载测试


代码如下



 #include <reg52.h>
 #include <intrins.h>


//重定义 函数变量
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
 //spi 所使用的 3个管脚 并进行定义


sbit MOSIO =P3^4;
sbit R_CLK =P3^5;
sbit S_CLK =P3^6;


//--点阵显示数组--//
uchar code tab0[] = {0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08,
 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80,
 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00,
 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00}; 
//--10字模--//
uchar code tab1[] = 
{0, 0, 0, 0, 0, 0, 8, 24, 14, 36, 8, 66, 8, 66, 8, 66, 
 8, 66, 8, 66, 8, 66, 8, 36, 62, 24, 0, 0, 0, 0, 0, 0};


//--09字模--//
uchar code tab2[] = 
{0, 0, 0, 0, 0, 0, 24, 24, 36, 36, 66, 66, 66, 66, 66,
 66, 66, 100, 66, 88, 66, 64, 66, 64, 36, 36, 24, 28, 0, 0, 0, 0} ;


//--08字模--//
uchar code tab3[] = 
{0, 0, 0, 0, 0, 0, 24, 60, 36, 66, 66, 66, 66, 66, 66, 36,
66, 24, 66, 36, 66, 66, 66, 66, 36, 66, 24, 60, 0, 0, 0, 0};


//--07字模--//
uchar code tab4[] = 
{0, 0, 0, 0, 0, 0, 24, 126, 36, 34, 66, 34, 66, 16, 66, 16,
 66, 8, 66, 8, 66, 8, 66, 8, 36, 8, 24, 8, 0, 0, 0, 0};


//--06字模--//
uchar code tab5[] = 
{0, 0, 0, 0, 0, 0, 24, 56, 36, 36, 66, 2, 66, 2, 66, 26, 66,
 38, 66, 66, 66, 66, 66, 66, 36, 36, 24, 24, 0, 0, 0, 0};


//--05字模--//
uchar code tab6[] = 
{0, 0, 0, 0, 0, 0, 24, 126, 36, 2, 66, 2, 66, 2, 66, 26, 66,
 38, 66, 64, 66, 64, 66, 66, 36, 34, 24, 28, 0, 0, 0, 0};


//--04字模--//
uchar code tab7[] = 
{0, 0, 0, 0, 0, 0, 24, 32, 36, 48, 66, 40, 66, 36, 66, 36, 66,
34, 66, 34, 66, 126, 66, 32, 36, 32, 24, 120, 0, 0, 0, 0};


//--03字模--//
uchar code tab8[] = 
{0, 0, 0, 0, 0, 0, 24, 60, 36, 66, 66, 66, 66, 32, 66, 24, 66,
 32, 66, 64, 66, 64, 66, 66, 36, 34, 24, 28, 0, 0, 0, 0};


//--02字模--//
uchar code tab9[] = 
{0, 0, 0, 0, 0, 0, 24, 60, 36, 66, 66, 66, 66, 66, 66, 32, 66,
 32, 66, 16, 66, 8, 66, 4, 36, 66, 24, 126, 0, 0, 0, 0};


//--01字模--//
uchar code tab10[] = 
{0, 0, 0, 0, 0, 0, 24, 8, 36, 14, 66, 8, 66, 8, 66, 8, 66, 8, 66,
8, 66, 8, 66, 8, 36, 8, 24, 62, 0, 0, 0, 0};


//--00字模--//
uchar code tab11[] = 
{0, 0, 0, 0, 0, 0, 24, 24, 36, 36, 66, 66, 66, 66, 66, 66, 66, 66,
66, 66, 66, 66, 66, 66, 36, 36, 24, 24, 0, 0, 0, 0};


//--GO--//
uchar code tab12[] = 
{0, 0, 0, 0, 0, 0, 60, 28, 34, 34, 34, 65, 1, 65, 1, 65, 1, 65, 113,
 65, 33, 65, 34, 65, 34, 34, 28, 28, 0, 0, 0, 0};








//全局变量 


ulong column; //列
ulong row; //行
ulong dt;


//具体分析 查看 函数实现方法
void HC595_data(uchar BT3,uchar BT2,uchar BT1,uchar BT0);


void main()
{
int  k=0;


while(1)
{
 //for()   this is used by  how long 

for(k=0;k<16;k++)
{
HC595_data(~tab12[2*k+1],~tab12[2*k],tab0[2*k],tab0[2*k+1]);
}
   HC595_data(0xff,0xff,0,0);
}
}


/********************************
 BT3 是第2列    。。。。。。。 因此
 输入为   列2 列1   行1(值是行2的值)  行2(值是行1的值)   
 然而 实际不是这样  
 原因是  74h595 是4个并联的 相当于 8个 8*8
 而且只有一个输入  当输入值时 会进行进位操作
 可以理解为 压栈 
 所以变成了 行2(值是行1的值) 行 1 (值是行2的值) 列 2  列 1   
**********************************/
void HC595_data(uchar BT3,uchar BT2,uchar BT1,uchar BT0)
{
uchar i;
for(i=0;i<8;i++)
{
MOSIO=BT3>>7;   //BT 右移7位  即是得到最高位的值
BT3<<=1; //左移1位  最高为溢出,第7位变成最高位,达到按位输入的功能
S_CLK=0; //开始累加
S_CLK=1; //关闭
}


for(i=0;i<8;i++)
{
MOSIO=BT2>>7;   //BT 右移7位  即是得到最高位的值
BT2<<=1; //左移1位  最高为溢出,第7位变成最高位,达到按位输入的功能
S_CLK=0; //开始累加
S_CLK=1; //关闭
}


for(i=0;i<8;i++)
{
MOSIO=BT1>>7;   //BT 右移7位  即是得到最高位的值
BT1<<=1; //左移1位  最高为溢出,第7位变成最高位,达到按位输入的功能
S_CLK=0; //开始累加
S_CLK=1; //关闭
}


for(i=0;i<8;i++)
{
MOSIO=BT0>>7;   //BT 右移7位  即是得到最高位的值
BT0<<=1; //左移1位  最高为溢出,第7位变成最高位,达到按位输入的功能
S_CLK=0; //开始累加
S_CLK=1; //关闭
}
R_CLK = 0; //set dataline low
R_CLK = 1; //片选
R_CLK = 0; //set dataline low
}



2017-08-09 09:45:52 Ti_tian_3 阅读数 1171
  • LED点阵-第1季第8部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第8个课程,讲解了16*16LED点阵的驱动方式和文字显示。本课程的学习目标是理解点阵式LED屏幕的驱动方式、74HC595的时序和编程等。

    2252 人正在学习 去看看 朱有鹏


#include "main.h"


//定义变量
unsigned char temp = 0xfe;
unsigned char KEY_NUM = 0;


unsigned char Display_word[4][4] = {
0x00,0x48,0x2A,0x8E,0xFB,0x0E,0x2A,0x48, //亲
0x0C,0x1E,0x3E,0x7C,0x7C,0x3E,0x1E,0x0C, //心
};






//****************************************************
//主函数
//****************************************************
void main()
{
unsigned int i;
unsigned char j,k;
while(1)
{
for(i = 0 ; i < 1000 ; i++)
{
temp = 0x7f;
for(j = 0 ; j < 2 ; j++) //显示前两个字母
{
for(k = 0 ; k < 4 ; k++) //一个字母4BYTE
{
Send_Byte(temp); //列选择
Send_Byte(Display_word[j][k]); //行数据
LEDARRAY_LAT = 1; //锁存数据
_nop_();

LEDARRAY_LAT = 0;
_nop_();
temp = (temp>>1)|0x80;
}
}
}


for(i = 0 ; i < 1000 ; i++)
{
temp = 0x7f;
for(j = 2 ; j < 4 ; j++) //显示前两个字母
{
for(k = 0 ; k < 4 ; k++) //一个字母4BYTE
{
Send_Byte(temp); //列选择
Send_Byte(Display_word[j][k]); //行数据
LEDARRAY_LAT = 1; //锁存数据
_nop_();

LEDARRAY_LAT = 0;
_nop_();
temp = (temp>>1)|0x80;
}
}
}


}
}


//****************************************************
//发送一个字节数据
//****************************************************
void Send_Byte( unsigned char dat)
{
unsigned char i;
LEDARRAY_CLK = 0;
_nop_();
LEDARRAY_LAT = 0;
_nop_();


for( i = 0 ; i < 8 ; i++ )
{
if( dat&0x01)/*这是C语言中的按位与运算,dat与0000 0001相与,
              然后当dat最低位不是0的是则为if(1),则为真于是就执行if下面的语句,
  反之无论dat其他位是什么,最后一位如果是0则为假,不执行对应语句。*/
{
LEDARRAY_DI = 1;
}
else
{
LEDARRAY_DI = 0;
}
LEDARRAY_CLK = 1; //上升沿发送数据
// _nop_();
LEDARRAY_CLK = 0;
// _nop_();

dat >>= 1;
}

}

#ifndef __MAIN_H__
#define __MAIN_H__


#include <reg52.h>
#include <intrins.h>


sbit LEDARRAY_LAT = P3^6;
sbit LEDARRAY_CLK = P3^5; 
sbit LEDARRAY_DI = P3^4;


//函数或者变量声明
extern void Delay_ms(unsigned int n);
extern void Send_Byte( unsigned char dat);


#endif

2016-08-14 16:20:35 qq_32173789 阅读数 627
  • LED点阵-第1季第8部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第8个课程,讲解了16*16LED点阵的驱动方式和文字显示。本课程的学习目标是理解点阵式LED屏幕的驱动方式、74HC595的时序和编程等。

    2252 人正在学习 去看看 朱有鹏

感谢 大熙熙 的代码解析 

网址 http://www.cnblogs.com/one-meter/p/4188277.html  

他对具体的代码做了形象的解释 


由于部分代码解析还不够具体  融入了 个人对该代码的理解


网上类似的源码很多, 可以自己找个合适的进行学习和验证

我是参考普中单片机的源码(注释函数太少)


代码如下:


#include <reg52.h>

 #include <intrins.h>


//重定义 函数变量
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
 //spi 所使用的 3个管脚 并进行定义


sbit MOSIO =P3^4;
sbit R_CLK =P3^5;
sbit S_CLK =P3^6;


//--点阵显示数组--//
uchar code tab0[] = {0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08,
 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80,
 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00,
 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00}; 
//--10字模--//
uchar code tab1[] = 
{0, 0, 0, 0, 0, 0, 8, 24, 14, 36, 8, 66, 8, 66, 8, 66, 
 8, 66, 8, 66, 8, 66, 8, 36, 62, 24, 0, 0, 0, 0, 0, 0};


//--09字模--//
uchar code tab2[] = 
{0, 0, 0, 0, 0, 0, 24, 24, 36, 36, 66, 66, 66, 66, 66,
 66, 66, 100, 66, 88, 66, 64, 66, 64, 36, 36, 24, 28, 0, 0, 0, 0} ;


//--08字模--//
uchar code tab3[] = 
{0, 0, 0, 0, 0, 0, 24, 60, 36, 66, 66, 66, 66, 66, 66, 36,
66, 24, 66, 36, 66, 66, 66, 66, 36, 66, 24, 60, 0, 0, 0, 0};


//--07字模--//
uchar code tab4[] = 
{0, 0, 0, 0, 0, 0, 24, 126, 36, 34, 66, 34, 66, 16, 66, 16,
 66, 8, 66, 8, 66, 8, 66, 8, 36, 8, 24, 8, 0, 0, 0, 0};


//--06字模--//
uchar code tab5[] = 
{0, 0, 0, 0, 0, 0, 24, 56, 36, 36, 66, 2, 66, 2, 66, 26, 66,
 38, 66, 66, 66, 66, 66, 66, 36, 36, 24, 24, 0, 0, 0, 0};


//--05字模--//
uchar code tab6[] = 
{0, 0, 0, 0, 0, 0, 24, 126, 36, 2, 66, 2, 66, 2, 66, 26, 66,
 38, 66, 64, 66, 64, 66, 66, 36, 34, 24, 28, 0, 0, 0, 0};


//--04字模--//
uchar code tab7[] = 
{0, 0, 0, 0, 0, 0, 24, 32, 36, 48, 66, 40, 66, 36, 66, 36, 66,
34, 66, 34, 66, 126, 66, 32, 36, 32, 24, 120, 0, 0, 0, 0};


//--03字模--//
uchar code tab8[] = 
{0, 0, 0, 0, 0, 0, 24, 60, 36, 66, 66, 66, 66, 32, 66, 24, 66,
 32, 66, 64, 66, 64, 66, 66, 36, 34, 24, 28, 0, 0, 0, 0};


//--02字模--//
uchar code tab9[] = 
{0, 0, 0, 0, 0, 0, 24, 60, 36, 66, 66, 66, 66, 66, 66, 32, 66,
 32, 66, 16, 66, 8, 66, 4, 36, 66, 24, 126, 0, 0, 0, 0};


//--01字模--//
uchar code tab10[] = 
{0, 0, 0, 0, 0, 0, 24, 8, 36, 14, 66, 8, 66, 8, 66, 8, 66, 8, 66,
8, 66, 8, 66, 8, 36, 8, 24, 62, 0, 0, 0, 0};


//--00字模--//
uchar code tab11[] = 
{0, 0, 0, 0, 0, 0, 24, 24, 36, 36, 66, 66, 66, 66, 66, 66, 66, 66,
66, 66, 66, 66, 66, 66, 36, 36, 24, 24, 0, 0, 0, 0};


//--GO--//
uchar code tab12[] = 
{0, 0, 0, 0, 0, 0, 60, 28, 34, 34, 34, 65, 1, 65, 1, 65, 1, 65, 113,
 65, 33, 65, 34, 65, 34, 34, 28, 28, 0, 0, 0, 0};








//全局变量 


ulong column; //列
ulong row; //行
ulong dt;


//具体分析 查看 函数实现方法
void HC595_data(uchar BT3,uchar BT2,uchar BT1,uchar BT0);


void main()
{
int  k=0;


while(1)
{
 //for()   this is used by  how long 

for(k=0;k<16;k++)
{
HC595_data(~tab12[2*k+1],~tab12[2*k],tab0[2*k],tab0[2*k+1]);
}
   HC595_data(0xff,0xff,0,0);
}
}


/********************************
 BT3 是第2列    。。。。。。。 因此
 输入为   列2 列1   行1(值是行2的值)  行2(值是行1的值)   
 然而 实际不是这样  
 原因是  74h595 是4个并联的 相当于 8个 8*8
 而且只有一个输入  当输入值时 会进行进位操作
 可以理解为 压栈 
 所以变成了 行2(值是行1的值) 行 1 (值是行2的值) 列 2  列 1   
**********************************/
void HC595_data(uchar BT3,uchar BT2,uchar BT1,uchar BT0)
{
uchar i;
for(i=0;i<8;i++)
{
MOSIO=BT3>>7;   //BT 右移7位  即是得到最高位的值
BT3<<=1; //左移1位  最高为溢出,第7位变成最高位,达到按位输入的功能
S_CLK=0; //开始累加
S_CLK=1; //关闭
}


for(i=0;i<8;i++)
{
MOSIO=BT2>>7;   //BT 右移7位  即是得到最高位的值
BT2<<=1; //左移1位  最高为溢出,第7位变成最高位,达到按位输入的功能
S_CLK=0; //开始累加
S_CLK=1; //关闭
}


for(i=0;i<8;i++)
{
MOSIO=BT1>>7;   //BT 右移7位  即是得到最高位的值
BT1<<=1; //左移1位  最高为溢出,第7位变成最高位,达到按位输入的功能
S_CLK=0; //开始累加
S_CLK=1; //关闭
}


for(i=0;i<8;i++)
{
MOSIO=BT0>>7;   //BT 右移7位  即是得到最高位的值
BT0<<=1; //左移1位  最高为溢出,第7位变成最高位,达到按位输入的功能
S_CLK=0; //开始累加
S_CLK=1; //关闭
}
R_CLK = 0; //set dataline low
R_CLK = 1; //片选
R_CLK = 0; //set dataline low
}
2007-05-07 16:20:00 alainpro 阅读数 7391
  • LED点阵-第1季第8部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第8个课程,讲解了16*16LED点阵的驱动方式和文字显示。本课程的学习目标是理解点阵式LED屏幕的驱动方式、74HC595的时序和编程等。

    2252 人正在学习 去看看 朱有鹏

PIC单片机控制LED点阵显示屏

       本实验在proteus软件上模拟完成。

       实验器件:208X8LED点阵显示屏,1074LS164移位寄存器,1074LS273数据锁存器,274LS138译码器,1PIC16F877A单片机。

       proteus元件库中中没有16X80点阵显示屏,所以用208X8LED点阵屏拼装而成。

       1074LS164移位寄存器和1074LS273数据锁存器用于传送和保存一行数据。

274LS138构成416译码器用于行选。

实验截图:

源程序:

 list  p=16f877A ; list directive to define processor
 #include <p16f877A.inc> ; processor specific variable definitions
 
 __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _RC_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF

; '__CONFIG' directive is used to embed configuration data within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.

;***** VARIABLE DEFINITIONS
w_temp  EQU 0x7D  ; variable used for context saving
status_temp EQU 0x7E  ; variable used for context saving
pclath_temp EQU 0x7F  ; variable used for context saving  


DELAY_REG EQU 0x20
LINE_NUM EQU 0x21  ;行号
BYTE_NUM EQU 0x22  ;字节号
WORD_NUM EQU 0x23  ;字号
       ;字号X32 + 行号X2 + 字节号 得查表偏移量。
BYTE_BIT_COUNT EQU 0x24 ;一个字节的位数,移位时用


SER   EQU 0x07   
SCK   EQU 0x00   
RCK   EQU 0x01

;**********************************************************************
 ORG     0x000             ; processor reset vector

 nop     ; nop required for icd
   goto    main              ; go to beginning of program


 ORG     0x004             ; interrupt vector location
 retfie                    ; return from interrupt

main

; remaining code goes here

 BSF  STATUS,RP0
 CLRF TRISB
 CLRF TRISC
 CLRF TRISD
 BCF  STATUS,RP0

 CLRF PORTB
 CLRF PORTC
 CLRF PORTD
 CLRF LINE_NUM

MAIN_LOOP:
 CALL LOAD_A_LINE    ;加载一行
 MOVF LINE_NUM,W    ;行选
 MOVWF PORTC     
 BSF  PORTB,RCK    ;将一行数据送入锁存器
 NOP
 NOP
 BCF  PORTB,RCK
 CALL DELAY     ;延时
 INCF LINE_NUM    ;下一行
 BCF  LINE_NUM,4    ;一共16行,模16
 GOTO MAIN_LOOP

 
;加载一行
LOAD_A_LINE:      
 CLRF WORD_NUM    ;字号清零
LOAD_A_WORD:
 CLRF BYTE_NUM    ;字节号清零
LOAD_A_BYTE: 
 BCF  STATUS,C    ;清除C标志位,为移位乘2做准备
 RLF  LINE_NUM,W    ;每个字一行占两个字节,所以乘2    
 ADDWF WORD_NUM,W    ;下面WORD_NUM每次加32,不用再乘
 ADDWF BYTE_NUM,W    ;行号X2 + 字号X32 + 字节号
 CALL ENCODE     ;查表,取出对应的字节
 MOVWF PORTD     
 MOVLW D'8'
 MOVWF BYTE_BIT_COUNT   ;一个字节有8位
LOAD_A_BIT:
 BSF  PORTB,SCK    ;将PORTD最高位送入移位寄存器
 NOP
 NOP
 BCF  PORTB,SCK
 RLF  PORTD     ;移位,准备将下一位送入移位寄存器
 DECFSZ BYTE_BIT_COUNT   ;循环8次
 GOTO LOAD_A_BIT

 INCF BYTE_NUM
 BTFSS BYTE_NUM,1    ;BYTE_NUM==2?一行有两个字节
 GOTO LOAD_A_BYTE
 MOVLW D'32'
 ADDWF WORD_NUM    ;一个字32个字节,每次加32,使用时不用再乘32
 MOVF WORD_NUM,W
 SUBLW D'160'
 BTFSS STATUS,Z    ;WORD_NUM==160?5个字160个字节
 GOTO LOAD_A_WORD
 RETURN

;延时
DELAY:
 DECFSZ DELAY_REG
 GOTO DELAY
 RETURN
 
 
ENCODE:
 ADDWF PCL
 ;黑
 DT 0x3F,0xF8,0x21,0x08,0x29,0x28,0x25,0x48,0x25,0x88,0x3F,0xF8,0x01,0x00,0x01,0x00,
 DT 0x3F,0xF8,0x01,0x00,0xFF,0xFE,0x00,0x00,0x48,0x84,0x44,0x42,0x84,0x42,0x00,0x00
 ;龙
 DT 0x02,0x00,0x02,0x40,0x02,0x20,0x02,0x20,0x7F,0xFE,0x02,0x80,0x02,0x90,0x02,0x90,
 DT 0x04,0xA0,0x04,0xC0,0x08,0x80,0x09,0x80,0x12,0x82,0x20,0x82,0x40,0x7E,0x00,0x00
 ;江
 DT 0x20,0x00,0x10,0x00,0x13,0xFC,0x00,0x40,0x88,0x40,0x48,0x40,0x50,0x40,0x10,0x40,
 DT 0x10,0x40,0x20,0x40,0xE0,0x40,0x20,0x40,0x20,0x40,0x2F,0xFE,0x20,0x00,0x00,0x00
 ;大
 DT 0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x01,0x00,0x02,0x80,
 DT 0x02,0x80,0x02,0x40,0x04,0x40,0x04,0x20,0x08,0x10,0x10,0x18,0x20,0x0E,0x40,0x04
 ;学
 DT 0x01,0x08,0x10,0x8C,0x0C,0xC8,0x08,0x90,0x7F,0xFE,0x40,0x04,0x8F,0xE8,0x00,0x40,
 DT 0x00,0x80,0x7F,0xFE,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x02,0x80,0x01,0x00


 END                       ; directive 'end of program'

2019-07-14 11:06:00 weixin_43936131 阅读数 61
  • LED点阵-第1季第8部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第8个课程,讲解了16*16LED点阵的驱动方式和文字显示。本课程的学习目标是理解点阵式LED屏幕的驱动方式、74HC595的时序和编程等。

    2252 人正在学习 去看看 朱有鹏

(一)第一篇CSDN博客,基于16*16点阵广告栏设计

(1)硬件设计

在这里插入图片描述

  • 这是仿真图硬件设计电路,主要由AT89C51单片机,一个4-16译码器,4个8*8点阵,组成,点阵主要设计了5种功能,其中4种为点阵显示功能,包括静止,闪烁,正向平移和反向平移,主要由上边的按键控制,另一个功能是由外部串口更改内部数组内容。主要由COMPIM这个空间和串口配置工具进行串口连接,串口助手进行串口更改信息。

在这里插入图片描述在这里插入图片描述

  • 这是点阵图和译码器的连接图,A0-A15是对行进行选通,然后通过P0 P2端对列码低八位和高八位赋值。
    在这里插入图片描述在这里插入图片描述
  • COMPIM l连线及配置,RXD接RXD,TXD接TXD,参数配置如上,串口根据自己的配置进行填写。
  • 在这里插入图片描述
    从FIRST PORT中选择COM3,下面选择COM4电机ADD pair就行串口连接,如果你配置的是COM3 COM4口那么在COMPIM中就可以写COM4,用串口助手时就可以写COM3。在这里插入图片描述

(2)代码

#include<reg52.h>
#include<chuankou.h>
#define uchar unsigned char
#define uint unsigned int
#define out0 P0
#define out2 P2
#define out1 P1
sbit P3_6=P3^6;//进去串口模式指示灯

uchar K=0,x=0;//k=检测串口标志位 x=进入不同的模式标志位
void delay(uint j)
{
uchar i=250;
for(;j>0;j–)
{
while(–i);
i=100;
}
}

uchar string[]=
{

0x7F,0xF7,0x7B,0xF7,0xBB,0xF7,0xBB,0xF7,0xDB,0xF6,0xEB,0xB6,0xF3,0x76,0x00,0x86,
0xF3,0xF2,0xEB,0xF4,0xDB,0xF6,0xBB,0xF7,0xBB,0xF7,0x7B,0xF7,0x7F,0xF7,0xFF,0xFF,

0xFF,0xFF,0x03,0xC0,0x7B,0xEF,0x7B,0xEF,0x03,0xC0,0xFF,0x7F,0x77,0xBD,0x77,0xCD,
0xB0,0xF1,0xA7,0xFD,0xDB,0xFD,0xAB,0xC1,0x7B,0xBD,0x1B,0xBD,0xFF,0x8D,0xFF,0xFF

};
unsigned char b=sizeof(string)/sizeof(char); //检测数组长度
void main()
{
uchar i,j,n,k; //
P3_6=1;
EX0=1;
IT0=1;
EX1=1;
IT1=1;
EA=1;
init_com();//初始化串口
3、平移功能
while(1)
{
while(x0)
{
for(j=0;j<b/2;j++)
{
while(K
1)
{
for(i=0;i<64;i++)
{
P1=du_com();
string[i]=P1;
}
K=0;
P3_6=1;
}

    for(n=0;n<40;n++)
	{
	      for(i=0;i<16;i++)
		  {
			out1=i%16;
			out0=string[(i*2+(j*2))%b];
			out2=string[(i*2+1+(j*2))%b];
			delay(1);
			out0=0xff;
			out2=0xff;
      }
   }
}		

}
4、反向平移功能
while(x==1)
{
for(j=b/2;j>0;j–)
{

    for(n=0;n<40;n++)
	{
	      for(i=0;i<16;i++)
		  {
			out1=i%16;
			out0=string[(i*2+(j*2))%b];
			out2=string[(i*2+1+(j*2))%b];
			delay(1);
			out0=0xff;
			out2=0xff;
         }
    }
 }		

}
5、静态显示
while(x2)
{
for(n=0;n<40;n++)
{
for(i=0;i<16;i++)
{
out1=i%16;
out0=string[(i2+(j2))%b];
out2=string[(i2+1+(j2))%b];
delay(1);
out0=0xff;
out2=0xff;
}
}
}
6、闪烁功能
while(x
3)
{
for(k=0;k<2;k++)
{
for(n=0;n<40;n++)
{
for(i=0;i<16;i++)
{
out1=i%16;
out0=string[i2+k32];
out2=string[i2+1+k32];
delay(1);
out0=0xff;
out2=0xff;
}

	    }	
	}
}

}
}

void fangshi1(void) interrupt 0
{
x++;
if(x==4)
x=0;

}
void wai1(void) interrupt 2
{

 P3_6=0;
 K=1;

}

  • 第一次用CSDN,第一次写,写的不足的地方希望大家批评改正,有什么疑问,可以在下面留言。下篇博客写基于C#的波形显示,及和下位机串口通信知识,以及下位机程序的编写。
没有更多推荐了,返回首页