#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单片机) 哪位高手给解释一下后面的温度转换,谢谢!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)