c51的sfr、sbit
sfr:特殊功能寄存器声明
例如:sfr P0=0x80
声明P0口寄存器,物理地址为0x80
sbit:特殊位声明
例如:sbit p0_1 = 0x81; 或 sbit p0_1 =p0^1;
声明P0寄存器的第一位
可位寻址、不可位寻址:在单片机系统中,操作任意寄存器或者某一位的数据时,必须给出其物理地址,又因为一个寄存器里面有8位,所以位的数据是寄存器数量的8倍,单片机无法对所有位进行编码,故每8个寄存器中,只有一个是可以位寻址的。对于不可位寻址的寄存器,若要只操作其中一位而不影响其他位时,可用“&=”、“|=”、“^=”的方法进行位操作
LED点阵屏显示图形
main.c
#include <REGX52.H>
#include "Delay.h"sbit RCK=P3^5; //RCLK
sbit SCK=P3^6; //SRCLK
sbit SER=P3^4; //SER#define MATRIX_LED_PORT P0void _74HC595_WriteByte(unsigned char Byte)
{unsigned char i;for(i=0;i<8;i++){SER=Byte&(0x80>>i);SCK=1;SCK=0;}RCK=1;RCK=0;
}void MatrixLED_ShowColumn(unsigned char Column,Data)
{_74HC595_WriteByte(Data);MATRIX_LED_PORT=~(0x80>>Column);Delay(1);MATRIX_LED_PORT=0xFF;
}void main()
{SCK=0;RCK=0;while(1){MatrixLED_ShowColumn(0,0x3C);MatrixLED_ShowColumn(1,0x42);MatrixLED_ShowColumn(2,0xA9);MatrixLED_ShowColumn(3,0x85);MatrixLED_ShowColumn(4,0x85);MatrixLED_ShowColumn(5,0xA9);MatrixLED_ShowColumn(6,0x42);MatrixLED_ShowColumn(7,0x3C);}
}
LED点阵屏显示动画
main.c
#include <REGX52.H>
#include "Delay.h"
#include "MatrixLED.h"//动画数据
unsigned char code Animation[]={0x3C,0x42,0xA9,0x85,0x85,0xA9,0x42,0x3C,0x3C,0x42,0xA1,0x85,0x85,0xA1,0x42,0x3C,0x3C,0x42,0xA5,0x89,0x89,0xA5,0x42,0x3C,
};void main()
{unsigned char i,Offset=0,Count=0;MatrixLED_Init();while(1){for(i=0;i<8;i++) //循环8次,显示8列数据{MatrixLED_ShowColumn(i,Animation[i+Offset]);}Count++; //计次延时if(Count>15){Count=0;Offset+=8; //偏移+8,切换下一帧画面if(Offset>16){Offset=0;}}}
}
MatrixLED.c
#include <REGX52.H>
#include "Delay.h"sbit RCK=P3^5; //RCLK
sbit SCK=P3^6; //SRCLK
sbit SER=P3^4; //SER#define MATRIX_LED_PORT P0/*** @brief 74HC595写入一个字节* @param Byte 要写入的字节* @retval 无*/
void _74HC595_WriteByte(unsigned char Byte)
{unsigned char i;for(i=0;i<8;i++){SER=Byte&(0x80>>i);SCK=1;SCK=0;}RCK=1;RCK=0;
}/*** @brief 点阵屏初始化* @param 无* @retval 无*/
void MatrixLED_Init()
{SCK=0;RCK=0;
}/*** @brief LED点阵屏显示一列数据* @param Column 要选择的列,范围:0~7,0在最左边* @param Data 选择列显示的数据,高位在上,1为亮,0为灭* @retval 无*/
void MatrixLED_ShowColumn(unsigned char Column,Data)
{_74HC595_WriteByte(Data);MATRIX_LED_PORT=~(0x80>>Column);Delay(1);MATRIX_LED_PORT=0xFF;
}
MatrixLED.h
#ifndef __MATRIX_LED_H__
#define __MATRIX_LED_H__void MatrixLED_Init();
void MatrixLED_ShowColumn(unsigned char Column,Data);#endif