OpenEdv-开源电子网

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

求助stm32控制240*128液晶程序,参考一下,第一次做这个,望大神指点

[复制链接]

5

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2015-8-25
在线时间
27 小时
发表于 2015-9-15 17:02:05 | 显示全部楼层 |阅读模式
5金钱
求助stm32控制240*128液晶程序,参考一下,第一次做这个,望大神指点

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

使用道具 举报

5

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2015-8-25
在线时间
27 小时
 楼主| 发表于 2015-9-15 17:33:44 | 显示全部楼层
哪位大神有做过这个   分享一下这个驱动程序   参考一下   谢谢了
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8058
金钱
8058
注册时间
2014-8-13
在线时间
1597 小时
发表于 2015-9-15 20:29:53 | 显示全部楼层

我自己的240*64的液晶模块。  8080接口, T6963C主控。


这个最好还得有液晶模块的说明书;

我代码贴一下吧,目前刚刚能实现显示,画线、图形什么都还没做,LZ如果也用T6963C主控的话,可以再完善这些代码


[mw_shl_code=c,true]#ifndef __T6963C_DRIVER_H #define __T6963C_DRIVER_H #include "sys.h" ////////////////////////////////////////////////////////////////////////////////// // //Zkek //辊缝仪 信息显示 //775286866@qq.com // //修改日期:2014/12/25 //版本:V1.0 //版权所有,盗版必究。 //Copyright(C) Zkek 2014-2024 //All rights reserved ////////////////////////////////////////////////////////////////////////////////// #define LCM_WR PEout(2) //0有效 #define LCM_CE PEout(3) //0有效 #define LCM_RD PEout(4) //0有效 #define LCM_D0C1 PEout(5) //0ata 1:Command #define LCM_RST PEout(6) //0有效 #define PIN_OUT 0 #define PIN_IN (!0) #define LCM_OUT_PORT (GPIOF ->ODR) #define LCM_IN_PORT ((GPIOF ->IDR) & 0xFF) //---------------define LCM characteristic ----------------------// #define graphic_addr (BlocksWidth * BlocksHeight) #define text_addr 0x0000 #define lcm_x_dots 240 #define lcm_y_dots 64 #define BlockDotsX 8 #define BlockDotsY 8 #define BlocksWidth 30 //显示区宽度 #define BlocksHeight 8 #define longWidth 16 #define shortWidth 8 #define graphicMode 0x98 #define textMode 0x9C #define dataInstrRWRdy 0x03 #define dataAutoWRdy 0x08 #define displayMode_OR 0x80 #define displayMode_NOR 0x81 #define displayMode_AND 0x83 #define cmdSetTextOffsetAddr 0x40 #define cmdSetTextAreaWidth 0x41 #define cmdSetGraphicOffsetAddr 0x42 #define cmdSetGraphicAreaWidth 0x43 #define cmdSetRamAddr 0x24 #define cmdDataAutoWrOn 0xB0 #define cmdDataAutoWrOff 0xB2 #define iCursorOn 0x02 #define iCursorBlink 0x01 //LCM Zone //////////////////设置LCM的DB方向, //ucIoType !0为输入,0为输出 void SetLcmPinType(u8 ucIoType); void SetLcmIoIn(void); void SetLcmIoOut(void); u8 RetrieveLcmStat(void); u8 LcmIsBusy(void); u8 SendCmdToLcm(u8 ucCmd); u8 SendDataToLcm(u8 ucCmd); u8 ReadDataFromLcm(void); u8 LcmWordCmd(u8 ucData1, u8 ucData2, u8 ucCmd); u8 LcmByteCmd(u8 ucData1, u8 ucCmd); u8 LcmNoneDataCmd(u8 ucCmd); u8 LcmTextClear(void); u8 LcmGraphicClear(void); u8 LcmAutoWr(u8 ucData); u8 LcmDisplayTextChar(u8 ucRow, u8 ucColumn, u8 ucChar); u8 LcmTextFormat(u8 ucChar); u8 LcmGraphicFormat(u8 ucChar); // u8 LcmInit(u8 ucMode); //初始化Lcm显示 u8 LcmDisplayGraphicChar(u8 ucRow, u8 ucColumn, u8 ucCharIndex); u8 LcmGraphicCharShow(u8 ucRow, u8 ucColumn, u8 ucCharIndex); u8 LcmGraphicSpread(void); #endif[/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true]
[mw_shl_code=c,true]#include "T6963C_Driver.h" #include "zkekglobe.h" #include "CommUse.h" #include "board.h" #include "delay.h" #include "Fonts.h" ////////////////////////////////////////////////////////////////////////////////// // //Zkek //辊缝仪 信息显示 //775286866@qq.com // //修改日期:2014/12/25 //版本:V1.0 //版权所有,盗版必究。 //Copyright(C) Zkek 2014-2024 //All rights reserved ////////////////////////////////////////////////////////////////////////////////// //////////////////设置LCM的DB方向, //ucIoType !0为输入,0为输出 void SetLcmPinType(u8 ucIoType) { if(ucIoType) { SetLcmIoIn(); } else { SetLcmIoOut(); } } void SetLcmIoIn(void) { GPIO_Set(GPIOF, PIN0 | PIN1 | PIN1 | PIN2 | PIN3 | PIN4 | PIN5 | PIN6 | PIN7, GPIO_MODE_IN, 0, 0, GPIO_PUPD_PD); } void SetLcmIoOut(void) { GPIO_Set(GPIOF, PIN0 | PIN1 | PIN1 | PIN2 | PIN3 | PIN4 | PIN5 | PIN6 | PIN7, GPIO_MODE_OUT, GPIO_OTYPE_PP, GPIO_SPEED_100M, GPIO_PUPD_PD); } u8 LcmInit(u8 ucMode) { u8 ucStat= 1; u16 uwAddr; //PF0-7 LCM_DB0-7 SetLcmPinType(PIN_OUT); LCM_OUT_PORT &= (~0xFF); //PE2-6 LCM_WR LCM_CE LCM_RD LCM_C/D LCM_RST GPIO_Set(GPIOE, PIN2 | PIN3 | PIN4 | PIN5 | PIN6, GPIO_MODE_OUT, GPIO_OTYPE_PP, GPIO_SPEED_100M, GPIO_PUPD_PD); LCM_WR = 1; LCM_RD = 1; LCM_CE = 1; LCM_RST = 1; LCM_RST = 0; //重启 delay_ms(20); //此处保证要有5ms以上才能保证复位稳定,推荐20ms LCM_RST = 1; //启动 delay_ms(20); //此处保证要有5ms以上才能保证复位稳定,推荐20ms LCM_CE = 0; //使能 do { //显示方式:逻辑或, 内部CGRAM关闭 if(LcmNoneDataCmd(0x88)) { break; } //文本显示区域首地址 if(LcmWordCmd((u8)text_addr, (u8)(text_addr >> 8), cmdSetTextOffsetAddr)) { break; } //设置文本有30列 if(LcmWordCmd(BlocksWidth, 0, cmdSetTextAreaWidth)) { break; } uwAddr = BlocksWidth * BlocksHeight; //图形区域首地址 if(LcmWordCmd((u8)uwAddr, (u8)(uwAddr >> 8), cmdSetGraphicOffsetAddr)) { break; } //图形区域宽度 if(LcmWordCmd(BlocksWidth, 0, cmdSetGraphicAreaWidth)) { break; } //显示状态:光标闪烁关,光标显示关,文本显示关,图形显示开 if(LcmNoneDataCmd(ucMode)) { break; } //光标形状:占一行 ucStat = LcmNoneDataCmd(0xA1); } while(0); return ucStat; } u8 LcmDisplayGraphicChar(u8 ucRow, u8 ucColumn, u8 ucCharIndex) { return 0; } u8 LcmDisplayTextChar(u8 ucRow, u8 ucColumn, u8 ucChar) { u8 ucStat = 1; u16 uwAddr; uwAddr = ucRow * BlocksWidth + ucColumn; do { if(LcmWordCmd((u8)uwAddr, (u8)(uwAddr >> 8), cmdSetRamAddr)) { break; } if(LcmNoneDataCmd(cmdDataAutoWrOn)) { break; } if(LcmAutoWr(ucChar)) { break; } ucStat = LcmNoneDataCmd(cmdDataAutoWrOff); } while(0); return ucStat; } u8 LcmAutoWr(u8 ucData) { u16 uwCnt = 2000; while(!(RetrieveLcmStat() & 0x08) && uwCnt--) { ; } if(!uwCnt) { return 1; } SetLcmPinType(PIN_OUT); LCM_OUT_PORT = (LCM_OUT_PORT & (~0xFF)) | ucData; LCM_D0C1 = 0; //switch to Data mode LCM_RD = 1; LCM_WR = 0; delay_us(100); LCM_WR = 1; return 0; } u8 LcmGraphicClear(void) { return LcmGraphicFormat(0); } u8 LcmGraphicFormat(u8 ucChar) { u8 ucStat = 1; u16 uwCnt; do { if(LcmWordCmd((u8)graphic_addr, (u8)(graphic_addr >> 8), cmdSetRamAddr)) { break; } if(LcmNoneDataCmd(cmdDataAutoWrOn)) { break; } for(uwCnt = BlocksWidth * lcm_y_dots; uwCnt > 0; uwCnt--) { if(LcmAutoWr(ucChar)) { break; } } if(uwCnt) { break; } ucStat = LcmNoneDataCmd(cmdDataAutoWrOff); } while(0); return ucStat; } u8 LcmGraphicSpread(void) { u8 ucStat = 1; u16 uwCnt; do { if(LcmWordCmd((u8)graphic_addr, (u8)(graphic_addr >> 8), cmdSetRamAddr)) { break; } if(LcmNoneDataCmd(cmdDataAutoWrOn)) { break; } for(uwCnt = 0; uwCnt < (lcm_x_dots * lcm_y_dots) >> 3; uwCnt++) { if(LcmAutoWr(uwCnt % 256)) { break; } } if(uwCnt) { break; } ucStat = LcmNoneDataCmd(cmdDataAutoWrOff); } while(0); return ucStat; } u8 LcmGraphicCharShow(u8 ucRow, u8 ucColumn, u8 ucCharIndex) { u8 ucStat = 1,ucCnt; u16 uwAddr; do { //uwAddr = (BlockDotsX * BlockDotsY * (BlocksWidth * ucRow + ucColumn)) >> 3; uwAddr = (lcm_x_dots / BlockDotsX) * (lcm_y_dots / BlockDotsY) + (BlockDotsY * (lcm_x_dots >> 3)) * ucRow * 2 + ucColumn; if((BlockDotsX >> 3) * BlockDotsY * BlocksWidth * BlocksHeight <= uwAddr) { break; } for(ucCnt = 0; ucCnt < 16; ucCnt++) { if(LcmWordCmd((u8)(uwAddr + ucCnt * 30), (u8)((uwAddr + ucCnt * 30) >> 8), cmdSetRamAddr)) { break; } if(LcmNoneDataCmd(cmdDataAutoWrOn)) { break; } if(LcmAutoWr(acChar_A[ucCnt])) { break; } if(LcmAutoWr(acChar_A[ucCnt])) { break; } if(LcmNoneDataCmd(cmdDataAutoWrOff)) { break; } } // // if(LcmAutoWr(asc2_1608[ucCharIndex][1])) // { // break; // } // if(LcmAutoWr(asc2_1608[ucCharIndex][2])) // { // break; // } // if(LcmAutoWr(asc2_1608[ucCharIndex][3])) // { // break; // } // if(LcmAutoWr(asc2_1608[ucCharIndex][4])) // { // break; // } // if(LcmAutoWr(asc2_1608[ucCharIndex][5])) // { // break; // } // if(LcmAutoWr(asc2_1608[ucCharIndex][6])) // { // break; // } // if(LcmAutoWr(asc2_1608[ucCharIndex][7])) // { // break; // } // if(LcmAutoWr(asc2_1608[ucCharIndex][8])) // { // break; // } // if(LcmAutoWr(asc2_1608[ucCharIndex][9])) // { // break; // } // if(LcmAutoWr(asc2_1608[ucCharIndex][10])) // { // break; // } // if(LcmAutoWr(asc2_1608[ucCharIndex][11])) // { // break; // } // if(LcmAutoWr(asc2_1608[ucCharIndex][12])) // { // break; // } // if(LcmAutoWr(asc2_1608[ucCharIndex][13])) // { // break; // } // if(LcmAutoWr(asc2_1608[ucCharIndex][14])) // { // break; // } // if(LcmAutoWr(asc2_1608[ucCharIndex][15])) // { // break; // } // ucStat = LcmNoneDataCmd(cmdDataAutoWrOff); } while(0); return ucStat; } u8 LcmTextClear(void) { return LcmTextFormat(0); } u8 LcmWordCmd(u8 ucData1, u8 ucData2, u8 ucCmd) { if(SendDataToLcm(ucData1)) { return 1; } if(SendDataToLcm(ucData2)) { return 1; } if(SendCmdToLcm(ucCmd)) { return 1; } return 0; } u8 LcmByteCmd(u8 ucData1, u8 ucCmd) { if(SendDataToLcm(ucData1)) { return 1; } if(SendCmdToLcm(ucCmd)) { return 1; } return 0; } u8 LcmNoneDataCmd(u8 ucCmd) { return SendCmdToLcm(ucCmd); } u8 RetrieveLcmStat(void) { u8 ucStat = 0; SetLcmPinType(PIN_IN); LCM_D0C1 = 1; //switch to Command mode LCM_WR = 1; LCM_RD = 0; ucStat = LCM_IN_PORT; LCM_RD = 1; return ucStat; } u8 LcmIsBusy(void) { return !(RetrieveLcmStat() & 0x03); } u8 SendCmdToLcm(u8 ucCmd) { u16 uwCnt = 2000; while(LcmIsBusy() && uwCnt--) { ; } if(!uwCnt) { return 1; } SetLcmPinType(PIN_OUT); LCM_OUT_PORT = (LCM_OUT_PORT & (~0xFF)) | ucCmd; LCM_D0C1 = 1; //switch to Command mode LCM_RD = 1; LCM_WR = 0; LCM_WR = 1; return 0; } u8 SendDataToLcm(u8 ucData) { u16 uwCnt = 2000; while(LcmIsBusy() && uwCnt--) { ; } if(!uwCnt) { return 1; } SetLcmPinType(PIN_OUT); LCM_OUT_PORT = (LCM_OUT_PORT & (~0xFF)) | ucData; LCM_D0C1 = 0; //switch to Data mode LCM_RD = 1; LCM_WR = 0; LCM_WR = 1; return 0; } u8 LcmTextFormat(u8 ucChar) { u8 ucStat= 1; u32 ucCnt = 0; do { //文本显示区域首地址 if(LcmWordCmd((u8)text_addr, (u8)(text_addr >> 8), cmdSetTextOffsetAddr)) { break; } //自动写开 if(LcmNoneDataCmd(cmdDataAutoWrOn)) { break; } for(ucCnt = BlocksHeight * BlocksWidth; ucCnt; ucCnt--) { if(LcmAutoWr(ucChar)) { break; } } if(ucStat) { break; } //关闭自动写 ucStat = LcmNoneDataCmd(cmdDataAutoWrOff); } while(0); return ucStat; } u8 ReadDataFromLcm(void) { u8 ucData; SetLcmPinType(PIN_IN); while(LcmIsBusy()) { ; } LCM_D0C1 = 0; LCM_WR = 1; LCM_RD = 0; ucData = LCM_IN_PORT; LCM_RD = 1; return ucData; } [/mw_shl_code]

[/mw_shl_code]

回复

使用道具 举报

5

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2015-8-25
在线时间
27 小时
 楼主| 发表于 2015-9-16 13:44:57 | 显示全部楼层
回复【3楼】mack13013:
---------------------------------
感谢啊   学习学习
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-19 18:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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