OpenEdv-开源电子网

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

解释STM32端口控制12864液晶显示数据输出端口的原理

[复制链接]

30

主题

150

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2017-5-19
在线时间
149 小时
发表于 2018-4-12 21:55:15 | 显示全部楼层 |阅读模式
1金钱
我之前用51单片机驱动显示过12864液晶显示,程序都是从网上下载并修改成功的,以前用51单片机因为某一个P口刚好只有8位,所以往12864数据端口输出数据也刚好对应单片机的8个位(即P0.0 P0.1 P0.2……P0.7对应DB0~DB7),而现在我用的是32单片机,一个GPIOA口有16个控制位,我程序里用的是GPIOA作为数据的输出端口,硬件连接方式为【GPIOA.0~GPIOA.7】对应12864的【DB0~DB7】数据口,那么请问,这个程序里是怎么往这个低8位控制的呢,剩下的高8位是不是也被占用了?如果我想利用剩下的GPIOA.8~GPIOA.15改怎么用呢?   【#define LCD_DATA_OUTPORT GPIOB->ODR //定义数据输出端口】这个ODR寄存器是16位的,没有说明怎么往低8为输数据的啊?
微信截图_20180412215424.png

基于12864做为显示.rar

4.65 MB, 下载次数: 136

最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

30

主题

150

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2017-5-19
在线时间
149 小时
 楼主| 发表于 2018-4-12 21:55:16 | 显示全部楼层
gushanshan 发表于 2020-7-15 16:54
楼主,你12864液晶显示做成功了吗 ?

成功了!需要吗
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-4-13 00:59:07 | 显示全部楼层
这个问题,还是你自己想想吧,c语言基础啊,用&  |就能解决。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

30

主题

150

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2017-5-19
在线时间
149 小时
 楼主| 发表于 2018-4-13 08:11:49 | 显示全部楼层
正点原子 发表于 2018-4-13 00:59
这个问题,还是你自己想想吧,c语言基础啊,用&  |就能解决。

嗯嗯,其实我也想到这点了,就是不会,有点模糊
回复

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-4-13 13:43:58 | 显示全部楼层
楼主对gpio理解还不是很深刻,
回复

使用道具 举报

30

主题

150

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2017-5-19
在线时间
149 小时
 楼主| 发表于 2018-4-14 09:32:25 | 显示全部楼层
ssssssssssss 发表于 2018-4-13 13:43
楼主对gpio理解还不是很深刻,

主要是还不会用&|来操作数据,每次看到这个都头疼
回复

使用道具 举报

30

主题

150

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2017-5-19
在线时间
149 小时
 楼主| 发表于 2018-4-14 21:34:15 | 显示全部楼层
ssssssssssss 发表于 2018-4-13 13:43
楼主对gpio理解还不是很深刻,

您好,我学习了LED寄存器的视频教程,对上面的寄存器操作懂了不少,还是有个疑问,没有想明白,那就是GPIO->ODR这句话,这个ODR只利用了低16位,我这里往12864的数据端口输出数据,我输出的数据是8位的,往这个16位的寄存器输入,那么ODR的高8位,岂不是也受影响,如果我的单片机端口的高8位接的有其他电路,这里一下操作端口的ODR的整个16位,高8位岂不是乱了,麻烦您给我指点下行不行?
回复

使用道具 举报

30

主题

150

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2017-5-19
在线时间
149 小时
 楼主| 发表于 2018-4-14 21:36:37 | 显示全部楼层
正点原子 发表于 2018-4-13 00:59
这个问题,还是你自己想想吧,c语言基础啊,用&  |就能解决。

原子哥,请问:往GPIO->ODR寄存器操作,是不是一下操作了某个IO口的高8位和低8位的整个16位的端口数据?
回复

使用道具 举报

32

主题

300

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2012-3-30
在线时间
321 小时
发表于 2018-4-14 21:44:48 | 显示全部楼层
ST7920控制器可以使用串口方式,
接线少方便使用。
回复

使用道具 举报

30

主题

150

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2017-5-19
在线时间
149 小时
 楼主| 发表于 2018-4-14 21:47:25 | 显示全部楼层
czhaii 发表于 2018-4-14 21:44
ST7920控制器可以使用串口方式,
接线少方便使用。

没试过串行的,一直都是仿照别人的用并行的,你有串行的例程吗?
回复

使用道具 举报

32

主题

300

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2012-3-30
在线时间
321 小时
发表于 2018-4-15 10:12:31 | 显示全部楼层
sbit     CS=P2^6;                                 //  12864PIN4     vala显示缓冲valb加减时间处理缓冲
sbit     SID=P2^7;                                //     12864PIN5
sbit     SCLK=P1^0;                                 //     12864PIN6


/*------------------写命令到LCD-----------------------*/
               void write_com(unsigned char cmdcode)
               {
               uchar i;
               uchar i_data,temp_data1,temp_data2;
               EA=0;
               i_data=0xf8;
               delay_1ms(10);
               CS=1;
               SCLK=0;
                for(i=0;i<8;i++)
                {
                SID=(bit)(i_data&0x80);
                SCLK=0;
                SCLK=1;
                i_data=i_data<<1;
                }
               i_data=cmdcode;
               i_data&=0xf0;
                for(i=0;i<8;i++)
                {
                SID=(bit)(i_data&0x80);
                SCLK=0;
                SCLK=1;
                i_data=i_data<<1;
                }
               i_data=cmdcode;
               temp_data1=i_data&0xf0;
               temp_data2=i_data&0x0f;
               temp_data1>>=4;
               temp_data2<<=4;
               i_data=temp_data1|temp_data2;
               i_data&=0xf0;
                for(i=0;i<8;i++)
                {
                SID=(bit)(i_data&0x80);
                SCLK=0;
                SCLK=1;
                i_data=i_data<<1;
                }
               CS=0;
               EA=1;
               }
/*-------------------写数据到LCD----------------------*/
               void write_data(unsigned char Dispdata)
               {
               uchar i;
               uchar i_data,temp_data1,temp_data2;
               EA=0;
               i_data=0xfa;
               delay_1ms(10);
               CS=1;
                for(i=0;i<8;i++)
                {
                SID=(bit)(i_data&0x80);
                SCLK=0;
                SCLK=1;
                i_data=i_data<<1;
                }
               i_data=Dispdata;
               i_data&=0xf0;
                for(i=0;i<8;i++)
                {
                SID=(bit)(i_data&0x80);
                SCLK=0;
                SCLK=1;
                i_data=i_data<<1;
                }
               i_data=Dispdata;
               temp_data1=i_data&0xf0;
               temp_data2=i_data&0x0f;
               temp_data1>>=4;
               temp_data2<<=4;
               i_data=temp_data1|temp_data2;
               i_data&=0xf0;
                for(i=0;i<8;i++)
                {
                SID=(bit)(i_data&0x80);
                SCLK=0;
                SCLK=1;
                i_data=i_data<<1;
                }
               CS=0;
               EA=1;
               }
/*------------------初始化LCD屏-----------------------*/
               void lcd_init()
               {
               uchar comdata;
               delay_1ms(100);
               comdata=0x30;
               write_com(comdata); /*功能设置:一次送8位数据,基本指令集*/
               comdata=0x04;
               write_com(comdata); /*点设定:显示字符/光标从左到右移位,DDRAM地址加1*/
               comdata=0x0f;
               write_com(comdata); /*显示设定:开显示,显示光标,当前显示位反白闪动*/
               comdata=0x01;
               write_com(comdata); /*清DDRAM*/
               comdata=0x02;
               write_com(comdata); /*DDRAM地址归位*/
               comdata=0x80;
               write_com(comdata); /*把显示地址设为0X80,即为第一行的首位*/
               }



/**************显示时间*********************/   
               void   distime()
               {
                write_com(0x94);
                write_data(0xCA);
                write_data(0xB1);                /*---时----*/
                write_com(0x95);
                write_data(0xBC);
                write_data(0xE4);                /*---间----*/
               }     
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-4-16 01:22:16 | 显示全部楼层
爱问知识人 发表于 2018-4-14 21:36
原子哥,请问:往GPIO->ODR寄存器操作,是不是一下操作了某个IO口的高8位和低8位的整个16位的端口数据?

是的。、
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-4-16 08:46:33 | 显示全部楼层
爱问知识人 发表于 2018-4-14 21:34
您好,我学习了LED寄存器的视频教程,对上面的寄存器操作懂了不少,还是有个疑问,没有想明白,那就是GPI ...

        GPIOB->CRL&=0XFF0FFFFF;
        GPIOB->CRL|=0X00300000;//PB.5 í&#198;íìê&#228;3&#246;            
    GPIOB->ODR|=1<<5;      //PB.5 ê&#228;3&#246;&#184;&#223;
                                                                                          
        GPIOE->CRL&=0XFF0FFFFF;
        GPIOE->CRL|=0X00300000;//PE.5í&#198;íìê&#228;3&#246;
        GPIOE->ODR|=1<<5;      //PE.5ê&#228;3&#246;&#184;&#223;

这几句话你仔细看看
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2020-7-15
在线时间
4 小时
发表于 2020-7-15 16:54:40 | 显示全部楼层
楼主,你12864液晶显示做成功了吗 ?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 01:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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