📄 xqdz.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 + -