4020
- 收藏
- 点赞
- 分享
- 举报
STM32 12864液晶程序 调试通过、、
/***************************************************
本人最近开发一个项目,用到以KS0108为控制芯片的12864点阵LCD液晶模块,
为加快开发进度,本人想到网上找该模块的STM32程序,可是找了好久,没有找到,
只能自己写,这些子程序是本人调试通过的,本程序适用于以KS0108或兼容芯片为
控制器的双屏结构的液晶模块,项目还没做完,先把子程序分享给大家,仅供参考......
****************************************************/
#include "stm32f10x.h"
#define LCD_E1 GPIOC->BSRR = GPIO_Pin_12 //PC12
#define LCD_E0 GPIOC->BRR = GPIO_Pin_12
#define LCD_DI1 GPIOG->BSRR = GPIO_Pin_13 //PG
#define LCD_DI0 GPIOG->BRR = GPIO_Pin_13
#define LCD_RW1 GPIOE->BSRR = GPIO_Pin_4 //PE4
#define LCD_RW0 GPIOE->BRR = GPIO_Pin_4
#define LCD_RST1 GPIOG->BSRR = GPIO_Pin_12 //PG12
#define LCD_RST0 GPIOG->BRR = GPIO_Pin_12
#define LCD_CS11 GPIOC->BSRR = GPIO_Pin_10 //PC10
#define LCD_CS10 GPIOC->BRR = GPIO_Pin_10
#define LCD_CS21 GPIOC->BSRR = GPIO_Pin_11 //PC11
#define LCD_CS20 GPIOC->BRR = GPIO_Pin_11
#define LCD_PORT GPIOD
#define LCD_DISP_ON 0x3F
#define LCD_DISP_OFF 0x3E
#define LCD_DISP_ROW 0xC0
#define LCD_DISP_PAGE 0xB8
#define LCD_DISP_Y 0x40
GPIO_InitTypeDef GPIO_InitStructure;
void Delayms(uint32_t ms)
{
//uint32_t temp;
uint32_t i, j;
for( i = ms; i > 0; i-- )
{
for( j = 7200 ; j > 0 ; j-- )
{}
}
}
void LCD_Configuration(void)
{
GPIO_InitStructure.GPIO_Pin
=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7
;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LCD_PORT, &GPIO_InitStructure); // PORTD 为开漏输出
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_12|GPIO_Pin_13);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOG, &GPIO_InitStructure);
Delayms(1);
}
void LCD_reset(void)
{
LCD_E0;
Delayus(10);
LCD_RST0;
Delayms(2);
LCD_RST1;
Delayms(200);
}
void LCD_CS(u8 index) //0--select none 1--left 2--right 3--all
{
switch(index)
{
case 0:
LCD_CS11;
LCD_CS21;
break;
case 1:
LCD_CS10;
LCD_CS21;
break;
case 2:
LCD_CS11;
LCD_CS20;
break;
case 3:
LCD_CS10;
LCD_CS20;
break;
}
Delayus(100);
}
void LCD_Check_Busy(void)
{
//GPIO_InitTypeDef GPIO_InitStructure;
u8 temp=0;
LCD_DI0; // DI =0 指令
LCD_RW1; // RW =1 读模式
// 第7位读状态
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LCD_PORT, &GPIO_InitStructure);
Delayus(1);
do{
LCD_E1;
Delayus(1);
temp = GPIO_ReadInputDataBit(LCD_PORT, GPIO_Pin_7);
LCD_E0;
Delayus(1);
}while(temp);//等待不忙
LCD_E0;
//--------把D7 设为输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LCD_PORT, &GPIO_InitStructure);
Delayus(1);
//---------------------
}
void LCD_cmd(vu8 portValue)
{
u16 tmpData;
LCD_Check_Busy();
LCD_RW0;
LCD_DI0;
tmpData = GPIO_ReadOutputData(LCD_PORT); // 读端口数据
tmpData &= 0xFF00; // 清掉低8位
GPIO_Write(LCD_PORT, (tmpData|((u16)portValue)));
Delayus(1);
LCD_E1;
Delayus(1);
LCD_E0;
Delayus(1);
}
vu8 LCD_rd(void)//在写地址后,要进行一次空读,以后每读一次地址自动加1
{
vu8 rdata;
LCD_Check_Busy();
//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //低8位输入
GPIO_InitStructure.GPIO_Pin
=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7
;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LCD_PORT, &GPIO_InitStructure);
LCD_RW1; //READ
LCD_DI1; //DATA
Delayus(1);
LCD_E1;
Delayus(5);
rdata=GPIO_ReadInputData(LCD_PORT);
LCD_E0;
Delayus(1);
//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Pin
=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7
;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
//GPIO_InitStructure.GPIO_Pin =0x00FF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LCD_PORT, &GPIO_InitStructure);
Delayus(1);
return rdata;
}
void LCD_wd(vu8 portValue)
{
u16 tmpData;
LCD_Check_Busy();//LEFT OR RIGHT
LCD_RW0; //WRITE
LCD_DI1; //DATA
tmpData = GPIO_ReadOutputData(LCD_PORT); // 读端口数据
tmpData &= 0xFF00; // 清掉低8位
GPIO_Write(LCD_PORT,(tmpData|((u16)portValue))); // 写数据到端口
Delayus(1);
LCD_E1;
Delayus(1);
LCD_E0;
Delayus(1);
}
void LCD_rwd(u8 row,u8 page,u8 dat,u8 mode)//读修改写模式 page 0~7 row 0~127
{
vu8 rd;
if(row<64)
{
LCD_CS(1);
LCD_cmd(LCD_DISP_PAGE+page); //定位页
LCD_cmd(LCD_DISP_Y+row);//定位列
rd=LCD_rd();//空读
rd=LCD_rd();
LCD_cmd(LCD_DISP_PAGE+page); //定位页
LCD_cmd(LCD_DISP_Y+row);//定位列
if(mode==0)
LCD_wd(dat);
else if(mode==1)
LCD_wd(dat|rd);//或模式
else if(mode==2)
LCD_wd(dat&rd);//与模式
else
LCD_wd(~rd);//取反
}
else
{
LCD_CS(2);
LCD_cmd(LCD_DISP_PAGE+page); //定位页
LCD_cmd(LCD_DISP_Y+row-64);//定位列
rd=LCD_rd();//空读
rd=LCD_rd();
LCD_cmd(LCD_DISP_PAGE+page); //定位页
LCD_cmd(LCD_DISP_Y+row-64);//定位列
if(mode==0)
LCD_wd(dat);
else if(mode==1)
LCD_wd(dat|rd);//或模式
else if(mode==2)
LCD_wd(dat&rd);//与模式
else
LCD_wd(~rd);//取反
}
}
void LCD_init()
{
LCD_CS(3);//选左屏 右屏
LCD_cmd(LCD_DISP_PAGE);//0xb8
Delayms(5);
LCD_cmd(LCD_DISP_Y); //0x40
Delayms(5);
LCD_cmd(LCD_DISP_ROW);//START LINE 0xc0
Delayms(5);
LCD_cmd(LCD_DISP_ON); //0x3f
Delayms(5);
}
void LCD_Clear(void)
{
u8 page,count;
for(page=0xb8;page<=0xbF;page++)//共8 页,0XB8-0XBF
{
LCD_cmd(page);
LCD_cmd(0x40);
for(count=64;count>0;count--)//写第page 页的左64 列
{
LCD_wd(0X00);
}
}
}
void LCD_Pixe(u8 x,u8 y)//画点程序
{ /*
vu8 rd;
if(x<64)
{
LCD_CS(1);
LCD_cmd(LCD_DISP_PAGE+y/8); //定位页
LCD_cmd(LCD_DISP_Y+x);//定位列
rd=LCD_rd();//空读
rd=LCD_rd();
LCD_cmd(LCD_DISP_PAGE+y/8); //定位页
LCD_cmd(LCD_DISP_Y+x);//定位列
LCD_wd((1<<(y%8))|rd);
}
else
{
LCD_CS(2);
LCD_cmd(LCD_DISP_PAGE+y/8); //定位页
LCD_cmd(LCD_DISP_Y+x-64);//定位列
rd=LCD_rd();//空读
rd=LCD_rd();
LCD_cmd(LCD_DISP_PAGE+y/8); //定位页
LCD_cmd(LCD_DISP_Y+x-64);//定位列
LCD_wd((1<<(y%8))|rd);
}
*/
LCD_rwd(x,y/8,(1<<(y%8)),1);
}
//画横线程序
void LCD_H_Line(u8 x1,u8 y1, u8 len,u8 weight) //len 0~128
{
u8 i,p,dat,xx;
p=y1/8;
dat=((1<
for(i=0;i
xx=x1+i;
if(xx>127) xx=127;//超过屏幕边沿剪断
LCD_rwd(xx,p,dat,1);
}
}
//画坚线程序
void LCD_V_Line(u8 x1,u8 y1,u8 len,u8 weight) //len 0~64
{
u8 i,j,p,xx,yy,dat=0;
for(j=0;j
for(i=0;i
yy=y1+i;
if(yy>63) yy=63;//超过屏幕边沿剪断
p=yy/8;
dat|=(1<<(yy%8));//
if((yy+1)%8==0||(i==len));
{
xx=x1+j;
if(xx>127) xx=127;//超过屏幕边沿剪断
LCD_rwd(xx,p,dat,1);
dat=0;
}
}
}
}
我来回答
回答1个
时间排序
认可量排序
认可0
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
2013-12-07 21:52:40
-
2013-08-27 13:36:22
-
2013-08-26 23:31:50
-
2013-08-25 19:37:25
-
2013-08-25 13:14:46
-
2013-08-25 15:55:19
-
2018-12-24 14:08:27
-
2013-11-19 13:16:54
-
2013-08-24 12:31:03
-
2013-11-19 20:55:12
-
2018-10-25 14:15:19
-
2013-11-24 16:41:55
-
2013-12-02 21:55:35
-
2018-10-31 11:20:54
-
2013-11-18 11:08:00
-
2013-08-26 23:30:31
-
2013-11-23 08:55:19
-
02013-08-24 22:15:18
-
2013-08-27 13:35:24
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认