打印

12864串口可否读出lcd内部状态数据,最好有源码

[复制链接]
1295|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
robocon2014|  楼主 | 2013-8-9 20:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我自己
/***************************************************************/ 
/* 读数据程序没能调出,应该是5v 与3v之间的传输问题。如果接收可用*                                                           
* 则可用查忙函数代替延时                                       *                     
*                                                              *
*                                                              *
*                                                              *
*                                                              *
***************************************************************/
#include <msp430g2553.h>
#define uchar unsigned char
#define uint unsigned int
#define SID BIT1
#define SCK_1 P1OUT|=BIT4

uchar Table[] = "2014111111111111111";
void write_SID(uchar byte);
void write_data(uchar data);
void write_com(uchar com);
uchar read_SID(void);
uchar read_data(void);
uchar read_com(void);
uchar read_busy(void);
void check_busy(void);
void delay_us(uint a);
void delay_ms(uint a);
void init(void);
void display(uchar address,uchar *p,uint num);
uchar lcd;
/*********主函数*************/
void main( void )
{  
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
  if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)                                    
    while(1);
  BCSCTL1 = CALBC1_1MHZ;                    // Set DCO to 1MHz
  DCOCTL = CALDCO_1MHZ;
  P1DIR |= BIT4 + BIT3;                     //1.3片选 1.4时钟
  P2DIR |= BIT1;                            //2.1数据传输
  P1OUT = 0xff;
  P2OUT = 0xff;              
  init();

  display(0x80,Table,16);
  display(0x90,Table+16,16);
  display(0x88,Table+32,16);
  display(0x98,Table+48,16);
  LPM4;
}
/*******us延时*************/
void delay_us(uint a)
{
  uint i;
  for(i=a;i>0;i--);
}
/*******ms延时*************/
void delay_ms(uint a)
{
  uint n=1000;
  for(;a>0;a--)
  for(;n>0;n--);
}
/*******写一个字节*************/
void write_SID(uchar byte)
{
  uchar i;
  P1OUT &= ~BIT4;                           
  P1OUT |= BIT3;                             //片选使能
  for(i=0;i<8;i++)
  {
    P1OUT &= ~BIT4;
  if(byte&0x80)
    P2OUT |= BIT1;
  else
    P2OUT &= ~BIT1;
  P1OUT |= BIT4;
  byte <<= 1;
  }
  P1OUT &= ~BIT3;                            //片选失能
  P1OUT &= ~BIT4;
}
/*******读忙*************/
uchar read_busy(void)
{
  uchar BF;
  write_SID(0xfc);
  P2DIR &= ~BIT1;
  P1OUT &= ~BIT4;
  P1OUT |= BIT3;
  P1OUT &= ~BIT4;
  BF = P2IN & BIT1;
  P1OUT |= BIT4;
  P1OUT &= ~BIT4;
  P1OUT &= ~BIT3;
  P2DIR |= BIT1;
  return(BF);
}
/*******读一字节*************/
uchar read_SID(void)
{
  uchar i,data;
  P2DIR &= ~BIT1;
  P1OUT &= ~BIT4;
  P1OUT |= BIT3;
  for(i=0;i<8;i++)
  {
    P1OUT &= ~BIT4;
  if(P2IN&BIT1)
  {
    data <<= 1;
    data |= BIT0;
  }
  else
  {
    data <<= 1;
    data &= ~BIT0;
    P1OUT |= BIT4;
    P1OUT &= ~BIT4;
  }
  }
  P1OUT &= ~BIT3;
  P2DIR |= BIT1;
  return(data);
}
/*******读一字节数据*************/
uchar read_data(void)
{
  uchar h_data,l_data,data;
  write_SID(0xfe);//第一个字节
  h_data = read_SID();//收前半
  l_data = read_SID();//收后半
  data = h_data | l_data;//合并
  return(data);
}
/*******读一字节指令*************/
uchar read_com(void)
{
  uchar h_com,l_com,com;
  write_SID(0xfc);
  h_com = read_SID();
  l_com = read_SID();
  com = h_com | l_com;
  return(com);
}
/*******判忙*************/
void check_busy(void)
{
  while (read_busy() & 0xff);
}
/*******写一字节命令*************/
void write_com(uchar com)
{
  write_SID(0xf8);//写第一个字节
  write_SID(com & 0xf0);//第二个字节前半
  write_SID((com<<4) & 0xf0);//第二个字节后半
}
/*******写一字节数据*************/
void write_data(uchar data)
{
  write_SID(0xfa);
  write_SID(data & 0xf0);
  write_SID((data<<4) & 0xf0);
}
/*******初始化*************/
void init(void)
{
  write_com(0x30);
  check_busy();
  write_com(0x08);//关显示
  check_busy();
  write_com(0x0c);//开显示,关光标
  check_busy();
  write_com(0x01);//清屏
  check_busy();
  write_com(0x06);//第一行显示位置 位址归位
  check_busy();
}
/*******写字符串*************/
void display(uchar address,uchar * p,uint num)
{
  uint i;
  write_com(address);//写地址
  check_busy();
  for(i=0;i<num;i++)
  {
    write_data(*(p++));//写数据
    check_busy();
  }
}



写的可以写进去,就是读不出来,请教各位大侠???

相关帖子

沙发
henryyam| | 2013-8-10 07:47 | 只看该作者
据说串口只能写,不能读。

要读,就用并口。

使用特权

评论回复
板凳
tyw| | 2013-8-10 07:53 | 只看该作者
串行模块不能读!
泥为死马要读鸭?读出来的东东就是你写进去的东东,写入时先留个备份不就行了!

使用特权

评论回复
地板
riddlecn| | 2013-8-10 09:13 | 只看该作者

使用特权

评论回复
5
robocon2014|  楼主 | 2013-8-15 17:57 | 只看该作者
tyw 发表于 2013-8-10 07:53
串行模块不能读!
泥为死马要读鸭?读出来的东东就是你写进去的东东,写入时先留个备份不就行了! ...

这样啊,谢谢你了

使用特权

评论回复
6
robocon2014|  楼主 | 2013-8-15 17:58 | 只看该作者
riddlecn 发表于 2013-8-10 09:13

怎么了?:funk:

使用特权

评论回复
7
robocon2014|  楼主 | 2013-8-15 17:59 | 只看该作者
henryyam 发表于 2013-8-10 07:47
据说串口只能写,不能读。

要读,就用并口。

谢了

使用特权

评论回复
8
henryyam| | 2013-8-15 19:12 | 只看该作者
tyw 发表于 2013-8-10 07:53
串行模块不能读!
泥为死马要读鸭?读出来的东东就是你写进去的东东,写入时先留个备份不就行了! ...

RAM不够用时就需要读模块里的数据了。

如果RAM够用,就留一个备份。由于ST7920的字库单一,是16X16的,我就用1280 BYTES RAM的MCU开辟一个1024字节的数组给显示作缓冲,可以调整显示字体或者显示方向等。

使用特权

评论回复
9
henryyam| | 2013-8-15 19:12 | 只看该作者
robocon2014 发表于 2013-8-15 17:59
谢了

不用客气。:)

使用特权

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

本版积分规则

1

主题

13

帖子

0

粉丝