📄 7219.c
字号:
/**************************************************************************
7219.H
7219接口函数
***************************************************************************/
#define _7219_
#include "general.h"
//led显示码表,位置码表
//static uchar code code_led_09[10]= {0x7E,0x30,0x6D,0x79,0x33,0x5B,0x5F,0x70,0x7F,0x7B};
// 0 1 2 3 4 5 6 7 8 9
#define TABLELEN 30
static struct {uchar asc; uchar cod;}code code_led[TABLELEN] =
{
{0x00,0x7e}, {0x01,0x30}, {0x02,0x6d}, {0x03,0x79}, {0x04,0x33},
{0x05,0x5b}, {0x06,0x5f}, {0x07,0x70}, {0x08,0x7f}, {0x09,0x7b},
{'A',0x77}, {'S',0x5b}, {'C',0x4e}, {'o',0x1d}, {'E',0x4f},
{'F',0x47}, {'G',0x5e}, {'O',0x7e}, {'P',0x67}, {'U',0x3e},
{'r',0x05}, {'T',0x46}, {'.',0x80}, {'-',0x01}, {'=',0x09},
{'^',0x63}, {'/',0x02}, {'"',0x22}, {' ',0x00}, {0xff,0xff}//度、分、秒、空格、无键
};
static uchar code code_led_bit[10]={0x01,0x02,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
//左高右低
//显示缓冲区
static uchar data buf_disp[10];
//定义MAX7219寄存器
#define nop 0x00
#define digit0 0x01
#define digit1 0x02
#define digit2 0x03
#define digit3 0x04
#define digit4 0x05
#define digit5 0x06
#define digit6 0x07
#define digit7 0x08
#define decodemode 0x09
#define intensity 0x0a
#define scanlimit 0x0b
#define shutdown 0x0c
#define displaytest 0x0f
//定义硬件引脚
sbit clk=P1^2;
sbit load=P1^1;
sbit din=P1^0;
/*---------------------------------------
向一个MAX7219写8bit
---------------------------------------
void sendbyte(uchar d)//
{
char i;
for(i=8;i>=1;i--)
{
din=d&0x80;
d=d<<1;
clk=1;
_nop_();
_nop_();
_nop_();
_nop_();
clk=0;
}
}*/
/******************************************************
操作两片7219,送32字节子函数
*******************************************************/
void send32(uchar add1,uchar dat1,uchar add2,uchar dat2)
{
uchar tmp8,i,j;
load=0;
i=0;
while(i<32)
{
if(i<8) {tmp8=add1;}
else if(i<16){tmp8=dat1;}
else if(i<24){tmp8=add2;}
else {tmp8=dat2;}
for(j=8;j>=1;j--)
{
din=tmp8&0x80;
tmp8=tmp8<<1;
clk=1;
_nop_();
_nop_();
_nop_();
_nop_();
clk=0;
}
i=i+8;
}
load=1;
}
/*---------------------------------------
全部熄灭
---------------------------------------*/
void cls(void)
{
unsigned int i;
for(i=0x01;i<=0x08;i+=0x01)
send32(i,0x00,i,0x00);
}
/******************************************
关闭显示
******************************************
void dispoff()
{
cls();
load=1;
}
/****************************************
缓冲区操作,从pos开始填充n个c
*****************************************
void set_buf_disp(uchar c,uchar pos, uchar n)
{
uchar buf_pos;
dispoff();
for(buf_pos=pos-1; n>0; n--)
{
buf_disp[buf_pos]=c;
buf_pos++;
//if(buf_pos>=10) buf_pos=0;
}
}
/*----------------------------------------
初始化MAX7219,并清屏
-----------------------------------------*/
void init_max7219(void)
{
/* send16(decodemode,0x00); //设置无解码方式
send16(intensity,0x0f); //设置亮度为max
send16(scanlimit,0x07); //8段全扫描
send16(shutdown,0x01); //设置为正常模式
send16(displaytest,0x01); //进行LED测试,全部点亮
delay(100);
send16(displaytest,0x00); //测试完毕
cls();
*/
cls();
send32(decodemode,0x00,decodemode,0x00); //设置解码方式:00-无,ff-BCD
send32(intensity,0x04,intensity,0x0f); //设置亮度为max(注意调节两片亮度一致)
send32(scanlimit,0x01,scanlimit,0x07); //高2位,低8位
send32(shutdown,0x01,shutdown,0x01); //设置为正常模式
send32(displaytest,0x01,displaytest,0x01); //进行LED测试,全部点亮
delay(500);
send32(displaytest,0x00,displaytest,0x00); //测试完毕
cls();
}
/******************************************
查LED码表
******************************************/
uchar get_seg(uchar c)
{
uchar i=0;
while(code_led[i].asc != c)
i++;
return(code_led[i].cod);
//if(i>=TABLELEN)return(0x00);
}
/*****************************************
将显存写寄存器显示
****************************************
void dispon()
{
//uchar dmask=0x01; // 显示位控制码
uchar pos,dat;
for(pos=0; pos<10; pos++)
{
dat=get_seg(buf_disp[pos]); // 输出字型
if(pos<2){send32((pos+1),dat,nop,nop);}
else{send32(nop,nop,(pos-1),dat);}
//delay(1); // 延时1ms
//dmask=_crol_(dmask,1); // 修改位控制码
}
}
/*********************************************
在第pos位寄存器写char
**********************************************/
void disp(uchar c,uchar pos)
{
uchar dat;
dat=get_seg(c);
if(pos<3) {send32(pos,dat,nop,nop);}
else {send32(nop,nop,(pos-2),dat);}
}
/*******************************************
在第pos位寄存器写char,加小数点,
********************************************/
void disp_dp(uchar c,uchar pos)
{
uchar dat;
dat=get_seg(c)+0x80;
if(pos<3) {send32(pos,dat,nop,nop);}
else {send32(nop,nop,(pos-2),dat);}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -