嵌入式爱好者

查看: 8692|回复: 0

苦思已久,关于裸机串口控制LED(自己想的)

[复制链接]

1

主题

1

帖子

10

积分

扫一扫,手机访问本帖
发表于 2013-6-23 08:59:59 | 显示全部楼层 |阅读模式
程序如下:
#include\"s3c2440.h\"
#include<stdio.h>
#include<stdarg.h>

char num=1;

void Uart_Init()
{
        //ULCON0 &=0xffffff00;
        //ULCON0 |=0x03;
        //UCON0=0x0805;
        ULCON0=0x03;
        UCON0=0x245; //发送中断为电平方式,接收中断为边沿方式,禁止超时中断,允许产生错误状态中断,禁止回送模式,禁止中止               
                        //信号,传输模式为中断请求模式,接收模式也为中断请求模式。
        UFCON0=0x0;
        UBRDIV0=0x1A;//((int)(400000000/16/baud+0.5)-1);//Baud rate is 115200
       
        GPHUP=0X00;
        GPHCON=(2<<6)|(2<<4);        //选择TXD0 RXD0
}

//*************************
//发送单字节函数
//*************************
void Uart_SendByte(char data)
{
        if(data==\'\\n\')                        //判断是否为回车
        {
                while(!(UTRSTAT0&0x2));        //等待发送数据,寄存器为空
                UTXH0=\'\\r\';
        }
        while(!(UTRSTAT0&0x2));                //等待发送数据,寄存器为空
        UTXH0=data;
}

//*************************
//接受单字节函数
//************************
char Uart_ReciveByte()
{
        while(!(UTRSTAT0&0X01));        //等待接受数据
        return URXH0;                                //返回寄存器中的数据
}

//**************************
//发送字符串函数
//**************************
void Uart_SendString(char *p)
{
        while(*p)
                Uart_SendByte(*p++);
}

//**************************
//打印函数
//**************************
void Uart_Printf(char *fmt,...)
{
    va_list ap;
    char str[255];
    va_start(ap,fmt);
    vsprintf(str,fmt,ap);
    Uart_SendString(str);
    va_end(ap);
}

void LED_Init()
{
        GPBCON|=((1<<10)|(1<<12)|(1<<16)|(1<<20));
        //GPBCON = 0x1dd7fc;
        GPBDAT=((1<<5)|(1<<6)|(1<<8)|(1<<10));
       
        GPBUP=0x00;                //禁止上拉
}

void LED_Light(int n)
{
        Uart_Init();
        LED_Init();
        switch(n)
        {
        case 1:GPBDAT=~(1<<5);
                        break;
        case 2:GPBDAT=~(1<<6);
                        break;
        case 3:GPBDAT=~(1<<8);
                        break;
        case 4:GPBDAT=~(1<<10);
                        break;
        default:GPBDAT=((1<<5)|(1<<6)|(1<<8)|(1<<10));
        }
       
        if(n<5)
                Uart_Printf(\"nuber %d is lighting\\n\",n);
        else
                Uart_Printf(\"none!\\n\");
}

int main()
{
        Uart_Init();
        LED_Init();
        while(1)
        {
                Uart_Printf(\"Please enter which light:\\n\");
                num=Uart_ReciveByte();
                LED_Light(num);
        }
        return 0;
}
在思路上是通过串口接收到所需要点亮的灯号,从而点亮。用ADS仿真的时候卡在了刚进入main函数位置。难道是初始化的问题?求大神解答。两个初始化函数分别测试过没有问题。




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2024-11-23 12:02

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表