[求助] G2553模拟串口驱动12864求高手指点怎么写读取12864里的数据

tanfeng193   2012-8-17 21:30 楼主
这是12864头文件部分             注意我用的是模拟串口  不是串行通信
#include
void int_port(void)                    //管脚初始化                       
{
  P1SEL&=~BIT4;                        //P1.4模拟SID,设置为i/o口输出方向                        
  P1DIR|=BIT4;                          
  P1OUT&=~BIT4;                           
  P1SEL&=~BIT5;                        //P1.5模拟SCLK,设置为i/o口输出方向                           
  P1DIR|=BIT5;                           
  P1OUT&=~BIT5;                           
}
void delay(unsigned int t)             //延时函数
{                                      //粗略延时,满足时序要求
unsigned int i,j;
for(i=0; i         for(j=0; j<10; j++);
}
void sendbyte(unsigned char zdata)     //数据传送函数
{
  unsigned char code_seg7;            
  unsigned char serial_clk;              
  unsigned char serial_shift;               
  code_seg7=zdata;                              
  serial_shift=0x80;                       
  for(serial_clk=0; serial_clk<8; serial_clk++)
  {                                   
    if(code_seg7&serial_shift)            
    {
      P1OUT|=BIT4;                     //SID为1
    }
    else
    {
      P1OUT&=~BIT4;                    //SID为0                       
    }
    P1OUT&=~BIT5;                      //产生时钟信号下沿
    P1OUT|=BIT5;                       //产生时钟信号上沿                             
    serial_shift=serial_shift>>1;      //准备发送下一位数据           
  }   
}

void write_com(unsigned char cmdcode)  //写命令函数
{                                      //串口控制格式(11111AB0)
                                //A数据方向控制,A=H时读,A=L时写
                                       //B数据类型选择,B=H时为显示数据,B=L时为命令
sendbyte(0xf8);                //MCU向LCD发命令

        sendbyte(cmdcode & 0xf0);      //发高四位数据(数据格式D7D6D5D4_0000)
sendbyte((cmdcode << 4) & 0xf0);//发低四位数据(数据格式D3D2D1D0_0000)
delay(2);                      //延时等待
}
/*******************************************************************************
                     向LCD读数据函数      难点在这里这是我写并口方式
*****************************************************************************/
unsigned char LcdReadData()//;写数据子程序
{  
    unsigned char data;
    LcdCheckBusy();  //判断忙标,以确保上一指令/数据模块已经接收处理完
    LCD_DATA_DIR_IN; //设置io 为输入 要想LCD 读数据
    LCD_E_LOW;
    //LCD_RS_HIGE;
    LCD_READ;        //RW=1 选择读操作
    Delay_us(5);
    LCD_E_HIGE;    //LCD 使能
    Delay_us(1);
    data = LCD_IN;  //往LCD 送数据
    Delay_us(100);   //延时
    LCD_E_LOW;       //关使能
    Delay_us(10);   // 延迟
    return (data);
}
void write_data(unsigned char Dispdata)//写数据函数
{

sendbyte(0xfa);                //MCU向LCD发数据
sendbyte(Dispdata & 0xf0);     //发高四位数据
sendbyte((Dispdata << 4) & 0xf0);//发低四位数据
delay(2);
}
void lcdinit()                         //LCD初始化
{  
delay(20000);                  //复位等待(内部自带上电复位电路),时间较长
write_com(0x30);               //功能设定:基本指令集操作               
delay(50);                     //延时等待
write_com(0x0c);               //整体显示,关游标            
delay(50);
write_com(0x06);               //整体显示,关游标            
delay(50);
write_com(0x10);               //整体显示,关游标            
delay(50);
}
void print_string(unsigned char *s)          //发送字符串
{  
while(*s > 0)                  //C语言里字符串末尾自动加“\0”(ASCII码值为0)
    {
  write_data(*s);        //发送字符对应的ASCII码,12864指针可设置自动指向下一个显示地址
  s++;      
  delay(50);
    }
}
//=========================================
//函数功能:显示bmp图像(GDRAM)
//=========================================
void Display_BMP(const unsigned char *bmp)
{
unsigned char i = 0,j = 0;
write_com(0x34);   //扩充指令,绘图打开
for(i=0;i<32;i++)
{
     write_com(0x80|i);//先送垂直地址
     write_com(0x80);  //再送水平地址,显示图片的上半部分
  for(j=0;j<16;j++)
  {
   write_data(*bmp);
                        bmp++;
  }
  }
for(i=0;i<32;i++)
{
     write_com(0x80|i); //先送垂直地址
write_com(0x88); //显示图片的下半部分
     for(j=0;j<16;j++)
     {
write_data(*bmp);
        bmp++;
  }
}
write_com(0x36); //基本指令,绘图关闭
}
/******************************************************************************
                            数据填充函数
设置为扩充指令,关闭绘图模式
连续写两个字节的GDRAM地址,先写垂直地址,后写水平地址
写两个字节数据,先写高8位数据,后写低8位数据
打开绘图模式
设置回基本指令集
*******************************************************************************/
void FillGdram(unsigned char data)
{
    unsigned char i;
    unsigned char j;
    unsigned char k;
    unsigned char xAddress = 0x80;
    unsigned char yAddress = 0x80;
    for( i = 0;i < 2;i++ )
    {
        for(j = 0;j <32;j++)
        {
            for(k = 0;k < 16;k++)
            {
                write_com(0x34);
                write_com(yAddress + j);//GDRAM垂直地址Y
                write_com(xAddress + k);//GDRAM水平地址X
                write_data(data);
                write_data(data);
            }
        }
        xAddress = 0x88;
    }
    write_com(0x36);
    write_com(0x30);
}
/****************************************************************************
                    画点函数(过程:读->修改->写)
x,y坐标区间分别为[0,127]、[0,63](即:0<= x <=127,0<= y <=63)
4个顶点坐标:
            (0,0)________________(127,0)
                |                |
                |      12864     |
                |      LCD       |
          (0,63)|_______________ |(127,63)
(X, Y )为点坐标; color = 1,该点填充1 ,color = 0 该点填充0
***************************************************************************/
void DrawPoint(unsigned char x,unsigned char y,unsigned char color)
{
    unsigned char Row,Tier,Tier_bit;
    unsigned char ReadOldH,ReadOldL;
    write_com(0x34);
    write_com(0x36);//设定为扩展指令,8位数据操作
    Tier = x >> 4;
    Tier_bit = x & 0x0f;
    if(y < 32)
    {
        Row = y;
    }
    else
    {
        Row = y -32;
        Tier += 8;
    }
   write_com(0x80 + Row);
    write_com(0x80 + Tier);
    LcdReadData();      //预读数操作
    ReadOldH = LcdReadData(); //读取当前显示高8位数据
    ReadOldL = LcdReadData();  //读取当前显示低8位数据
    Delay_us(250);
   
    write_com(0x80 + Row);
    write_com(0x80 + Tier);
    Delay_us(250);
    if(Tier_bit < 8)//判断当前是高8位还是低8位
    {
        switch(color)
        {
            case 0: ReadOldH &= (~(0x01 << (7 - Tier_bit)));break;
            case 1: ReadOldH |= (0x01 << (7 - Tier_bit))   ;break;
            case 2: ReadOldH ^= (0x01 << (7 - Tier_bit))   ;break;
            default:break;
        }
        write_data(ReadOldH);
        write_data(ReadOldL);
    }
    else
    {
       switch(color)
        {
            case 0: ReadOldL &= (~(0x01 << (15 - Tier_bit)));break;
            case 1: ReadOldL |= (0x01 << (15 - Tier_bit))   ;break;
            case 2: ReadOldL ^= (0x01 << (15 - Tier_bit))   ;break;
            default:break;
        }
        write_data(ReadOldH);
        write_data(ReadOldL);
    }
   
    write_com(0x30);
}

回复评论 (3)

串行模式无法读数据!
点赞  2012-8-19 11:48
串口读取到的数据一直是00
点赞  2012-9-1 10:39
串口读取到的数据一直是00 ,若上拉读出是FF,因此串行读不出数据。
点赞  2012-12-4 23:55
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复