打印

心痛的看手册 求指教

[复制链接]
1378|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ss么么|  楼主 | 2016-11-5 17:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚开始学430的时候   有很多大神  叫我看手册  我希望大神们可以指导一下看手册到底是什么意思 呢  要注意那些重点呢  因为我写代码到现在都是参考代码  然后不懂的就百度 然后懵懵懂懂走到现在的菜鸟水平  另外求大神们帮忙看个lcd1602显示程序   编译没有问题


#ifndef LCD1602_H_
#define LCD1602_H_



typedef unsigned char uchar;
typedef unsigned int uint;

uchar LCD_Check_busy();
void LCD_Write_Com(unsigned char com);
void LCD_Write_data(unsigned int data);
void LCD_Clear();
void LCDSetCursor(uchar x,uchar y);
void LCDShowStr(uchar x, uchar y,uchar *str);
void LCDOpenCursor();
void LcdCloseCursor();
void LCD_Init();
void Init_Clock();

//**************????????????*****************
//**************????????????*****************
#define  RS BIT0
#define  RW BIT1
#define  E  BIT2
#define  data_dir  P1DIR
#define  data_out  P1OUT //|= 0xf0  //????????????
#define  data_in   P1IN//7???????????????
//*************************************
#define RS_1 P1OUT |= RS //rs = 1
#define RS_0 P1OUT &= ~RS//rs = 0
#define RW_1 P1OUT |= RW;
#define RW_0 P1OUT &= ~RW;
#define E_1  P1OUT |= E  //e = 1
#define E_0  P1OUT &= ~E //e = 0
//*****************????????????******************
//??????us
void delay_1us(uint i)
{
        asm("nop");
}
void delay_us(uint i)
{
        uint j;
        for(j=0;j<i;j++)
                delay_1us(j);
}
//??????ms
void delay_1ms()
{
        uint i;
        for(i=0;i<1140;i++);
        }

void delay_ms(uint i)
{
        uint j;
        for(j=0;j<i;j++)
                delay_1ms(j);
        }


void Init_Clock()
{
        BCSCTL1 = RSEL2 + RSEL1+ RSEL0;

        BCSCTL2 = SELM1 + SELS;
        }


uchar LCD_Check_busy() //????????????   ??????P2??????????????? D7?????????????????????
{
        char busy = 0;
        RS_0;
        RW_1;
        E_1;
        delay_ms(50);
        data_dir &= ~BIT7; //?????????????????????
        busy = data_in & BIT7;
        data_dir |= BIT7;
        data_out &= ~BIT7;
        E_0;
        return busy;
        }

void LCD_Write_Com(unsigned char com)//????????????
{

        //while(LCD_Check_busy());
        RS_0;
        RW_0;

    data_out &= 0x0f;  //????????????
        data_out |= com & 0xf0; //????????????
    E_1;
    delay_ms(50);
        E_0;

        com = com << 4;
    data_out &= 0x0f;
    data_out |= com & 0xf0;
    E_1;
    delay_ms(50);
        E_0;
        }

void LCD_Write_data(unsigned int data)//?????????????????????
{
        //while(LCD_Check_busy());
        RS_1;
        RW_0;

        data_out &= 0x0f;
        data_out |= data & 0xf0;
    E_1;
        delay_ms(50);
        E_0;

        data <<= 4;
        data_out &= 0x0f;
        data_out |= data & 0xf0;
        E_1;
        delay_ms(5);
        E_0;
}

void LCD_Clear()
{
        LCD_Write_Com(0x01);
        delay_ms(50);
        }

void LCDSetCursor(uchar x,uchar y)  //??????????????????
{
        uchar addr;
        if(y == 0)
                addr = 0x00 + x;
        else
                addr = 0x40 +x;
        LCD_Write_Com(addr | 0x80);
        }

void LCDShowStr(uchar x, uchar y,uchar *str)//???????????????
{
        LCDSetCursor(x,y);
        while (*str != '\0')
        LCD_Write_data(*str++);
        }


void LCDOpenCursor()//????????????
{
         LCD_Write_Com(0x0F);
        }

void LcdCloseCursor()//??????????????????
{
        LCD_Write_Com(0x0C);
        }

void  LCD_Init()
{
        delay_ms(500);
        delay_ms(500);
        LCD_Write_Com(0x28);//0x28 = 0010 1000 ??????????????????16*2?????????5*7?????? ???4????????????
        delay_ms(50);
        LCD_Write_Com(0x28);
        delay_ms(50);
        LCD_Write_Com(0x28);
        delay_ms(50);
        E_1;
        delay_us(10);
        E_0;
        delay_ms(50);
        LCD_Write_Com(0x28);
        delay_ms(500);
        LCD_Write_Com(0x01);
        LCD_Write_Com(0x06);
        delay_us(40);
        LCD_Write_Com(0x0C);
        delay_ms(5);
        }

#endif

#include <msp430.h>
#include "lcd1602.h"

void main(void) {
    WDTCTL = WDTPW | WDTHOLD;        // Stop watchdog timer
       
    P1SEL |= 0X00;
    P1DIR |=(BIT0|BIT1|BIT2|BIT4|BIT5|BIT6|BIT7);

    P1OUT &= ~(BIT0|BIT1|BIT2|BIT4|BIT5|BIT6|BIT7);

    Init_Clock();
    LCD_Init();
    LCD_Clear();

    LCDShowStr(0,0,"C X H");
    LCDShowStr(0,1,"hello word!");
    while(1);
}
一开始的时候可以显示字符  但是对比度很暗  
但是一断电在插上USB口就会乱码  然后就是第二行可以显示  第一行不行
然后现在是跑程序  它也不显示了
我觉得大约是我判忙函数的问题   但是同一个程序  我试着注释掉我的判忙函数但是也不行  感觉整个人都斯巴达了

相关帖子

沙发
ss么么|  楼主 | 2016-11-6 09:58 | 只看该作者
换了个新的lcd1602可以显示   但是多次使用CCS写入代码后屏幕开始对比度变低  然后再写入代码无显示   是个很奇怪的现象  

使用特权

评论回复
板凳
gcxzhz| | 2016-11-6 10:34 | 只看该作者
lcd1602 需要使用背光电阻调背光的吧

使用特权

评论回复
地板
ss么么|  楼主 | 2016-11-6 10:49 | 只看该作者
gcxzhz 发表于 2016-11-6 10:34
lcd1602 需要使用背光电阻调背光的吧

我接了1k的电阻接地  一开始的显示是很清清晰  就只有断电再上电会乱码  现在是显示不了

使用特权

评论回复
5
summerdfg| | 2016-11-6 12:58 | 只看该作者
。。。。。一般来说。。。初看一下代码没问题啊。。难道你的供电不对吗

使用特权

评论回复
6
ss么么|  楼主 | 2016-11-6 15:27 | 只看该作者
summerdfg 发表于 2016-11-6 12:58
。。。。。一般来说。。。初看一下代码没问题啊。。难道你的供电不对吗

供电对了 我换了专门的3.3V的lcd显示屏 还是乱码 啊啊  快疯了

使用特权

评论回复
7
icecut| | 2016-11-6 17:04 | 只看该作者
乱码不是问题.你看手册.乱码对应的是啥?建议你先实现一个功能就是清屏.无论什么时候上电就清屏.这个正常了再继续做后面的.

使用特权

评论回复
8
dirtwillfly| | 2016-11-7 08:18 | 只看该作者
手里有一个逻辑分析仪还是很重要的,一般的观察时序都没问题了

使用特权

评论回复
9
cehuafan| | 2016-11-7 22:20 | 只看该作者
这个函数怎么整理的?

使用特权

评论回复
10
cehuafan| | 2016-11-7 22:21 | 只看该作者
ss么么 发表于 2016-11-6 09:58
换了个新的lcd1602可以显示   但是多次使用CCS写入代码后屏幕开始对比度变低  然后再写入代码无显示   是个 ...

看看液晶屏的控制引脚对不对?

使用特权

评论回复
11
ss么么|  楼主 | 2016-11-8 18:15 | 只看该作者
icecut 发表于 2016-11-6 17:04
乱码不是问题.你看手册.乱码对应的是啥?建议你先实现一个功能就是清屏.无论什么时候上电就清屏.这个正常了 ...

我原本是加清屏的  但是我的lcd初始化里面就有写入清屏 我就去掉了

使用特权

评论回复
12
ss么么|  楼主 | 2016-11-8 18:15 | 只看该作者
dirtwillfly 发表于 2016-11-7 08:18
手里有一个逻辑分析仪还是很重要的,一般的观察时序都没问题了

可惜我没有  

使用特权

评论回复
13
ss么么|  楼主 | 2016-11-8 18:16 | 只看该作者
cehuafan 发表于 2016-11-7 22:20
这个函数怎么整理的?

??????什么意思呢???

使用特权

评论回复
14
ss么么|  楼主 | 2016-11-8 18:17 | 只看该作者
cehuafan 发表于 2016-11-7 22:21
看看液晶屏的控制引脚对不对?

这个我是肯定对的

使用特权

评论回复
15
aerwa| | 2016-11-9 08:37 | 只看该作者
延迟时间调短些看看,不需要延迟那么久,几十个nop就可以了。假如中间碰到无显示再调用次初始化LCD看正常不。

使用特权

评论回复
16
ss么么|  楼主 | 2016-11-10 15:02 | 只看该作者
aerwa 发表于 2016-11-9 08:37
延迟时间调短些看看,不需要延迟那么久,几十个nop就可以了。假如中间碰到无显示再调用次初始化LCD看正常不 ...

因为用的是CCS编译   _nop_语句用不了  所以采用了精确延时

使用特权

评论回复
17
ss么么|  楼主 | 2016-11-10 15:03 | 只看该作者
ss么么 发表于 2016-11-8 18:15
我原本是加清屏的  但是我的lcd初始化里面就有写入清屏 我就去掉了

而且  我的清屏是运行正常的   曾经试过  可以正常的跑

使用特权

评论回复
18
chuntian2016| | 2016-11-10 21:42 | 只看该作者
这还是关于lcd控制处理的,注意电源的控制

使用特权

评论回复
19
火山LF| | 2016-11-11 08:19 | 只看该作者
ss么么 发表于 2016-11-10 15:02
因为用的是CCS编译   _nop_语句用不了  所以采用了精确延时

CCS 里面是有_nop_的,你可以用好几个

使用特权

评论回复
20
dirtwillfly| | 2016-11-11 10:10 | 只看该作者
火山LF 发表于 2016-11-11 08:19
CCS 里面是有_nop_的,你可以用好几个

正解。没听说ccs用不了的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

126

帖子

1

粉丝