led数码管显示程序

led数码管显示程序,第1张

#include"at89x51h"

#define uchar unsigned char

#define uint unsigned int

/ 全局变量定义部分 /

//硬件设计接口不同,要修改下一行

uchar code acLEDCS[]={0x7f,0xbf,0xdf,0xed}; / 位选地址码,“0”有效,位选接的是P2口高4位 /

uchar code acLedSegCode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c};/ 段码 /

uchar acLED[4]; / 显示缓冲区 /

char cScanIndex; / 位选指针0~3 /

uint t=0;

/ 数码管显示函数 /

void Display(void)

{

// 添加要显示的数据(变量)

acLED[3]=acLedSegCode[t/1000]; / LED显示第1位 /

acLED[2]=acLedSegCode[t%1000/100]; / LED显示第2位 /

acLED[1]=acLedSegCode[t%100/10]; / LED显示第3位 /

acLED[0]=acLedSegCode[t%10]; / LED显示第4位 /

}

/ 主函数 /

void main(void)

{

/ 定时器初始化 /

TMOD= 0x02; / 定义定时器0工作于方式2(8位自动重装) /

TH0 = -200; / 8位自动重装定时器约每100uS中断1次,9216次为1秒 /

TL0 = -200;

TR0 = 1;

ET0 = 1;

EA = 1; / 开总中断 /

while(1)

{

Display();

}

}

void IntT0(void) interrupt 1 / 定时器0中断,完成1秒定时和LED延时 /

{

t++;

if(t==10000)

t=0;

P0 = 0; / 先清显示再换位选 /

P2 = acLEDCS[cScanIndex]; / 送位选数据 /

P0 = acLED[cScanIndex++]; / 送显示数据,位选指针移位 /

cScanIndex &= 3; / 位选指针回位 /

}

传一个例程给你看看

/

程序功能:用中断方式读取四个独立式按键键值,同时将

按键的键值在数码管上显示出来

----------------------------------------------------

测试说明:按动K1~k4四个按键,观察数码管显示

/

#include <msp430x14xh>

#include "BoardConfigh"

#define keyin (P1IN & 0x0f)

//数码管7位段码:0--f

uchar scandata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar KeyVal = 0; // 按键的键值

void delay(void);

/主函数/

void main( void )

{

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗

BoardConfig(0x88); //打开数码管,关闭流水灯和电平转换

P1IES = 0x0f; // P10~P13选择下降沿中断,按键按下时为低电平

P1IE = 0x0f; // 打开中断使能

P1DIR = BIT7; //设置P10~P3为输入状态,P7为输出

P1OUT = 0;

P4DIR = 0xff;

P5DIR = 0xff;

P4OUT = 0x3f;

P5OUT = 0xf7;

_EINT(); //打开全局中断控制位

while(1)

{

LPM1;

P4OUT = scandata[KeyVal];

}

}

/

函数名称:delay

功 能:用于消抖的延时

参 数:无

返回值 :无

/

void delay(void)

{

uint tmp;

for(tmp = 12000;tmp > 0;tmp--);

}

/

函数名称:PORT1_ISR

功 能:P1端口的中断服务函数

参 数:无

返回值 :无

/

#pragma vector=PORT1_VECTOR

__interrupt void PORT1_ISR(void)

{

if(P1IFG & 0x0f)

{

switch(P1IFG)

{

case 0x01:

if(keyin == 0x0e) //如果是第一个按键被按下

{

delay();

if(keyin == 0x0e)

{

while(keyin != 0x0f); //等待按键放开

KeyVal = 1;

LPM1_EXIT;

P1IFG = 0;

return;

}

}

case 0x02:

if(keyin == 0x0d) //如果是第二个按键被按下

{

delay();

if(keyin == 0x0d)

{

while(keyin != 0x0f); //等待按键放开

KeyVal = 2;

LPM1_EXIT;

P1IFG = 0;

return;

}

}

case 0x04:

if(keyin == 0x0b) //如果是第三个按键被按下

{

delay();

if(keyin == 0x0b)

{

while(keyin != 0x0f); //等待按键放开

KeyVal = 3;

LPM1_EXIT;

P1IFG = 0;

return;

}

}

case 0x08:

if(keyin == 0x07) //如果是第四个按键被按下

{

delay();

if(keyin == 0x07)

{

while(keyin != 0x0f); //等待按键放开

KeyVal = 4;

LPM1_EXIT;

P1IFG = 0;

return;

}

}

default:

while(keyin != 0x0f); //等待按键放开

//KeyVal = 0;

//LPM1_EXIT;

P1IFG = 0;

return;

}

}

}

//例程来自LT-1B的程序例子

从DS18B20读取的温度数据,共有11bit:BIT10~BIT0。

每一位,都代表一种十进制数:

BIT0为1,就代表:00625;

BIT1为1,就代表:0125;

BIT2为1,就代表:025;

……

为0就是代表0。

本程序,就是分别判断 BIT0、BIT1、BIT10,

如果为1则然后在十进制数中,分别加上625、125、25。

如下就是判断 BIT0 的:

if(temper & BIT0)

{

dN[0] = 5;

dN[1] = 2;

dN[2] = 6;

}

如下就是判断 BIT1 的:

if(temper&BIT1)

{

dN[1] += 5;

dN[2] += 2;

dN[3] += 1;

}

……

说实话,还从来没有见过有谁,竟能编写出来这么笨的程序。

//msp430F149

44矩阵键盘P1口中断扫描

#include<msp430x14xh>

#define

KEY_DIR

P1DIR

#define

KEY_OUT

P1OUT

#define

KEY_IN

P1IN

#define

KEY_IE

P1IE

#define

KEY_IES

P1IES

#define

KEY_IFG

P1IFG

/全局变量/

unsigned

char

Key_Val;

//存放键值

void

CtrlKey(unsigned

char

sw);

//控制键盘开关//sw=0关

sw=1开

/

函数名称:Init_Keypad

能:初始化扫描键盘的IO端口

数:无

返回值

:无

/

void

Init_Keypad(void)

{

KEY_DIR

=

0x0f;

//P10~P13设置为输出状态,P14~P17输入

状态(上拉H)

KEY_OUT=0;

KEY_IES

=0xf0;

//P14~P17允许中断

KEY_IE

=0xf0;

//P14~P17下降沿触发中断

KEY_IFG=0;

//中断标志清0

Key_Val

=

0;

}

/

函数名称:Check_Key

能:扫描键盘的IO端口,获得键值

数:无

返回值

:无

/

//p14\5\6\7

接上拉电阻

/

key_Val

对应键值

列:[p14]

[p15]

[p16]

[p17]

行:

[p13]→

1

2

3

4

[p12]→

5

6

7

8

[p11]→

9

10

11

12

[p10]→

13

14

15

16

/

void

Check_Key(void)

{

unsigned

char

row

,col,tmp1,tmp2;

unsigned

char

keymap[]

=

{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};//设置键盘逻辑键值

与程序计算键值的映射

tmp1

=

0x08;

for(row

=

0;row

<

4;row++)

//行扫描

{

KEY_OUT

=

0x0f;

//P14~P17输出全1

KEY_OUT

-=

tmp1;

//P14~p17输出四位中有一个为0

tmp1

>>=1;

if((KEY_IN

&

0xf0)<0xf0)

//是否P1IN的P10~P13中有一位为0

{

tmp2

=

0x10;

//

tmp2用于检测出哪一位为0

for(col

=

0;col

<

4;col++)

//

列检测

{

if((KEY_IN

&

tmp2)

==

0x00)

//

是否是该列,等于0为是

{

Key_Val

=

keymap[row4

+

col];

//

获取键值

return;

//

退出循环

}

tmp2

<<=

1;

//

tmp2右移1位

}

}

}

}

/

函数名称:delay

能:延时约15ms,完成消抖功能

数:无

返回值

:t=

tmp5clk

根据使用时钟调整tmp值

/

void

delay(void)

{

unsigned

int

tmp;

for(tmp

=

12000;tmp

>

0;tmp--);

}

/

函数名称:Key_Event

能:检测按键,并获取键值

数:无

返回值

:无

/

void

Key_Event(void)

{

unsigned

char

tmp;

KEY_OUT

=0;

//

设置P1OUT全为0,等待按键输入

tmp

=

KEY_IN;

//

获取

p1IN

if((tmp

&

0xf0)

<

0xf0)

//如果有键按下

{

delay();

//消除抖动

Check_Key();

//

调用check_Key(),获取键值

}

}

/

控制打开或者关闭键盘中断

SW=

0:关闭;

ELSE:打开

/

void

CtrlKey(unsigned

char

sw)

{

if(sw==0)

KEY_IE

=0;

//关闭端口中断

else

KEY_IE

=0xf0;

//打开端口中断

}

/端口1按键中断/

#pragma

vector=PORT1_VECTOR

__interrupt

void

Port(void)

{

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

{

Key_Event();

if(Key_Val!=0)

//键值!=0有键按下

{

CtrlKey(0);

//关键盘中断

}

}

KEY_IFG=0;KEY_OUT=0;

//清中断标志

}

这里你要学习AD转换寄存器设置,UART的寄存器设置,就是说数据采集通过AD得到数字值,然后要对数据进行校正,通常是要通过KX+B=Y的方法来进行校验,传上网络要对串行口进行设置完以后,进行程序的编程

#include<pich>

#define uchar unsigned char

#define uint unsigned int

__CONFIG(0x3B31);

const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void delay(uint x)

{

uint a,b;

for(a=x;a>0;a--)

for(b=110;b>0;b--);

}

void main()

{

uchar i;

TRISD=0x00;

TRISA=0x00;

PORTA=0;

while(1)

{

RA5=1;

PORTD=table[6];

delay(5);

PORTA=0;

RA4=1;

PORTD=table[5];

delay(5);

PORTA=0;

RA3=1;

PORTD=table[4];

delay(5);

PORTA=0;

RA2=1;

PORTD=table[3];

delay(5);

PORTA=0;

RA1=1;

PORTD=table[2];

delay(5);

PORTA=0;

RA0=1;

PORTD=table[1];

delay(5);

}

}

这是pic芯片的程序,希望对你有帮助

以上就是关于led数码管显示程序全部的内容,包括:led数码管显示程序、关于msp430外部中断的问题,程序只能中断一次,然后就不能中断了。请高手解答、郭天祥写的数码管显示ds18b20温度数值转换(msp430单片机) 哪位高手给解释一下后面的温度转换,谢谢!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9879374.html

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

发表评论

登录后才能评论

评论列表(0条)

保存