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

📄 xqdz.c

📁 点阵实物程序(16-32两块级联程序)
💻 C
字号:

/*******************************************
程序名称:2个点阵模块从右往左移动显示
外部参数说明:
单片机选型:本程序必须使用RAM为128以上的单片机,建议使用STC89C52 STC89C**,STC90C*等12T的单片机
            如果使用的是STC12C5A*,STC11F*等1T的单片机,需要修改中断定时参数跟左移动的延时。
			本程序可以使用AT89C51 AT89C52 AT89S51 AT89S52等RAM只有128的单片机。

晶振参数:使用12M以上的晶体。建议使用24M以上的晶体,晶振频率越高,显示字不会出现闪烁感。
          如果使用24M以下的晶体,如果是STC的芯片,建议打开6T(双倍速)功能。
          
端口定义:模块的A插针接单片机的P1.4,模块的B插针接单片机的P1.5,模块的C插针接单片机的P1.6
          模块的D插针接单片机的P1.7,模块的LATCH插针接单片机的P1.0
		  模块的CLK插针接单片机的P1.1,模块的DI(程序里面标的是DA_port)插针接单片机的P1.2
		  模块的G(程序里面标的是EN_port)插针接单片机的P1.3

/*头文件*/
#include <reg52.h>      
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define NOP() _nop_()

/*端口定义*/

sbit EN_port = P1^3;
sbit DA_in_port = P1^2;
sbit CLK_port = P1^1;
sbit Latch_port = P1^0;

#define ABCD_port P1  //HC138 ABCD端口定义
//sbit D_port = P1^7;
//sbit C_port = P1^6;
//sbit B_port = P1^5;
//sbit A_port = P1^4;

