⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 欢迎光临停止营业1.c

📁 基于C51的点阵时钟显示仿真电路和源码
💻 C
字号:
// A B C D 对应P1.0; P1.1 ; P1.2; P1.3
//--------------------------------
#include "reg52.h"

#define  uchar unsigned char
#define  uint  unsigned int
//========================
//****滚屏事件定义****
#define	 MSG_MV_L	  1 	//左移
#define	 MSG_MV_R	  2	//右移
#define	 MSG_MV_U   3	//上移
#define	 MSG_MV_D   4	//下移
#define	 MSG_NONE	 -1	//无
uchar MSG_MV = -1;
//========================
//****引脚定义****
sbit  CLK =P2^5 ;		  //74HC595移时钟 
sbit  STB =P2^4	;	  // 74HC595锁存信号 
sbit  Red=P2^7	;	  //红色数据输出引脚低电平有效	    
sbit  Greed=P2^6;	 //全屏控制使能0,低电平有效
sbit  OE = P0^7; 	  //全屏使能
//======================== 
uchar SendData;		  //要发送的数据变量 
uchar hang;			//行扫描变量  (半屏只有16行,所以hang=0到15)
uchar move_times = 0;	//左右移动位数


uchar data h_dispram[10]; 	//显示缓存
uchar code *disword[26];	//显示文字指针


void  Keyscan (void); //修改参数按键扫描子程序 
void  Sendping(); //发送半屏子程序
void  Put_Wdispram(uchar first_word);
void  Put_Hdispram(); //把显示文字放入显示缓存
void  Move_Left();	//左移
void  Move_Right();	//右移
void  RL_Move();
void  UD_Move();
void  Show_Line();
void  Show_Move_Word();
void  delay();
void  SendByte(void);
void  RowsCan(void);

uchar code MY_WORDS[][16]= 
					{ 
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},					
{0x10,0x08,0x04,0x7F,0x01,0x21,0x12,0x0A,0x04,0x06,0x0A,0x11,0x21,0x41,0x80,0x00},
{0x04,0x04,0x04,0xA4,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x04,0x84,0x14,0x08,0x00},/*"刘",0*/
{0x02,0x01,0x3F,0x20,0x40,0x00,0x00,0x7F,0x01,0x01,0x01,0x01,0x01,0x01,0x05,0x02},
{0x00,0x04,0xFE,0x04,0x08,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"宁",1*/
{0x01,0x01,0x01,0x01,0x01,0x1F,0x10,0x10,0x10,0x1F,0x10,0x01,0x28,0x24,0x44,0x00},
{0x00,0x00,0xF8,0x00,0x10,0xF8,0x10,0x10,0x10,0xF0,0x10,0x10,0x88,0x44,0x44,0x00},/*"点",2*/
{0x00,0xF8,0x88,0x97,0xA1,0x91,0x8A,0x8F,0x88,0xA8,0x97,0x80,0x80,0x80,0x80,0x80},
{0x80,0x80,0x80,0xFC,0x00,0x40,0x40,0xFC,0x40,0x40,0xFE,0x40,0x40,0x40,0x40,0x40},/*"阵",3*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

					};
void Put_Wdispram(uchar first_word){
	uchar i;
	for(i=0;i<10;i++){
		disword[i] = &MY_WORDS[first_word+i][0];
	}
}	

void  Put_Hdispram(){
	uchar i;
	for(i=0;i<10;i++){
		h_dispram[i] = *(disword[i]+hang);	//
	}
}

void Move_Left(){
	uchar i;
	for(i=0;i<9;i++){
		h_dispram[i] = (h_dispram[i] << (move_times)) | (h_dispram[i+1] >> (8-move_times));
	}
}

void Move_Right(){
	uchar i;
	for(i=9;i>0;i--){
		h_dispram[i] = (h_dispram[i] >> (move_times)) | (h_dispram[i-1] << (8-move_times));
	}
}

void RL_Move(){
	//
	switch(MSG_MV){
		case MSG_MV_L:	//左移
			Move_Left();
			break;
		case MSG_MV_R:	//右移
			Move_Right();
			break;
		case MSG_NONE:
			break;
		default:
			break;
		}
}

void UD_Move(){
	//
	switch(MSG_MV){
		case MSG_MV_U:	//左移
		//	Move_Up();
			break;
		case MSG_MV_D:	//右移
		//	Move_Down();
			break;
		case MSG_NONE:
			break;
		default:
			break;
		}
}

void Show_Line(){
	uchar m;
	OE=1;
	for(m =0;m<8;m++)  
	{	
		SendData = h_dispram[m+1];
		SendByte();
	}
	STB = 0;
	STB = 1;		 //上升沿数据锁存 
	RowsCan();		//行扫描 
	OE = 0;
	delay();	//
}

void Show_Move_Word(){
	int m,i;
	for(m=0;m<7;m++){	//若要上下移动 m=16
		//hang = 0;
		for(i=0;i<16;i++){
			Put_Hdispram();	//把第i行放入行缓冲
			RL_Move();	//是否要左右移动
			Show_Line();
			//delay();	//看需要
		}
	//UD_Move();	//是否要上下移动
	}
	//========================================
	//测试左移右移
	move_times++;
	if((move_times == 9) && (MSG_MV == MSG_MV_L)){
		move_times = 0;
		MSG_MV = MSG_MV_R;
	}
	else if((move_times == 9) && (MSG_MV == MSG_MV_R)){
		move_times = 0;
		MSG_MV = MSG_MV_L;
	}
}	

void delay()
{
	uint i;
	for(i=0;i<40;i++);
}			 
	
//------------------------------------
//----------字发送子程序-----------
	void SendByte(void)
		{
		   uchar m;
		   for(m=0;m<8;m++)
		   {
		   		CLK = 0;
				Red = (SendData & 0x80);		  //红屏显示 
		    //	Greed =  (SendData & 0x80);		  //绿屏显示 
			  	SendData =SendData<<1;			
				CLK = 1;	  //移位时钟上升沿 
		   }
		}
//-----------------------------------
//----------行扫描子程序-------------
	   void RowsCan(void)
	   {
			P2 = P2 & 0xf0;
			P2 = P2 | hang;
			hang++;
			if (hang>=16) 
			{ 
				hang =0x00;
			}
		}

		void initial(void)
	   	{
	  		OE = 1;
			Red = 1;
			Greed = 1;
			SendData = 0x00;
			hang = 0x00;
							
	 	}
		//;---------主程序循环--------------
	   	void main()
		{
			initial();
			MSG_MV = MSG_MV_L;
			Put_Wdispram(0); //
			while(1)
			{	
			  Show_Move_Word();
			}
		 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -