发新帖本帖赏金 10.00元(功能说明)我要提问
返回列表
打印
[STM32F1]

大布丁丁-单片机学习常用相关外设

[复制链接]
3120|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
13395410441|  楼主 | 2016-2-2 09:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 13395410441 于 2016-2-4 10:36 编辑

记录一下单片机常用的外设,第一做个备份,第二供大家参考。

KEIL的汉字编码

回到 大布丁丁-STM32F10x库函数学习笔记

五线四相步进电机

八线两相步进电机

单片机输出扩展-LED点阵+74HC595

单片机输入扩展-74HC165

ds1302实时时钟

温度传感器-DS18B20

24C02+I2C

LCD1602

12864+19264

TFT彩屏

打赏榜单

21ic小喇叭 打赏了 10.00 元 2016-02-16
理由:分享~~

评分
参与人数 1威望 +3 收起 理由
justtest111 + 3
沙发
13395410441|  楼主 | 2016-2-2 09:24 | 只看该作者
本帖最后由 13395410441 于 2016-2-2 11:34 编辑

常用外设-01-1-步进电机1--五线四相步进电机ABCD 接 PA0-PA3
ULN2003接高四位即可
0xfc 0xfd 0xf9 0xfb 0xf3 0xf7 0xf6   反转从后往前赋值即可。

使用特权

评论回复
板凳
13395410441|  楼主 | 2016-2-2 09:25 | 只看该作者
本帖最后由 13395410441 于 2016-2-2 11:31 编辑

常用外设-01-步进电机2--八线两相步进电机(四线双相)L6219
p1.0-1.5 接 ph1,ph2,i01,i02,i11,i12
输出A1 B1 A2 B2 接A- A+ B- B+

正转:翻转从后往前赋值即可
单四拍:0x30 0x0e 0x39 0x07
双四拍 0x08 0x09 0x01 0x00
半步八拍:0x03 0x08 0x0f 0x09 0x31 0x01 0x06 0x00

使用特权

评论回复
地板
13395410441|  楼主 | 2016-2-2 14:06 | 只看该作者
本帖最后由 13395410441 于 2016-2-2 16:37 编辑

LED点阵+74HC595
先传两个文档,阅读完至少要知道LED点阵和74HC595的引脚分布。
1、LED点阵引脚8*8:有字的一侧对着自己(R是行,阳极正号POS;C是列,阴极负号REG)
C8 C7 R2 C1 R4 C6 C4 R1

R5 R7 C2 C3 R8 C5 R6 R3
2、4块LED点阵组成16*16点阵的引脚组成:(POS是LED所在的行,NEG是LED所在的列)
LEDS0(POS1-POS8,NEG1-NEG8)    LEDS1(POS1-POS8,NEG9-NEG16)
LEDS2(POS9-POS16,NEG1-NEG8)    LEDS3(POS9-POS16,NEG9-NEG16)
看得懂吗?不懂看看文档 8点阵原理引脚以及16点阵的组合.pdf,文档说的很清楚。
到这里引脚按照同行连同行,同列连同列的理论原理连接成32个引脚(POS1-POS16,NEG1-NEG16)。
这么多引脚连接到单片机上那还得了,不要怕,接下来就用到74HC595,最少只要三个引脚就搞定。

3、74HC595具有一个8位移位寄存器和一个存储寄存器,三态输出功能,这个文档说了引脚:

/SRCLR(10引脚)低电平时将移位寄存器的数据清零,默认接上VCC就别管了。
/OE(13引脚)是低电平使能引脚,想控制就接单片机引脚,不想控制就接地让这个芯片使能。
SER(14引脚) 移位寄存器的串行输入端
QH'(9引脚)  移位寄存器的串行输出端
QA-QH(1-8引脚和15引脚) 存储寄存器的并行输出端
SRCLK/SCK(11引脚) 一开始初始为=0,再 =0  延时几十纳秒 =1 这个上升沿的过程数据就往位移寄存器移动1位,一个八位的数据如(0xff)得移动八次奥。而且是从QA->QH的顺序,最后别忘了 = 0;
RCLK/RCK (12引脚)  一开始初始为=0,再 =0  延时几十纳秒 =1 这个上升沿的过程数据就从位移寄存器进入存储寄存器,这时存储寄存器的QA-QH就会输出数据到数码管或者LED点阵。


说到这明白了吧。拿四个74HC595,U1 U2 U3 U4,
1、先连接QA-QH:U1的 接 POS1-POS8, U2的 接 POS9-POS16, U3 的接 NEG1-NEG8,U4 的接 NEG9-NEG16。如 8点阵原理引脚以及16点阵的组合.pdf里面的连接
2、再接SER:
比如使用单片机三个引脚 P01 P02 P03
2.1、P01 接 U1的SER移位寄存器的串行输入端,U1的QH'接U2的SER,U2的QH'接U3的SER,U3的QH'接U4的SER,U4的QH'悬空即可。
这样连接,第一个数据会在第一个LED点阵显示,当传第二个数据时,第二个数据在第一个数据进入LED点阵1的时候进入了LED点阵2,以此类推。。。
2.2、P02 接 四个74HC595的SRCLK/SCK(11引脚) P03 接 四个74HC595的RCLK/RCK (12引脚)。
P02每次 0 -> 1的过程往P01写一位数据,for循环八次写一个如0xff的八位数据。写完一个0xff后 P03 0 ->1的工程中数据就进入存储寄存器并显示到LED点阵了 。
这样数据会一个一个的从第一个LED点阵显示到第四个点阵。这就是数据位移的过程。
点阵就需要取模软件了,记得四个LED点阵组成一个汉字。选项(大小:11,字体:宋体, 16*16, D0 -> D7,横向,取得是一列一列的数据,16列)
取模软件的作用(16*16):
取模软件应该是基于tab0作为行进行取模取出的,取出的是列的数据,而且字模软件取得数组是高电平有效,所以列要取反。两个像0x64 0x00的八位数据组成一行0x0064(0x00是高位),而tab0 0x0001,0x00是高位。

uchar code tab0[] = {0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80,  0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00}; //点阵显示数组,

char code  tab2[]{64,0,128,0,252,31,16,4,32,2,254,63,128,0,128,0,252,31,128,0,144,4,136,8,132,16,224,0,0,0,0,0}//”亲“的字模

void HC595SendData(  uchar BT3, uchar BT2,uchar BT1,uchar BT0);
for(k = 0; k < 16; k++)                                                                                            
{         //--字模软件取得数组是高电平有效,所以列要取反--//
HC595SendData(~tab2[2*k +1],~tab2[2*k],tab0[2*k],tab0[2*k + 1]);                  
}

void HC595SendData(  uchar BT3, uchar BT2,uchar BT1,uchar BT0)//一个字占四个LED点阵,前两个是列,列后两个是行,发四次才算完成一个字。
{  
        uchar i;

        for(i=0;i<8;i++)
        {
                MOSIO = BT3 >> 7 ;        //
                BT3 <<= 1;

                S_CLK = 0;
                S_CLK = 1;               
        }

        for(i=0;i<8;i++)
        {
                MOSIO = BT2 >>7;        
                BT2 <<= 1;

                S_CLK = 0;
                S_CLK = 1;        
        }

        for(i=0;i<8;i++)
        {
                MOSIO = BT1 >> 7;               
                BT1 <<= 1;
                S_CLK = 0;
                S_CLK = 1;        
        }

        for(i=0;i<8;i++)
        {
                MOSIO = BT0 >> 7;                //从高位到低位传
                BT0 <<= 1;
                S_CLK = 0;
                S_CLK = 1;
        }
        R_CLK = 0; //set dataline low
        R_CLK = 1;
        R_CLK = 0; //set dataline low
}




单个数字:MOSIO = BT3 >> 7 ;        //从高位到低位传
                BT3 <<= 1;//先传最高位,再一步一步位移,一直到最低位。


------------------------------------------------------------------------------------
指针的使用:定义一个指针指向一个汉字
  uchar *p[] = {                                     tab1, tab2, tab3, tab4, tab5, tab6, tab7, tab8,
                                 tab9, tab10, tab11, tab12, tab13, tab14, tab15};        
for(k = 0; k < 16; k++)
{                                                         
                                        //--字模软件取得数组是高电平有效,所以列要取反--//
                                        HC595SendData(~(*(p + 2*k + 1)),~(*(p + 2*k )),
                                                       tab0[2*k],tab0[2*k + 1]);
}

HC595SendData(~(*(p + 2*k + 1)),~(*(p + 2*k )),tab0[2*k],tab0[2*k + 1]);


