OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 22536|回复: 11

【Ling.Ju的百宝箱】STC SPI 应用之12864(7920)~

[复制链接]

4

主题

13

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2010-12-14
在线时间
1 小时
发表于 2011-1-1 20:33:02 | 显示全部楼层 |阅读模式

 呵呵,那什么练手好呢,看了下7920的12864,就是他了,先对比下时序

一步步来。


上面是7920的SPI时序,下面是STC的SPI时序,用的是STC12C5A60S2,STC的英文资料,难得吧,感觉E文的广告能少点。。。。

继续折腾完毕~

下面是结果~~



//========================================代码区==========================================//

//#include <STC_NEW_8051.H>
#include "reg51.h"
//============================================================================================================

#define uint unsigned int
#define uchar unsigned char

//引脚定义
sbit    LCD_CS    =P1^4;        // 片选 高电平有效 单片LCD使用时                     可固定高电平
sbit    LCD_SID   =P1^5;        // 数据
sbit    LCD_CLK   =P1^7;        // 时钟
sbit    LCD_PSB   =P3^5;        // 低电平时表示用串口驱动,                          可固定低电平
sbit    LCD_RST   =P3^6;        // LCD复位,LCD模块自带复位电路。                    可不接
//sbit  LCD_BACK  =P2^6;        // LCD背光控制

//=========================================================================


#define MASTER                  //define:master undefine:slave

typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef unsigned long DWORD;

sfr  AUXR       =   0x8e;       //Auxiliary register
sfr SPSTAT      =   0xcd;       //SPI status register       84
#define SPIF        0x80        //SPSTAT.7
#define WCOL        0x40        //SPSTAT.6

sfr SPCTL       =   0xce;       //SPI control register      85
#define SSIG        0x80        //SPCTL.7
#define SPEN        0x40        //SPCTL.6
#define DORD        0x20        //SPCTL.5
#define MSTR        0x10        //SPCTL.4
#define CPOL        0x08        //SPCTL.3
#define CPHA        0x04        //SPCTL.2
#define SPDHH       0x00        //CPU_CLK/4
#define SPDH        0x01        //CPU_CLK/16
#define SPDL        0x02        //CPU_CLK/64
#define SPDLL       0x03        //CPU_CLK/128

sfr SPDAT       =   0xcf;       //SPI data register         86
sbit SPISS      =   P1^3;       //SPI slave select, connect to slave' SS(P1.4) pin


void InitSPI()
{
    SPDAT = 0;                  //initial SPI data
    SPSTAT = SPIF | WCOL;       //clear SPI status
#ifdef MASTER
    SPCTL = SPEN | MSTR | CPHA | CPOL | SPDH;               //master mode
#else
    SPCTL = SPEN;               //slave mode
#endif
}

BYTE SPISwap(BYTE dat)
{
#ifdef MASTER
    SPISS = 1;                  //pull low slave SS
#endif
    SPDAT = dat;                //trigger SPI send
    while (!(SPSTAT & SPIF));   //wait send complete
    SPSTAT = SPIF | WCOL;       //clear SPI status
#ifdef MASTER
    SPISS = 0;                  //push high slave SS
#endif
    return SPDAT;               //return received SPI data
}

//=========================================================================

void Delay(uint Number)
{
  uint i,j;

  for (i=0; i<Number; i++)
  {
      for(j=0; j<10; j++)
        {
   ;
  }
 }
}

/*****************************************************/

void Send_byte(uchar Byte)
{

    SPISwap(Byte);

// 以下方式为模拟SPI
// uchar i;
//  for (i=0; i<8; i++)
//    {
//     LCD_SID = Byte&0x80;             // 取出最高位 写入串行数据
//     LCD_CLK = 1;                     // 串行同步时钟信号
//     LCD_CLK = 0;
//    Byte <<= 1;                       // 左移
//   } 
}
/*****************************************************/

void WriteCommandLCM(uchar WCLCM)
{
   uchar Start_data,Hdata,Ldata;

 Start_data = 0xf8;                     // 写指令 11111000
 
   Hdata = WCLCM&0xf0;                  // 取高四位   DDDD0000
   Ldata = (WCLCM << 4) & 0xf0;         // 取低四位   0000DDDD

   Send_byte(Start_data);               // 发送起始信号 第1字节-格式:1111ABC
   Delay(5);                            // 延时是必须的

   Send_byte(Hdata);                    // 发送高四位   第2字节-格式DDD0000
   Delay(1);                            // 延时是必须的

   Send_byte(Ldata);                    // 发送低四位   第3字节-格式:0000DDDD
   Delay(1);                            // 延时是必须的
}
/*****************************************************/

void WriteDataLCM(uchar WDLCM)
{
   uchar Start_data,Hdata,Ldata;

    Start_data = 0xfa;                   // 写数据 11111010

   Hdata = WDLCM & 0xf0;                 // 取高四位   DDDD0000
   Ldata = (WDLCM << 4) & 0xf0;          // 取低四位   0000DDDD

   Send_byte(Start_data);                // 发送起始信号 第1字节-格式:1111ABC
   Delay(5);                             // 延时是必须的

   Send_byte(Hdata);                     // 发送高四位   第2字节-格式DDD0000
   Delay(1);                             // 延时是必须的

   Send_byte(Ldata);                     // 发送低四位   第3字节-格式:0000DDDD
   Delay(1);                             // 延时是必须的
}

/*****************************************************/

void Lcdinit(void) 
{
   Delay(10);                              // 启动等待,等LCM讲入工作状态
   LCD_PSB = 0;                            // 串口驱动模式
   LCD_RST = 0;

    Delay(1);
    LCD_RST = 1;                           // 复位LCD
    LCD_CS = 1;                            // 片选

   WriteCommandLCM(0x30);                  // 8 位介面,基本指令集
   WriteCommandLCM(0x0c);                  // 显示打开,光标关,反白关
   WriteCommandLCM(0x01);                  // 清屏,将DDRAM的地址计数器归零 
}

/*****************************************************/

void DisplayListChar(uchar x, uchar y, uchar code *s)
{
 uchar add;                             // 显示地址

 switch (y)                             // 显示地址计数
 {
  case 0: add = x + 0x80; break;        // 第一行的地址
  case 1: add = x + 0x90; break;        // 第二行的地址 
  case 2: add = x + 0x88; break;        // 第三行的地址
  case 3: add = x + 0x98; break;        // 第四行的地址
  default: break;
 }

 WriteCommandLCM(0x30);                 // 8位介面,基本指令集
 WriteCommandLCM(add);                  // 写入地址

    while (*s > 0)                      // 写入字符串
    {
     WriteDataLCM(*s);
        s++;
        Delay(50);
    }
}

/*****************************************************/

//图形方式

//void DisplayPicture(uint code *img)
//{
//    uchar Line,Row;                   // Line为行地址;Row为列地址
//    uint regist = 0;                  // 图形地址寄存器
//
// WriteCommandLCM(0x36);               // 图形方式,扩展指令
//    // -------------- 上半屏 ----------------
//   for (Line=0; Line<32; Line++)    
//    {
//       WriteCommandLCM(0x80 + Line);  // 写入行地址
//       WriteCommandLCM(0x80);         // 写入列
//
//       for (Row=0; Row<16; Row++)
//  {
//       WriteDataLCM(img[regist++]);   // 写入图片数据
//  }
//    }
//    // --------------- 下半屏 ---------------
//   regist=512;                        // 下半屏起始数据
//
//   for (Line=0; Line<32; Line++) 
//    {
//       WriteCommandLCM(0x80 + Line);  // 写入行地址
//    WriteCommandLCM(0x88);            // 写入列
//
//       for (Row=0; Row<16; Row++)
//  {
//        WriteDataLCM(img[regist++]);  // 写入图片数据
//  }
//    }
//
// WriteCommandLCM(0x30);               // 基本指令
//}

/*****************************************************/

void main(void)
{
     
   InitSPI();                           //initial SPI

   Delay(10);

   Lcdinit();                           // 初始化LCD

   Delay(100);

   DisplayListChar(0,0,"人生若只是初见,");
   DisplayListChar(0,1,"何事秋风悲画扇。");
   DisplayListChar(0,2,"等闲变却故人心,");
   DisplayListChar(0,3,"却道故人心易变。");

   while(1)
   {

   }

}


//========================================代码区完==pp上场==================================//






实际的IO用了两个,片选直接接高!

秉承一贯闹着玩的做风~
 
P.S:  这句话!!

SPCTL = SPEN | MSTR | CPHA | CPOL | SPDH;               //master mode

注意SPI的设置!!换了别的东西还得先看看手册啊!!

while(1);
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-1-2 00:44:38 | 显示全部楼层
STC应该也没有说的那么差了。
7920,我好像貌似用过。小个头的LCD。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2012-8-20
在线时间
1 小时
发表于 2012-8-20 16:24:32 | 显示全部楼层
回复 支持 反对

使用道具 举报

12

主题

216

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2011-4-7
在线时间
3 小时
发表于 2012-8-26 22:33:20 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

16

主题

98

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2012-7-29
在线时间
19 小时
发表于 2012-9-18 00:04:43 | 显示全部楼层
回复【4楼】lixupeng:
---------------------------------为何要模拟的SPI??单片机本身不是有吗
回复 支持 反对

使用道具 举报

8

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2012-11-20
在线时间
0 小时
发表于 2012-11-20 19:50:17 | 显示全部楼层
不错的资料 mark一下
回复 支持 反对

使用道具 举报

13

主题

202

帖子

0

精华

高级会员

Rank: 4

积分
527
金钱
527
注册时间
2012-10-27
在线时间
65 小时
发表于 2013-2-8 15:43:06 | 显示全部楼层
回复【5楼】小猪siyuan:
---------------------------------
同问
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2195
金钱
2195
注册时间
2012-2-8
在线时间
34 小时
发表于 2013-2-8 16:15:55 | 显示全部楼层
神貌似已经两年没来论坛了?
https://github.com/roxma
回复 支持 反对

使用道具 举报

31

主题

64

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2012-10-27
在线时间
63 小时
发表于 2013-3-29 11:40:19 | 显示全部楼层
借来用用  谢谢分享
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2013-2-16
在线时间
0 小时
发表于 2013-4-2 22:25:40 | 显示全部楼层
顶一个
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2013-4-20
在线时间
0 小时
发表于 2013-4-20 23:18:15 | 显示全部楼层
好啊!请问大神,弱弱的问一句,用SPI有什么好处啊(比不用SPI)?
回复 支持 反对

使用道具 举报

4

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2015-10-23
在线时间
24 小时
发表于 2016-9-30 11:09:59 | 显示全部楼层
与11楼同问
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 18:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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