📄 drv7219.c
字号:
#define DRV7219_GLOBALS
#include <config.h>
sbit MAX7221DI=P0^2;//MAX7221管脚定义
sbit MAX7221CS=P0^1;
sbit MAX7221CLK=P0^0;
unsigned char code disptable[62]= {//0~30
0x7e,0x30,0x6d,0x79,0x33, // 0 1 2 3 4
0x5b,0x5f,0x70,0x7f,0x7b, // 5 6 7 8 9
0x77,0x1f,0x4e,0x3d,0x4f, // A b C d E
0x47,0x00,0x01,0x37,0x38, // F - H J
0x76,0x1d,0x67,0x05,0x3e, // n o P r U
0x0e,0x09,0x27,0x0e,0x0f, // L = Y L t
0x17, // h
//31~61
0xfe,0xb0,0xed,0xf9,0xb3, // 0. 1. 2. 3. 4.
0xdb,0xdf,0xf0,0xff,0xfb, // 5. 6. 7. 8. 9.
0xf7,0x9f,0xce,0xbd,0xcf, // A. b. C. d. E.
0xc7,0x80,0x81,0xb7,0xb8, // F. . -. H. J.
0xf6,0x9d,0xe7,0x85,0xbe, // n. o. P. r. U.
0x8e,0x89,0xa7,0x8e,0x8f, // L. =. Y. L. t.
0x97}; // h.
// 显示段码表段码对应位:dp-d7,a-D6,b-D5,c-D4,d-D3,e-D2,f-D1,g-D0 1-段码亮
uchar code er[8]={0xe,23,0x0,0x10,0x10,0x10,0x10,0x10};//Er
unsigned int code jsfdz[12] = {1,2,5,10,20,50,100,200,500,1000,2000,5000};//对应分度值的100倍
unsigned char code fdzxsdm[12][3] = {{1,0,31},{2,0,31},{5,0,31}, //分度值显示代码
{1,31,16},{2,31,16},{5,31,16},
{1,16,16},{2,16,16},{5,16,16},
{0,1,16},{0,2,16},{0,5,16}};
void DI_0(void)
{
//P2&=~BIT0;
MAX7221DI=0;
}
void DI_1(void)
{
//P2|=BIT0;
MAX7221DI=1;
}
void CLK_0(void)
{
//P2&=~BIT2;
MAX7221CLK=0;
}
void CLK_1(void)
{
//P2|=BIT2;
MAX7221CLK=1;
}
void CS_0(void)
{
//P2&=~BIT1;
MAX7221CS=0;
}
void CS_1(void)
{
//P2|=BIT1;
MAX7221CS=1;
}
void disp(uchar addr,uchar _data)
{
//P00 CLK
//P01 LOAD
//P02 DI
uchar i;
CLK_0();//数据默认状态为低 上升沿锁存数据,下降沿数据从7219的DOUT端输出
CS_1();//片选默认状态为高
DI_1();//数据线默认状态为高
CS_0();//片选有效
//delay(0xff);//延时
for(i=0;i<8;i++)//先发高位,后发低位,先发地址,后发数据
{
if(addr&0x80)//测试最高位
DI_1();//数据有效
else
DI_0();
//延时
CLK_1();//上升沿锁存数据
//delay(0xff);//延时
CLK_0();//下降沿数据输出
addr<<=1;
}
for(i=0;i<8;i++)//先发高位,后发低位,先发地址,后发数据
{
if(_data&0x80)//测试最高位
DI_1();//数据有效
else
DI_0();
//delay(0xff);//延时
CLK_1();//上升沿锁存数据
//delay(0xff);//延时
CLK_0();//下降沿数据输出
_data<<=1;
}
CS_1();//片选无效
}
void display(void)
{
unsigned char count,addr;
addr = 0x08; // Initial start address of MAX7219
for (count=0;count<8;count++)
{
disp(addr,disptable[dispbuf[count]]);
addr--;
}
}
void led_init(void)
{
uchar i;
disp(0x00,0x00);//地址0,器件级联,设置为不级联
for(i=1;i<9;i++)
{
//disp(i,0x10);//数据寄存器初始值设定
dispbuf[i-1]=0x10;
}
disp(0x09,0x00);//解码模式,设置为不解码 0不解码,1解码
disp(0x0a,0x0f);//亮度设置,设置为最亮
disp(0x0b,0x07);//扫描位数限制,设置为8位
disp(0x0c,0x01);//关闭模式,设置为不关闭
//disp(0x0f,0x00);//测试寄存器,设置为不测试
display();
disp(0x0f,0x01);//测试寄存器,测试
}
/*
void flash_led(void)
{
disp(0x0c,0x01);//关闭模式,设置为不关闭
delay(0x4fff);
disp(0x0c,0x00);//关闭模式,设置为关闭
delay(0x4fff);
}
*/
void blank(void)//显示黑屏
{
uchar i;
for(i=0;i<8;i++)
dispbuf[i]=0x10;
}
void disp_err(uchar n)//显示错误号n
{
blank();//关led显示
dispbuf[7]=0xe;//E
dispbuf[6]=23;//r
dispbuf[5]=n;//错误号
display();//显示缓冲区
}
void disp_num(long num)//显示整数
{
uchar i;
char fu=0;
EA=0;
if(num<0)//负数的情况
{
fu=1;
num*=(-1);
}
if(num>99999999)
{
//num=0;
//disp_err(1);//显示错误提示0
//return;
}
dispbuf[0]=num%10;//显示个位
num/=10;
for(i=1;i<8;i++)//显示其余7位
{
if(num==0)
dispbuf[i]=0x10;//黑屏
else
dispbuf[i]=num%10;
num/=10;
}
//dispbuf[2]+=31;//在第三位显示小数点
if(fu)
dispbuf[7]=17;//"-"
display();
EA=1;
}
// Display the data of the display buffer.
/*
void disp_bcd(uchar x,uchar dt)
{
EA=0;
dispbuf[7-x*2]=(dt>>4)&0x0f;
dispbuf[6-x*2]=dt&0x0f;
display();
EA=1;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -