📄 led.c
字号:
#include <msp430x13x.h>
unsigned int DispBuf[4];
unsigned char x[2]={1,2},y1=20,y2=00,y3=00,s01;
unsigned int Period,OldCap,Start,end;
unsigned int overflow;
unsigned int Fline;
void HextoBCD(void);
void Init(void);
void delay(unsigned int v)
{
while(v!=0)v--;}
void send_wei(unsigned char sect_code) //sect_code为段码
{
unsigned char i=0;
P5OUT&=~0x20; //rclk置低电平,允许存储
for(i=0;i<8;i++) //转换的数据为8位
{
P5OUT&=~0x40; //SRCLK置低电平
if((sect_code&0x80)==0x80) //判断段码数据的第一位是1或者0
P5OUT|=0x80; //如果是1,送数据1给595
else
P5OUT&=~0x80; //如果是0,送数据0给595
P5OUT|=0x40; //SRCLK置高电平,上升沿转换
sect_code=sect_code<<1; //段码左移一位
}
P5OUT|=0x20; //RCLK置高电平,存储结束
}
void LED_DISP(unsigned char *dispbuffer)
{
unsigned char seg[]={0x3f,0x06,0x9b,0x8f, //显示字符的段码表
0xa6,0xad,0xbd,0x07,
0xbf,0xaf,0xb7,0xbc,
0x39,0x9e,0xb9,0xb1,
0x00,0x98,0xb6,0xb4,
0x0e,0x38,0x94,0x9c,
0xb3,0x90,0x3e,0x1c,
0xae,0x80,0x88,0xa3};
unsigned char i=0;
unsigned char temp=0x01;
for(i=0;i<5;i++)
{
P5DIR=0xff;
send_wei(seg[*(dispbuffer+i)]); //送段码
P5OUT=temp; //选通位
temp=temp<<1; //为下一位作准备
delay(500); //延时一会
}
}
//
//主程序
void main(void)
{
unsigned char DSP1[]={0x04,0x03,0x02,0x01,0x10}; //要显示字符的段码rEAD
//unsigned char DSP2[]=DispBuf[]
while(1)
{
unsigned int i=0,j=0,k=0,m=0;
for(k=0;k<3;k++)
{
x[k]=50000000;
Fline=x[k]/Period;
}
for(i=0;i<10;i++)
{
LED_DISP(DSP1);
//LED_DISP(DispBuf[]);
//LED_DISP(Fline);
}
for(j=0;j<5;j++)
{
delay(50000);
}
}
}
void HextoBCD(void) //HexToBcd(Word Hexs)
{
unsigned int va = 1000;
unsigned int i;
unsigned int Hexs=0xfff; //4095
for(i = 0;i < 3;i++)
{
DispBuf[i] = 0; //
while ((Hexs >= va) && (va > 9))
{
Hexs -= va; //
DispBuf[i]++; //
}
va /= 10; //
}
DispBuf[i] = Hexs; //
}
void Init(void)
{
WDTCTL=WDTPW+WDTHOLD; //关闭看门狗
BCSCTL1=XTS+DIVA_3; //XTS工作在高频,DIVA0+DIVA1--作8分频
P4SEL |= 0x06;
P4DIR = 0xF9;
TACTL=TASSEL1+TACLR;
TBCTL=TBSSEL0+TBCLR+TBIE; //TASSEL1选择ACLK,定时器内容清零
TBCCTL1=BITF+BITC+BITB+BIT8+BIT4; //铺捉比较寄存器允许中断
TBCCR0=500; //500kHz,设置1000,正好2毫秒
P5DIR|=0Xff;
TACTL|=MC0;
TBCTL|=MC1;
P5OUT&=0X00; //5个数码管全部不选通
_EINT();
/* ADC12 Settings:
P6SEL = 0xFF; // 所有P6口线均为ADC模块使用
ADC12CTL0 &=~ 0x02; // 在进行设置时首先复位ADC的转换使能
// 选则参考电压和输入管脚
ADC12MCTL0 = 0x00; // Ref = AVss, AVcc; Input = A0
ADC12MCTL1 = 0x8a; // Ref = AVss, AVcc; Input = A10
// ADC12MCTL1 是最后一个转换通道
ADC12CTL1 = 0x0202; // ADC12SC 位触发采样和保持
// 采样脉冲由采样定时器产生
// 时钟源:内部振荡器
// 时钟分频: 1
// 转换模式: 多通道、单次转换
ADC12CTL0 = 0x0010+SHT0_8;
ADC12CTL0 |= 0x02; // 使能ADC转换
*/
}
interrupt[TIMERB1_VECTOR] void Timer_B1 (void)
{
switch (TBIV)
{
case 2:
if(CCTL1&CM0)
{
CCTL1=(CCTL1&(~CM1))|CM0;
Start=TBR;
overflow=0;
}
else if(CCTL1&CM1)
{
CCTL1=(CCTL1&(~CM0))|CM1;
end=TBR;
}
Period=end-Start;
break;
case 10:
overflow++;
break;
default:break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -