📄 八位串行led显示驱动器max7219 7211应用程序应用程序.txt
字号:
分享]八位串行LED显示驱动器MAX7219 7211应用程序.ASM
程序清单:
ORG 0000H
MAX7219:DIN BIT P1.1 ;定义变量
CLK BIT P1.2
LOAD BIT P1.1
LED_BF EQU 50H ;显示数据首址
AJMP MAIN
MAIN: MOV SP.#70H
LCALL PROCESS ;设置MAX7219初始值
LCALL DISPLAY ;显示
WAIT; ;其他程序省略
SJMP WAIT
;MAX7219初始化子程序
PROCECC :MOV A,#0BH
MOV B,#07H
LCALL W_7219
MOV A,#09H
MOV B,#00H
LCALL W_7219
MOV A,##0AH
MOV B,#09H
LCALL W_7219
MOV A,#0CH
MOV B,#01H
LCALL W_7219
RET
;MAX7219显示子程序
DISPLAY:MOV R0,#LED_BF
MOV R4,#01H
MOV R3,#08H
C_DISP:MOV A,@R0
MOV B,A
MOV A,R4
LCALL W_7219
INC R0
INC R4
DJNZ R3,C_DISP
RET
W_7219:CLR LOAD
LCALL SD_7219
MOV A,B
LCALL SD_7219
SETB LOAD
RET
SD_7219:MOV R6,#08H
C_SD:NOP
CLR CLK
RLC A
MOV DIN,C
NOP
SETB CLK
DJNZ R6,C_SD
RET
7219显示程序
#include
#define uchar unsigned char
sbit DIN=P0^7;
sbit LOAD=P0^1;
sbit CLK=P0^2;
void display(uchar addr, uchar dat)
{
uchar i,ADS;
LOAD=0;
CLK=0;
ADS=addr;
for(i=8;i>0;i--)
{
DIN=ADS&0x80;
ADS0;i--)
{
DIN=ADS&0x80;
ADS<<=1;
CLK=1;
CLK=0;
}
LOAD=1;
}
void main(void)
{
display(0x0f,0x0);/*不测试*/
display(0x0A,0x05);/*亮度选择*/
display(0x09,0xff);/*译码选择*/
display(0x0B,0x06);/*扫描LED的个数*/
display(0x0C,0x01);/*启动*/
while(1)
{
display(1,0x7);
display(2,0x6);
display(3,0x5);
display(4,0x4);
display(5,0x01);
display(6,0x01);
display(7,0x01);
display(8,0x01);
}
}
MAX197程序
[ 2005-9-12 21:50:25 | By: 菠菜 ]
#i nclude <at89x52.h>
#i nclude <intrins.h>
#i nclude<absacc.h>
#i nclude "key.h"
#i nclude "led.h"
extern uchar key;//存键值
extern bit key_flag;//键按下标志
extern uchar led_buf[];//显示缓冲区
#define nop8() {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
#define IN_0_5_BASE 1.220703 // 5/4096,量程为0-5v每单位电压大小
#define IN_0_10_BASE 2.441406 // 10/4096 0-10v
#define IN_N5_5_BASE 2.441406 // 10/4096 -5v-5v
#define IN_N10_10_BASE 4.882813 // 20/4096 -10v-10v
//_cs HBEN
#define ADCCOM XBYTE[0x7fff] //0 1 控制命令字地址
#define ADLO XBYTE[0x3fff] //0 0 低8位地址,
#define ADHI XBYTE[0x7Fff] //0 1 高四位地址
//内部时钟 内部采样 0 to 5 通道0
uchar channel=0; //PD1 PD0 ACQMOD RNG BIP A2 A1 A0
uchar volatile bdata command_byte=0x40; //0 1 0 0 0 0 0 0
sbit PD1=command_byte^7;
sbit PD0=command_byte^6;
sbit ACQMOD=command_byte^5;
sbit RNG=command_byte^4;
sbit BIP=command_byte^3;
//###################################################
//sbit _WR=P3^6;
//sbit _RD=P3^7;
//sbit CS=P2^7; //引脚连接
//sbit HBEN=P2^6;
//###################################################
void main(void)
{
uchar msb,lsb;
uint volatile data volt;
uchar input_mode;
CS=HBEN=1;
key_init();
led_buf[7]=channel;
led_buf[6]=12+((uchar)BIP<<1)+(uchar)RNG;
//BIP RNG INPUT RANGE (V) 显示
// 0 0 0 to 5 a
// 0 1 0 to 10 b
// 1 0 ±5 c
// 1 1 ±10 d
led_update();
while(1)
{
if(_testbit_(key_flag))
{
if(read_key())//读按键
{
if(key==KEY_B)
{
ADCCOM=command_byte+channel;
nop8();//等待8us让其完成转换
ADCCOM=command_byte+channel; //让其测三次之后就可以得到稳定的电压了。
nop8();//等待8us让其完成转换
ADCCOM=command_byte+channel;
nop8();//等待8us让其完成转换
msb=ADHI&0x0f;
lsb=ADLO;
volt=msb*256+lsb;
lclear(0,5);
input_mode=((uchar)BIP<<1)+(uchar)RNG;//由量程来确定如何处理数据
switch(input_mode)
{
case 0:
volt*=IN_0_5_BASE;
break;
case 1:
volt*=IN_0_10_BASE;
break;
case 2:
volt*=IN_N5_5_BASE;
if(volt>5000)//如是为负电压
{
led_buf[0]=LED_NEG;
volt=10000-volt;
}
else
led_buf[0]=LED_BLANK;//显示负号
break;
case 3:
volt*=IN_N10_10_BASE;
if(volt>10000)//如是为负电压
{
led_buf[0]=LED_NEG;
volt=20000-volt;
}
else
led_buf[0]=LED_BLANK;//显示负号
break;
}
if(volt>9999)
lprinti(volt,0x35,1);//格式输出
else
{
lprinti(volt,0x34,2);//格式输出
}
led_update();
}
else if(key==KEY_C)//按键选择量程为0-5v
{
BIP=0;
RNG=0;
}
else if(key==KEY_D)//按键选择量程为0-10v
{
BIP=0;
RNG=1;
}
else if(key==KEY_E)//按键选择量程为-5-5v
{
BIP=1;
RNG=0;
}
else if(key==KEY_F)//按键选择量程为-10-10v
{
BIP=1;
RNG=1;
}
else if(key<KEY_8)//选择通道0~7
{
channel=key;
led_buf[7]=channel;//通道送显
}
led_buf[6]=12+((uchar)BIP<<1)+(uchar)RNG;//量程送显
led_update();
}
}
}
}
阅读全文(160) | 回复(0) | 引用通告(0) | 编辑
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -