求4位LED的显示程序

求4位LED的显示程序,第1张

我只写个很简单的

不知道你用的是什么数码管?我写的是一个cd4511基于c51单片机的。

#include <REGX51.H>

#include <absacc.h>

#include <INTRINS.H>

#define VF 4.94 //电路板对应转换范围电压,转换后对应0xff

#define IN0 XBYTE[0x7ff8]

typedef unsigned char uchar

sbitad_busy=P3^1//ad转换器忙

sbitcd4511_1=P3^2//cd4511锁存使能位

sbitcd4511_2=P3^3

sbitda0832_cs=P3^4

sbitbj=P3^5

sbitkey=P3^0

float result[8]

uchartemp

int ADC0[8]={0}

uchar s,g

int t

bit p

void DELAY(uchar x) //定义短时间延时函数

{

uchar i

for(i=0i<xi++)

x--

}

void AD0809() //八路模拟量循环转化函数

{

uchar i=0

uchar xdata * data ad_adr

ad_adr=&IN0

*ad_adr=0 //启动一次AD转换,

_nop_ ()

_nop_ ()//空 *** 作等待

_nop_ ()

while(!ad_busy) //检测转换是否完成

temp=*ad_adr

ADC0[0]=*ad_adr

*(result+i)=temp*VF/255 //计算实际电压值

}

void main()

{

while(1)

{

AD0809()

_nop_ ()

if(key==1)

{

t=result[0]*10

s=t/10

g=t%10

cd4511_1=1

cd4511_2=1

bj=1

DELAY(200)

P1=s

cd4511_1=0

DELAY(200)

cd4511_1=1

P1=0X00

P1=g

cd4511_2=0

DELAY(200)

cd4511_2=1

DELAY(200)

P1=0X00

da0832_cs=0

DELAY(200)

P1=ADC0[0]

DELAY(200)

da0832_cs=1

P1=0X00

if((s<1)||(s>3))bj=0

else

bj=1

}

if(key==0)

{

t=result[0]*10

s=t/10

g=t%10

if(s<1)

{

s=1

g=0

}

if(s>3)

{

s=4

g=0

}

cd4511_1=1

cd4511_2=1

bj=1

DELAY(200)

P1=s

cd4511_1=0

DELAY(200)

cd4511_1=1

P1=0X00

P1=g

cd4511_2=0

DELAY(200)

cd4511_2=1

DELAY(200)

P1=0X00

da0832_cs=0

DELAY(200)

P1=ADC0[0]

DELAY(200)

da0832_cs=1

P1=0X00

if((s<1)||(s>3))bj=0

else

bj=1

}

}

}

我是用P1口的低四位发送数据的,好好看看,这是个两位的。

下面是我做的c8051f020和max7219的通信做的,直接调用的话改动一下可以最多显示8位

#include <C8051F020.H> //头文件

#define SYSCLK 22118400

/*-----------------------------------------------------------------------*/

typedef unsigned char uchar

#define Addr_No_Op0x00 //不工作寄存器地址

#define Addr_Digit0 0x01

#define Addr_Digit1 0x02

#define Addr_Digit2 0x03

#define Addr_Digit3 0x04

#define Addr_Digit4 0x05

#define Addr_Digit5 0x06

#define Addr_Digit6 0x07

#define Addr_Digit7 0x08

#define Addr_Decode_Mode 0x09//译码模式寄存器地址

#define Addr_Intensity0x0a//亮度控制寄存器地址(max7219)

#define Addr_Scan_Limit 0x0b//扫描控制寄存器地址

#define Addr_Shutdowm 0x0c//掉电模式寄存器地址

#define Addr_Display_Test 0x0f//显示检测寄存器地址

/*-----------------------------------------------------------------------*/

bit G//标志定时器三的中断结束

sbit Max7219_Din=P3^5

sbit Max7219_Load=P3^6

sbit Max7219_Clk=P3^7

/*-----------------------------------------------------------------------*/

sfr16ADC0=0xBE//ADC0寄存器

sfr16DAC0=0xD2//DAC0寄存器

sfr16TMR3RL=0x92

sfr16TMR3=0x94

/*-----------------------------------------------------------------------*/

unsigned int Au

unsigned int ADC[20]//存放ADC0的转换值

unsigned char key //全局变量键盘键值

float K //全局变量数据转换

float DAC[20]//存放DAC0的转换值

float Ag//全局变量数据转换

/*-----------------------------------------------------------------------*/

unsigned char code max7219_7led_code[18]={0x7e,0x30,0x6d,0x79, //0-1-2-3

0x33,0x5b,0x5f,0x70, //4-5-6-7

0x7f,0x7b,0x01,0x4e, //8-9-"-"-E

0x37,0x0e,0x67,0x00}//H-L-P-空白

/*-----------------------------------------------------------------------*/

void PORT_Init(void) //端口初始化

{

XBR2=0x40

P2MDOUT=0x0f//P2口高四位键盘输入

P3MDOUT=0x1f//P3口低四位键盘输出P3.5,P3.6,P3.7为7219串行通信

}

/*-----------------------------------------------------------------------*/

void SYSCLK_Init(void)//时钟初始化

{

unsigned char i

WDTCN=0xde

WDTCN=0xad //关看门狗,默认使能

OSCXCN=0x67

for(i=0i<255i++)

while(!(OSCXCN&0x80))

OSCICN=0x88 //外部时钟22.1184Mhz

}

/*-----------------------------------------------------------------------*/

void wr_max7219(uchar addr,uchar dat)//7219数据读写函数

{

uchar i

Max7219_Load=0

Max7219_Clk=0

for(i=0i<8i++)

{

Max7219_Din = (bit)(addr&0x80)

addr=addr<<1

Max7219_Clk=1

Max7219_Clk=0

}

for(i=0i<8i++)

{

Max7219_Din=(bit)(dat&0x80)

dat=dat<<1

Max7219_Clk=1

Max7219_Clk=0

}

Max7219_Load=1

Max7219_Load=0

}

/*-----------------------------------------------------------------------*/

void delays(unsigned char x)//延时子函数

{

unsigned char count

for(count=0count<10count++)

x--

}

/*-----------------------------------------------------------------------*/

unsigned char Key4_4(void) //扫描键盘

{

unsigned char i=0,j=0

unsigned char Key=0xff,LINE=0x0E

while(LINE!=0xff)

{

P3=LINE

Key=P2

if((Key&0xf0)!=0xf0)

{

delays(2) //消除键盘抖动

Key=P2

if((Key&0xf0)==0xf0)

{

i++

LINE<<=1

LINE|=0x01

continue

}

switch(Key>>4)

{

case 0x0e:j=0break

case 0x0d:j=1break

case 0x0b:j=2break

case 0x07:j=3break

default:break

}

while((P2&0xf0)!=0xf0)//监测键盘d起无连击功能(键盘释放算键值)

return i*4+j

}i++

LINE<<=1

LINE|=0x01

}

return 0xff

}

/*-----------------------------------------------------------------------*/

void ADC0_Init(void)//模数转换初始化

{

REF0CN=0x03//REF0CN=0x07

AMX0CF=0x00 //单端输入

AMX0SL=0x00//AMX0SL=0x0f

ADC0CF=0x1f<<3 //转换时钟,内部增益

ADC0CN=0x80//使能ADC

}

/*-----------------------------------------------------------------------*/

void DAC0_Init(void)//数模转换初始化

{

REF0CN=0x03

DAC0CN=0x80//DAC0CN=0x84使能DAC0

DAC0L=0x00 //DAC的低位初值为0;

DAC0H=0x00 //DAC 的高位初值为0

}

/*-----------------------------------------------------------------------*/

void Timer3_Init(int counts)//定时器三的初始化

{

TMR3CN=0x00

TMR3RL=-counts

TMR3=0xffff

EIE2|=0x01

TMR3CN|=0x04

}

/*-----------------------------------------------------------------------*/

void Timer3_ISR(void) interrupt 14 //定时器中断服务程序定定时0.1s否则益处

{

static j

TMR3CN&=0x7f//软件清中断标志位

if((++j%10)!=0) return

G=1

}

/*-----------------------------------------------------------------------*/

void main()

{

unsigned char a,b,c,d,e,f,g,h

unsigned int Q//定义强制转换类型为整型

SYSCLK_Init()

PORT_Init()

ADC0_Init()

DAC0_Init()

Timer3_Init(SYSCLK/12/100)

wr_max7219(Addr_Shutdowm,0x01)

wr_max7219(Addr_Scan_Limit,0x07)

wr_max7219(Addr_Intensity,0x0f)

wr_max7219(Addr_Decode_Mode,0x00)

EA=1

G=0

while(1)

{

while(!G)

G=0

AD0INT=0

AD0BUSY=1

while(!AD0INT)

ADC[0]=ADC0 //读ADC0的当前值

K=((ADC[0]*2.43)/4096)//6.0为衰减电路的衰减倍数

Q=K*100 //扩大100倍进行运算

{

a=Q/100

b=((Q%100)/10)

c=Q%10

d=10 //显示横杠

e=10 //显示横杠

f=Au/100 //Au为定义数据转换类型

g=(Au%100)/10

h=Au%10

}

{

wr_max7219(Addr_Digit0,max7219_7led_code[a]|0x80)

wr_max7219(Addr_Digit1,max7219_7led_code[b])

wr_max7219(Addr_Digit2,max7219_7led_code[c])

wr_max7219(Addr_Digit3,max7219_7led_code[d])

wr_max7219(Addr_Digit4,max7219_7led_code[e])

wr_max7219(Addr_Digit5,max7219_7led_code[f])

wr_max7219(Addr_Digit6,max7219_7led_code[g]|0x80)

wr_max7219(Addr_Digit7,max7219_7led_code[h])

}

key= Key4_4() //键值处理

switch(key)

{

case 0x00:DAC0+=0x000bbbreak//DAC0键控和步进量(+6db)

case 0x01:DAC0-=0x000bbbreak//DAC0键控和步减量(—6db

}

DAC[0]=(DAC0*3.3)/4096 //控制电压的当前值

Ag=(40.0*DAC[0]+11.5) //当前增益计算值初始值为10

Au=Ag*10//扩大10倍进行运算

}

}

CD4511译码芯片的具体作用:

把一个四位的二进制输入abcd转化成一个七位的输出,并接在一个led灯管的七个输入端上,来实现从0-8的输出。

译码器是电子技术中的一种多输入多输出的组合逻辑电路,负责将二进制代码翻译为特定的对象(如逻辑电平等),功能与编码器相反。译码器一般分为通用译码器和数字显示译码器两大类。数字电路中,译码器(如n线-2n线BCD译码器)可以担任多输入多输出逻辑门的角色,能将已编码的输入转换成已编码的输出,这里输入和输出的编码是不同的。

ORG 00H

AJMP MAIN

ORG 30H

MAIN:

MOV 50H,A

DISP:

MOV P2,50H

ACALL   D05S

INC 50H

MOV A,50H

CJNE A,#10,DISP

MOV     50H,#10H

DISP1:

MOV P2,50H

ACALL   D05S

INC 50H

MOV A,50H

CJNE A,#16H,DISP1

AJMP    $

D05S:

MOV R0,#100

MOV R1,#100

MOV R2,#25

DJNZ R2,$

DJNZ R1,$-4

DJNZ R0,$-8

RET

END


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8136770.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存