---------------------------------------汉字移动-------------------------------
j=0;
for(ms = 20; ms > 0; ms--)       
                {
                        for(k = 0; k < 16; k++)        //
                        {                                                        
                                HC595SendData(~(*(p[0] + 2*(k+j) + 1)),~(*(p[0] + 2*(k+j) )),tab0[2*k],tab0[2*k + 1]);     
                        }
                        HC595SendData(0xff,0xff,0,0);//清屏
                }
                j++;//让j一个一个的加,这样就感觉字一点一点的往下移动。这是在字模软件横向取模的基础上。右移就需要纵向取模
                if(j == (17*15) )
                {
                        j = 0;
                }


74HC595应用.pdf

77.76 KB

74HC595.pdf

178.59 KB

8点阵原理引脚以及16点阵的组合.pdf

530.21 KB

使用特权

评论回复
5
13395410441|  楼主 | 2016-2-2 17:19 | 只看该作者
单片机IO口扩展芯片74HC165:看完文档你会发现很简单:
SH/LD(pin1):并行输入的时候设为0,写完读出的时候设为1.
CLK(pin2)和CLK INH(pin15)一起接在一个单片机IO口上就可以。作为它的时钟。
D0-D7(pin6 5 4 3 11 12 13 14):并行输入的引脚,接个按键了什么的。
SER/SI(pin 10):多个165扩展的时候首位相连,跟上一节的74HC595一样,单个就不需要使用了。
QH/SO(pin 9):输出,接在单片机上,单片机获取串口输入的数据。

74HC165(74LS165)应用.pdf

228.7 KB

使用特权

评论回复
6
13395410441|  楼主 | 2016-2-2 18:07 | 只看该作者

实时时钟 - DS1302

本帖最后由 13395410441 于 2016-2-3 10:23 编辑


引脚号            名称                     功能
①                     Vcc2                   主电源
②、③               X1,X2       接32768Hz晶振
④                     GND                    地线
⑤                     RST /CE                   复位/CE
⑥                       I/0               数据输入输出
⑦                     SCLK             串行时钟
⑧                      Vccl                 后备电源

很简单了:单片机引脚接5 6 7 就可以了。看下面的图就会知道:(读写的地址在4230568899962717529.jpg图片前两列都表明了,年只写后两位,前两位不变的,就算我们老死,哈哈
读:先让RST和SCLK都为0,RST赋值为1的时候开始用for循环8位(要有SCLK 0-1的跳变作为时钟信号)进行地址写入,再for循环8位(要有SCLK 0-1的跳变作为时钟信号)进行数据写入。
写:先让RST和SCLK都为0,RST赋值为1的时候开始用for循环8位(要有SCLK 0-1的跳变作为时钟信号)进行地址写入,再for循环8位(要有SCLK 0-1的跳变作为时钟信号)进行数据读取。


总之,看看时序图,附件“ds1302中文资料”中有个程序例子,看看吧。很简单的

4230568899962717529.jpg (69.51 KB )

4230568899962717529.jpg

4285175045444109844.jpg (34.67 KB )

4285175045444109844.jpg

ds1302.jpg (23.67 KB )

ds1302.jpg

image018.gif (1.64 KB )

image018.gif

ds1302中文资料.pdf

2.02 MB

使用特权

评论回复
7
cowboy2014| | 2016-2-2 20:35 | 只看该作者
有没有做USB外设的啊,比如转总线什么的?

使用特权

评论回复
8
13395410441|  楼主 | 2016-2-3 09:25 | 只看该作者
cowboy2014 发表于 2016-2-2 20:35
有没有做USB外设的啊,比如转总线什么的?

我只是就学习单片机的过程中遇到的外设做个描述,那个还没看呢。

使用特权

评论回复
9
13395410441|  楼主 | 2016-2-3 10:56 | 只看该作者

温度传感器DS18B20

温度传感器DS18B20。
就一个引脚IO。
主机(单片机)控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位操作,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对
DS18B20进行预定的操作。
那么程序框架应该这样:
1、先初始化,再写数据0xcc跳过ROM指令,再写数据0X44执行RAM指令的转换温度命令。
2、先初始化,再写数据0xcc跳过ROM指令,再写数据0XBE执行RAM指令的读取温度命令。、
3、最后先读数据第八位,再读数据高八位。
下面有RAM  ROM指令图,这是代码初始化、读写数据的流程:

1、初始化,IO = 0;延时700us左右,IO = 1;//总线拉高,然后等待DS18B20自动把总线拉低,自动拉低就算初始化完成了,否则就要做失败处理了。
2、写数据:IO = 0;然后写数据IO =DATA&0x01;//一次写一位,然后延时个60us,再IO = 1;释放总线。(八位数据需要这个步骤for循环执行八次,把八位移位写入)
3、读数据:先拉低总线IO = 0; 再释放总线IO = 1;延时个6us就可以读数据了,uchar bit = IO;(一次也是读一位,需要循环移位读八次) 。

这是个道客巴巴的链接,讲得很好看看吧:
http://www.doc88.com/p-5834115963799.html

RAM.png (56.36 KB )

RAM.png

ROM.png (73.41 KB )

ROM.png

DS18B20应用详解.pdf

1.71 MB

使用特权

评论回复
10
13395410441|  楼主 | 2016-2-3 15:39 | 只看该作者
LCD1602:
太简单了,时序图和指令都在附件中的文件中了。
RS:0代表操作的是指令寄存器,1代表操作的数据寄存器。
RW:0代表写,1代表读。
E:1-0的跳变表示执行指令。
当RS=0;RW =1时读取数据位D7来判断忙信号。0表示不忙,1表示忙,忙就是不能用的意思奥。哈哈
指令:
1、清屏指令 0x011.64ms
2、光标归位指令 0x021.64ms
3、进入模式设置指令:(40us
(显示屏不移动)
写入新数据后光标左移:0x04
写入新数据后光标右移:0x06
(显示屏整体右移1个字)
写入新数据后光标左移:0x05
写入新数据后光标右移:0x07
4、显示开关控制指令
0x0e有光标闪烁   0x0c 无光标
5、设定显示屏或光标移动方向指令(40us
0x18 整屏左移  
0x10光标左移1格,且AC值减1
0x1c 整屏右移  
0x14光标右移1格,且AC值加1
6、功能设定指令,设定数据总线位数、显示的行数及字型 常用 0x3840us
7、设定DDRAM地址指令 0x80+Address40us

好了引脚这么简单就简单说代码了:
不是完整代码,只是框架
1、读忙信号
void Read_Busy()           //当RS=0;RW =1时读取数据位D7来判断忙信号。0表示不忙,1表示忙,忙就是不能用的意思奥,那就while循环等他不忙呗。哈哈
{
    unsigned char sta;      //
    LCD1602_DB = 0xff;//先写个数据,然后让RS=0;RW =1
    LCD1602_RS = 0;
    LCD1602_RW = 1;
    do
    {
        LCD1602_EN = 1;
        sta = LCD1602_DB;//然后再读数据到下面判断D7
        LCD1602_EN = 0;    //最后记得释放总线
    }while(sta & 0x80);
}

2、写命令
void Lcd1602_Write_Cmd(unsigned char cmd)
{
    Read_Busy();//判断忙信号
    LCD1602_RS = 0;
    LCD1602_RW = 0;
    LCD1602_DB = cmd;//下命令
    LCD1602_EN = 1;//E 从1到0跳变是执行命令
    LCD1602_EN = 0;   
}

3、写数据
void Lcd1602_Write_Data(unsigned char dat)   //写命令和写数据只有RS不同,可以用形参来传递RS,这样就可以合并成一个函数了,自己试试吧。
{
      Read_Busy();
      LCD1602_RS = 1;
      LCD1602_RW = 0;
      LCD1602_DB = dat;
      LCD1602_EN = 1;
      LCD1602_EN = 0;
}


4、显示的字符串
void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str) //这里面判断是第一行还是第二行,来设定DDRAM地址指令,并写入LCD数据
{
//这里面判断是第一行还是第二行,来设定DDRAM地址指令
    unsigned char addr;
    if(y == 0)
        addr = 0x00 + x;
    else
        addr = 0x40 + x;

    Lcd1602_Write_Cmd(addr|0x80);

//显示数据
    while(*str != '\0')
    {
        Lcd1602_Write_Data(*str++);
    }
}


int main(void)
{
//要显示的字符串
unsigned char str1[] = "Welcome To Lcd";
unsigned char str2[] = "Welcome To Lcd";
1、初始化
Lcd1602_Write_Cmd(0x38);    //打开,设定数据总线位数、显示的行数及字型
Lcd1602_Write_Cmd(0x0c);//无光标 0x0e有光标
Lcd1602_Write_Cmd(0x06);//进入模式设置指令,写入新数据后光标右移,显示屏不移动,0x07显示屏移动
Lcd1602_Write_Cmd(0x01);  //清屏

    LcdShowStr(0,0,str);//第一行开始位置显示
    LcdShowStr(0,1,str);////第二行开始位置显示
    while(1);

}


LCD1602最好最详细的中文资料.pdf

1.49 MB

使用特权

评论回复
11
13395410441|  楼主 | 2016-2-3 16:02 | 只看该作者
本帖最后由 13395410441 于 2016-2-4 10:32 编辑

19264+12864
几种常见的12864图形点阵模块  
12864点阵液晶模块分为带汉字库和不带汉字库两大类,目前带汉字库的通常是ST7920驱动,它可以工作在汉字字符方式和图形点阵方式,很多制作都用它,如果需要显示较多汉字,用它最为方便。  
在显示汉字数量很少的场合,我们可以使用更加廉价的、不带字库的点阵液晶模块,这正是本文重点介绍的。它们的控制电路有KS0108和ST7565两种:KS0108很简单,一共只有7条指令,可是它没有串行接口;ST7565有20多条指令(最常用的也就几条),有串行接口,可选串行或并行工作。KS0108和ST7565的指令和上述带字库的ST7920区别较大,所以初学者买液晶时一定要搞清楚是哪种驱动电路。即使同样的驱动电路,不同厂家或者不同型号的产品,具体细节仍可能不同。例如有的片选信号是高电平有效,有的却是低电平有效,有的把显示区分为左右两半分别选取,有的却不加区分。所以使用前要仔细看厂家说明,如果没有,就要看液晶模块背面给出的具体型号,根据这个型号去查找使用手册。


我使用的是ST7565P。JLX12864G-102-ST7565R中文说明书这个文档说的很详细,你可以选择串行、并行,可以选择6800时序、8080时序。不同的选择引脚的接法和名称会有不同奥。
1、引脚定义:
P/S(PIN33) 高是并行,低是串行。
C86(PIN32)高是6800,低是8080时序。
我选择的是8080时序、并行通信,所以我的引脚名称和功能如下:
CS(PIN3):低电平片选芯片
RES(PIN4):低电平复位,回到高电平液晶开始工作
RS(PIN5):高电平时选择数据寄存器,低电平选择指令寄存器
/WR(PIN6):高电平禁止写,低电平写数据
/RD(PIN7):高电平禁止读,低电平读数据
这样就很明了了。


2、指令简介:
二十几个指令也就是用12种指令:1.清除,2.返回,3.输入方式设置,4.显示开关,5.控制,移位,6.功能设置,7.CGRAM地址设置,8.DDRAM地址设置,9.读忙标志,10.写数据到CG/DDRAM,11.读数据由CG/DDRAM等
其中指令20可以不设,指令17液晶模块通过外置电阻设置,此指令失效。

1、开显示:0XAF
2、设置显示存储器的显示初始行:(0x400x40 - 0x7f(第一行到最后一行)
3、设置页地址Y轴,每8行为1页,64行为8页,1011 0000为第一页。(0XB0 - 0XB7 ),换句话说,一页就是一个八位的字节,一共8个字节。
4、128列的对应列(X轴)的高4位、低四位,第一列是0000 0001(正常的话 即8指令设为a0的话),8指令设为a1则为0000 0004,最大是1000 0000/1000 0004设完初值,他会自动增加的。2^7 = 128。3 4指令就涵盖了128*64的全部坐标
     所以输入0x0001 0000   0x0000 0001(两个数字高四位是不变的)
8、显示列地址增减(ADC select):常规0xa0,从右到左;0xa1
9、显示正显/反显 Display normal/reverse:常规0xa7(白字黑背景),反显0xa6(黑字白背景)。
10、显示全部点阵  (Display all points):常规0xa4,全显0xa5
11LCD 偏压比设置 (LCD bias set)1/9  0xa2 ,1/7 0xa3
14、软件复位:0xe2
15、行扫描顺序选择:普通0xc0上下方向反向扫描0xc8
16、选择内部电压供应操作模式:(0x2f)0x24-0x2f
17、选择内部电阻比例(Rb/Ra),本液晶模块通过外置电阻设置,此指令失效:(0x250x20-0x27
18、设置内部电阻微调,以设置液晶电压,此两个指令需紧接着使用:
1、电压模式:0x81
2、电压值:(0x230x00 - 0x3f
19多的
20(代码中的19):选择升压倍数: 002倍,3倍,4 015  116倍。本模块外部已设置升压倍数为4倍,不必使用此指令
10xf8
20x01 五倍,起始和四倍差不多,可以不使用这个指令

---------------------------------华丽的分割线-----------------------------------
代码操作很简单,就是先选择好命令配置LCD,然后自己到汉字取模软件弄几个字库存在一个头文件中,然后在代码中指定坐标写入数据就可以。下面是摘抄的代码,有的地方可能不准确,但是思路很清晰了,自己写入自己的LCD12864中慢慢调试到自己喜欢的样子就可以了
3、指令代码:
写命令
void LcdSt7565_WriteCmd(cmd)
{
        LCD12864_CS = 0;       //打开片选
        LCD12864_RS = 0;       //选择命令
        LCD12864_RD = 1;       //禁止读       
        LCD12864_RW = 0;       //写使能
        _nop_();
        _nop_();

        DATA_PORT = cmd; //写入命令
        _nop_();
        _nop_();

        LCD12864_RW = 1;           //禁止写,执行命令
}
写数据
void LcdSt7565_WriteData(dat)
{       
        LCD12864_CS = 0;           //片选
        LCD12864_RS = 1;       //选择数据
        LCD12864_RD = 1;           //禁止读       
        LCD12864_RW = 0;       //选择写
        _nop_();
        _nop_();

        DATA_PORT = dat;       //写入数据
        _nop_();
        _nop_();

        LCD12864_RW = 1;           //禁止写,执行数据
}

初始化
void Lcd12864_Init()
{
        uchar i;
        LCD12864_RSET = 0;
        for (i=0; i<100; i++);
        LCD12864_CS = 0;
        LCD12864_RSET = 1;

        LcdSt7565_WriteCmd(0xE2);  //reset复位重启
        for (i=0; i<100; i++);//延时

        LcdSt7565_WriteCmd(0xA1);  //ADC select segment direction 左右反向
        
        LcdSt7565_WriteCmd(0xC8);  //Common direction 上下反向

        LcdSt7565_WriteCmd(0xA6);  //reverse display 反显-白字黑背景

        LcdSt7565_WriteCmd(0xA4);  //normal display 像素正常显示
        
        LcdSt7565_WriteCmd(0xA2);  //bias set 1/9 偏压

        LcdSt7565_WriteCmd(0xF8);  //Boost ratio set 增压指令
        LcdSt7565_WriteCmd(0x01);  //x5  5倍增压  
        
        LcdSt7565_WriteCmd(0x81);  //V0 a set  液晶电压调节指令
        LcdSt7565_WriteCmd(0x23);//调节电压改变对比度

        LcdSt7565_WriteCmd(0x25);  //Ra/Rb set 使用外部电阻则此命令失效

        LcdSt7565_WriteCmd(0x2F); //内部供应电压全开
        for (i=0; i<100; i++);

        LcdSt7565_WriteCmd(0x40);  //start line 开始位置是第一行首部

        LcdSt7565_WriteCmd(0xAF);  // display on 开显示
        for (i=0; i<100; i++);
}

清屏用到3 4两个指令,
void Lcd12864_ClearScreen(void)
{
        uchar i, j;

        for(i=0; i<8; i++)//第三个命令。64行,8*8位,1字节就是8位,所以循环8个字节从0XB0 - 0XB7
        {
                //-//第三个命令。64行,8*8位,1字节就是8位,所以循环8个字节从0XB0 - 0XB7-//       
                LcdSt7565_WriteCmd(0xB0+i);

                //--这是第四个命令,取决于第八个命令。命令8是0XA0  则这里写 0X01 0X00,命令8是0XA1  则这里写 0X01 0X04.意思是设置X轴起始位置,默认写一个字节自动增加的--//
                LcdSt7565_WriteCmd(0x10);
                LcdSt7565_WriteCmd(0x04);                                                          
               
                //--上面说了X轴128位,所以每位写0X00,如果命令--//
                for(j=0; j<128; j++)
                {
                        LcdSt7565_WriteData(0x00);  //命令9设为0XA7时写0X00,命令9设为0XA6时写0XFF
                }
        }
}


写数据:参数,X坐标、Y坐标、字符串
uchar Lcd12864_Write16CnCHAR(uchar x, uchar y, uchar *cn)
{
        uchar j, x1, x2, wordNum;

        //--Y轴不能大于7,因为只有8个字节,0-7--//
        if(y > 7)
        {
                return 0;
        }

        //--X不能大于128,因为只有0 - 128--//
        if(x > 128)
        {
                return 0;
        }

        y += 0xB0;           //根据传进来的y坐标值,转换成可用的Y坐标,等待赋值
        //--设置Y坐标--//
        LcdSt7565_WriteCmd(y);
        while ( *cn != '\0')         //判断字符串结尾,C字符串以‘\0结尾’
        {       
       
                //--设置Y坐标--//
                LcdSt7565_WriteCmd(y);

                x1 = (x >> 4) & 0x0F;   //获取X高四位
                x2 = x & 0x0F;          //获取X低四位
                //--设置X坐标--//
                LcdSt7565_WriteCmd(0x10 + x1);   
                LcdSt7565_WriteCmd(0x04 + x2);       

                for (wordNum=0; wordNum<50; wordNum++)
                {
                    //--查询要写的字在字库的位置,自然,这是自己在一个.h中自己写的字库,一个包含多个汉字编码的数组--//
                        if ((CN16CHAR[wordNum].Index[0] == *cn)
                             &&(CN16CHAR[wordNum].Index[1] == *(cn+1)))
                        {
                                for (j=0; j<32; j++) //写一个字
                                {               
                                        if (j == 16)         //16*16需要两个Y轴,当大于等于16时切换坐标
                                        {
                                                //--Y轴加1--//
                                                   LcdSt7565_WriteCmd(y + 1);
                       
                                                //--设置X轴--//
                                                LcdSt7565_WriteCmd(0x10 + x1);
                                                LcdSt7565_WriteCmd(0x04 + x2);
                                        }
                                        LcdSt7565_WriteData(CN16CHAR[wordNum].Msk[j]);
                                }
                                x += 16;
                        }//if查到字结束       
                } //for查字结束       
                cn += 2;
        }        //while结束
        return 1;
}


void main()
{
        uchar i = 128;
        Lcd12864_Init();
        Lcd12864_ClearScreen();
               
        while (1)
        {
                for (i=0; i<8; i += 2)
                {
                        Lcd12864_ClearScreen();
                        Lcd12864_Write16CnCHAR(0, i, "大家学习要细心啊");
                        Delay10ms(100);
                }
       
        }
}

LCD19264.pdf

1.64 MB

19264—00001.pdf

3.61 MB

19264—00002.pdf

1.93 MB

JLX12864G-102-ST7565R中文说明书.pdf

4.19 MB

使用特权

评论回复
12
13395410441|  楼主 | 2016-2-4 10:35 | 只看该作者
KEIL的汉字编码老是出现问题,后来发现其实这个根本不是问题,安装好后默认是ANSI编码,所以会出现汉字编码不一致的问题。只要把编码改成UTF-8编码就能解决上述烦恼。

设置步骤:
    1、选择菜单:[Edit]->[Configuration]  
    2、页签[Editor]中 General Editor Settings 的Encoding 改为 Encode in UTF-8 without signature

使用特权

评论回复
13
13395410441|  楼主 | 2016-2-4 10:36 | 只看该作者
本帖最后由 13395410441 于 2016-2-4 15:44 编辑

TFT彩屏:(虽然IPS屏幕技术非常厉害,牛到不行,但是它还是基于TFT的一种技术,本质还是TFT屏幕。不管IPS强到什么程度,见到TFT还得安安稳稳喊一声”爹地“毕竟是基于TFT衍生的。)TFT液晶生产商玲琅满目,产品规格多种多样,但是TFT液晶采用的驱动电路基本上已经是标准了,所以相同规格的TFT液晶除了厂商不同外,驱动提供的接口和控制功能都一致。
对于TFT液晶屏的指令掌握除了看数据手册之外,这也是主要的应用液晶屏的指导方法。此外,如果有成熟的接口程序可以借鉴,也可以加深和加快你对液晶指令集的掌握。但是,我觉得没有必要死记硬背,应用不等同于考试,你有很多参考资料可以参考,所以,学会怎么样找资料也是一门艺术。我这里有个ILI9326,现在资料比较多的ILI9325吧。那我就说9325呗(这俩其实差不多):


一.指令寄存器(从GRAM跳转到这里的方法是RS=0)
RESET 这个是复位,不需要我解释了吧
CS  :片选它的作用是除了字面上的意思外,还有个和SPI总线的NSS脚一样的作用:重新定义数据头,如果通讯重出现数据错位的话这个脚就起到作用了
RS  :数据 or  地址(低电平就把你赋到数据口上的值当做地址来操作地址指针。 高电平时写的数据被放进相应寄存器里)
RD  :读(下降沿生效)
WR  :写(上升沿生效)
DB0-DB17  :数据脚

二、GRAM--是个矩阵,每个点对应屏幕上的一个点(从指令寄存器跳转到这里的方法是将指令寄存器的地址写0X0022(这里是指令寄存器的出口))
1.底层协议和基本函数(后面我具体讲)
2.操作寄存器 来实现初始化 其代码比较复杂上网或者找朋友要份代码抄一下,想深入研究的朋友可以找份中文的寄存器说明看下。只要屏来做显示用的朋友没有必要看了
3。划定具体显示区域,默认是地址每写一位会自动加1超过分界回自动循环(一般是 X为 0-239 ,Y为 0-319。当然也可以定义更小的区域) 这个在寄存器0X0050,0X0051,0X0052,0X0053里操作。
4.把GRAM指针移动到指定位置,类似1602液晶光标的作用,它不会显示出来。指令是行坐标是操作 0x0020寄存器 列坐标是操作 0x0021寄存器
5。会了上面这些接着就简单了 初始化--划显示区域--移动GRAM坐标到想要的起始位置--写0X0022把指针移动到GRAM--对数据端口赋值,WR每个上升沿9325会把该值写进GRAM并显示出来(保证RS为高)
6.至于还有个8位总线,硬件是接DB10-DB17。软件操作和16位总线是一样的,就是一个 16位指令分两次来写而已。不管是数据还是地址都先写高8位就行
7.基本协议也就是时序,其实有了上面的解释很容易自己写出时序了。我简单讲下吧。先CS=0; RS = 0; P1 =0; (命令地址高8位都是0) 然后给个上升沿WR = 0;WR = 1; 指令寄存器的地址操作就完成了。光写地址是完全没用的,后面肯定要跟个数据(0X0022是出口它特殊)写数据的时序和上面一样,就是要保证WR上升沿的时候RS为高电平。
8.知道了这些不必傻乎乎的每写一个指令或者数据就去操作一次CS,也不必每刷一帧屏都去操作一次起始坐标。因为它会循环的。显示区域设定在寄存器0050-0053里面,你不去修改它是不会变的,不用反复划定他。
9.读数据,读和写基本一样。就是RD下降沿生效和WR上升沿生效的区别,友情提醒一下,读数据要等待数据稳定,速度比写慢一点,具体请看手册。


三、Write_Cmd_Data(0x0001,0x0100)的第一个参数,用于指定要操作的寄存器号,第二个参数就是要执行的命令的具体内容了。
寄存器号的定义,要参考对应的手册。如0x0001表示“Driver Output Control (R01h)驱动器输出控制”;而对应的数据0x0100就是实际的操作命令参数了,表示SS=1,设置输出转变方向为从S720到S1。


使用特权

评论回复
14
弥勒开怀笑| | 2016-2-16 15:44 | 只看该作者

使用特权

评论回复
15
yu515301489| | 2016-2-17 15:34 | 只看该作者
习惯把这些学习的写下来的的人,以后一定都很牛!

使用特权

评论回复
16
arima| | 2016-2-18 09:08 | 只看该作者
好样的,谢谢分享。。。。

使用特权

评论回复
17
洛理小子| | 2016-4-9 23:08 | 只看该作者
谢谢楼主分享~~

使用特权

评论回复
18
linda_6000| | 2019-4-4 11:22 | 只看该作者
thank!

使用特权

评论回复
发新帖 本帖赏金 10.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

56

帖子

3

粉丝