uchar code ziku_table[]={


0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,/*显示8行空白*/
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xFF,0xFF,0x01,0x80,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0x00,0x80,0xDF,0xFB,
0xDF,0xFB,0xDF,0xFB,0xEF,0xFB,0xEF,0xFB,0xF7,0xFB,0xFB,0xFB,0xFD,0xFB,0xFF,0xFF,/*"开",6*/

0xBF,0xFF,0xBB,0xFD,0xBB,0xF3,0xBB,0xF7,0x01,0x80,0xDB,0xFF,0xDF,0xFF,0x1F,0xF8,
0xCF,0xFB,0xAF,0xFB,0xAF,0xFB,0x77,0xFD,0xFB,0xFE,0x7D,0xF9,0x9E,0xC7,0xE7,0xEF,/*"发",7*/

0xF7,0xC7,0x77,0xF8,0x77,0xFF,0x77,0xFF,0x40,0xFF,0x77,0xC0,0x63,0xDE,0x53,0xED,
0x55,0xED,0xB5,0xF3,0xB6,0xF7,0xB7,0xF3,0xD7,0xED,0xF7,0x8E,0x77,0xDF,0xFF,0xFF,/*"板",8*/

0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x00,0x80,0x3F,0xFE,0x3F,0xFD,0x5F,0xFD,0x5F,0xFB,
0x6F,0xF7,0x77,0xE7,0x0B,0x88,0x7C,0xDF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0xFF,0xFF,/*"本",0*/

0x7F,0xFF,0xFF,0xFE,0x03,0x80,0xFB,0xFE,0xFB,0xFE,0xFB,0xFE,0xFB,0xC0,0xFB,0xFE,
0xFB,0xFE,0x1B,0xE0,0xDB,0xEF,0xDB,0xEF,0xDD,0xEF,0x1D,0xE0,0xDE,0xEF,0xFF,0xFF,/*"店",1*/

0xF7,0xFF,0xEF,0x8F,0x01,0xF1,0xBB,0xFD,0xD7,0xFD,0x00,0x81,0xEF,0xED,0xEF,0xED,
0x00,0xED,0xEF,0xED,0xCB,0xED,0xAB,0xEE,0xAD,0xEE,0x6E,0xEF,0xAB,0xEF,0xF7,0xEF,/*"新",2*/

0xFF,0xDF,0x01,0xDE,0xEF,0xDF,0xB7,0xDB,0x7B,0xDB,0x01,0xDA,0x5B,0xDB,0xDF,0xDB,
0xDF,0xDB,0x01,0xDA,0xDF,0xDB,0xDF,0xDB,0x5F,0xDE,0x8F,0xDF,0xF1,0xD7,0xFB,0xEF,/*"到",3*/

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0x01,0x80,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"一",4*/

0xB7,0xFB,0xB7,0xFB,0xB7,0xFB,0x80,0xFB,0xB7,0xFB,0xB7,0x9B,0x17,0xE2,0xA7,0xFB,
0xB3,0xFB,0xB4,0xFB,0xB7,0xFB,0xB7,0xFB,0xB7,0xBA,0x37,0xBB,0xB5,0x87,0xFB,0xFF,/*"批",5*/



0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF3,0xFF,0xF3,0xFF,0xF7,0xFF,0xFB,0xFF,0xFF,0xFF,/*",",9*/

0xFF,0xFE,0xFF,0xFE,0xC0,0xFE,0x5F,0x80,0x5E,0xDF,0xAD,0xED,0xEB,0xFD,0xF7,0xFD,
0xE7,0xFD,0xE7,0xF9,0xDB,0xFA,0xDB,0xF6,0x7D,0xE7,0x9E,0x8F,0xE3,0xDF,0xFF,0xFF,/*"欢",10*/

0xFD,0xFF,0x7B,0xFE,0x93,0xC1,0xDB,0xDD,0xDF,0xDD,0xDF,0xDD,0xD8,0xDD,0xDB,0xDD,
0x5B,0xDD,0x9B,0xD5,0xDB,0xED,0xFB,0xFD,0xFB,0xFD,0xF5,0xFF,0x0E,0x80,0xFF,0xFF,/*"迎",11*/

0xDF,0xFF,0xDF,0xFF,0x1F,0xF0,0xCF,0xFB,0xB7,0xFB,0xB9,0xFD,0x7F,0xFE,0x9F,0xF9,
0xE7,0x87,0x08,0xD0,0xEF,0xF7,0xEF,0xF7,0xEF,0xF7,0xEF,0xF7,0x0F,0xF0,0xFF,0xFF,/*"各",12*/

0x6F,0xFF,0xCF,0xFC,0xF7,0xFD,0x17,0xC0,0xFB,0xFF,0xD3,0xF7,0xB5,0xE7,0xB5,0xF7,
0x76,0xF7,0x77,0xFB,0x77,0xFB,0xF7,0xFB,0xF7,0xFD,0x07,0x80,0xF7,0xFF,0xFF,0xFF,/*"位",13*/

0xFF,0xFF,0x83,0xC1,0xBB,0xDD,0xBB,0xDD,0x83,0xC1,0xBB,0xDD,0xBB,0xDD,0x83,0xC1,
0xBB,0xDD,0xBB,0xDD,0xBB,0xDD,0xBB,0xDD,0xBD,0xDE,0xAD,0xD6,0x5E,0xEF,0xFF,0xFF,/*"朋",14*/

0xBF,0xFF,0xBF,0xFF,0xBF,0xFF,0x00,0x80,0xBF,0xFF,0xBF,0xFF,0x1F,0xF0,0xDF,0xF7,
0x9F,0xFB,0x6F,0xFB,0xEF,0xFC,0xF7,0xFC,0x7B,0xFB,0xBD,0xE7,0xCE,0x8F,0xF3,0xDF,/*"友",15*/

0xFF,0xFD,0xBB,0xFD,0xB7,0xFD,0x37,0xE0,0xDF,0xFD,0xFF,0xFD,0x10,0xC0,0x77,0xFB,
0x77,0xFB,0xB7,0xDB,0xB7,0xDB,0xD7,0xC7,0xF7,0xFF,0xEB,0xFF,0x1D,0x80,0xFF,0xFF,/*"选",16*/

0xFF,0xFE,0xC1,0xFC,0xDD,0xFE,0xD5,0x80,0x55,0xBF,0x55,0xBF,0x95,0xBD,0xD5,0xBD,
0xD5,0xBA,0x55,0xB7,0x77,0xA0,0xEB,0xB7,0xDB,0xBF,0xDD,0xBF,0xFE,0xD7,0xFF,0xEF,/*"购",17*/

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xF7,0xFF,0xF7,0xFF,0xF7,0xFF,
0xF7,0xFF,0xF7,0xFF,0xF7,0xFF,0xF7,0xFF,0xF7,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,/*"!",18*/

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,/*显示8行空白*/
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,/*显示8行空白*/
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,/*显示8行空白*/
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

};


uchar data disp_buff[64]; //64 个显示数据缓存
//数据格式为 第1级第1行高八位,低八位,第2级第1行高八位,低八位,第1级第2行高八位。。。。。。
uchar data disp_han;   //目前显示到第几行


void T0_Set() /*定义中断方式,中断时间*/
{
    TMOD = 0x01;  //定时0,工作在方式1
    TH0  = (65536-1000)/256;
    TL0  = (65536-1000)/256;
    TR0  = 1;     //启动计数
    EA   = 1;     //开总中断
    ET0  = 1;     //开定时器0中断
	return;
}

void delay_1ms(uchar x)
{
    uchar j;
    while(x--){
        for(j=0;j<125;j++)
            {;}
        }   
}


void main()
{
	uchar i;
	uint data_temp[3];
	uint temp,temp1;
	uchar hanzi;
	uchar han;
	uchar shift=1;
	for(i=0;i<64;i++) disp_buff[i]=0xff;
	T0_Set();
	while(1){
		for(hanzi=0;hanzi<22;hanzi++){	//最多显示多少个字
			for(shift=0;shift<16;shift++){	//一个字移位16位
				for(han=0;han<16;han++){   //一个字有16行数据			
					data_temp[0]=ziku_table[(hanzi*32)+(han*2)+1]*0x100 + ziku_table[(hanzi*32)+(han*2)];
					data_temp[1]=ziku_table[((hanzi+1)*32)+(han*2)+1]*0x100 + ziku_table[((hanzi+1)*32)+(han*2)];
					data_temp[2]=ziku_table[((hanzi+2)*32)+(han*2)+1]*0x100 + ziku_table[((hanzi+2)*32)+(han*2)];
					/*
					//左往右移动
					temp = data_temp[0];
					temp1 = data_temp[1];
					for(i=shift;i>0;i--){
						temp = (temp<<1) ;
						if((temp1&0x8000)!=0) temp = temp + 0x0001; 
						temp1 = (temp1<<1);
						}
					disp_buff[han*4+3]=temp/0x100;
					disp_buff[han*4+2]=temp%0x100;
					//----------------------				
					temp = data_temp[1];
					temp1 = data_temp[2];
					for(i=shift;i>0;i--){
						temp = (temp<<1) ;
						if((temp1&0x8000)!=0) temp = temp + 0x0001; 
						temp1 = (temp1<<1);
						}
					disp_buff[han*4+1]=temp/0x100;
					disp_buff[han*4]=temp%0x100;
					*/

					//右往左移动
					temp = data_temp[0];
					temp1 = data_temp[1];
					for(i=shift;i>0;i--){
						temp = (temp>>1) ;
						if((temp1&0x0001)!=0) temp = temp + 0x8000; 
						temp1 = (temp1>>1);
						} 
					disp_buff[han*4+1]=temp/0x100;
					disp_buff[han*4+0]=temp%0x100;
					//------------------------------
					temp = data_temp[1];
					temp1 = data_temp[2];
					for(i=shift;i>0;i--){
						temp = (temp>>1) ;
						if((temp1&0x0001)!=0) temp = temp + 0x8000; 
						temp1 = (temp1>>1);
						}
					disp_buff[han*4+3]=temp/0x100;
					disp_buff[han*4+2]=temp%0x100;				
					}
				delay_1ms(200); //移位速度
				}
			}
		}
}




void SLED_Disp() interrupt 1 using 3
{
	uchar i;
	uchar data_buff;
	uchar temp;
	uchar zishu;
	uchar code Module_Quantity=2; //模块数量(意思是我的两个16*16的模块级联,也就相当于16*32)
	uchar han;	
    TH0  = (65536-1000)/256;	//中断初始值(更改后面的1000可以改变现实移动的速度快慢)
    TL0  = (65536-1000)/256;
	Latch_port = 0;  //HC595锁定输出,避免数据传输过程中,屏数据变化从而显示闪烁
	CLK_port = 0;
	han=disp_han; //(disp_han为当前显示行)
	for(zishu=Module_Quantity;zishu>0;zishu--){			//此语句代表两个模块循环扫描显示
		temp = disp_han*Module_Quantity*2 + (zishu-1)*2+1; 	 //扫描显示后一个模块的8行显示注意这条语句与下面temp = disp_han*Module_Quantity*2 + (zishu-1)*2;的区别
		data_buff = disp_buff[temp];
		for(i=0;i<8;i++){									  //扫描显示后8行也就是8-16行
			if((data_buff&0x80)!=0) DA_in_port = 1;
			else DA_in_port = 0;
			CLK_port = 1;
			CLK_port = 0;
			data_buff <<= 1;
			}
		temp = disp_han*Module_Quantity*2 + (zishu-1)*2;  //扫描显示前一个模块的8行
		data_buff = disp_buff[temp];
		for(i=0;i<8;i++){								   //扫面显示1-8行
			if((data_buff&0x80)!=0) DA_in_port = 1;
			else DA_in_port = 0;				    	//时序问题自己可以参照一下芯片资料
			CLK_port = 1;
			CLK_port = 0;
			data_buff <<= 1;
			}
		}
		 
	EN_port = 1;    //关屏显示,原理为使HC138输出全为1,从而三极管截止,点阵不显示
	ABCD_port = (ABCD_port & 0x0f)|(han<<4);  //HC138译码输出
	Latch_port = 1; //允许HC595数据输出到Q1-Q8端口
	EN_port = 0;    //HC138输出有效,打开显示
	Latch_port = 0;	//锁定HC595数据输出

	disp_han++;	//显示下一行数据
	if(disp_han>=16) disp_han=0;
}













⌨️ 快捷键说明

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