OpenEdv-开源电子网

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

STM8L 不带字库12864显示

[复制链接]

15

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2014-11-1
在线时间
2 小时
发表于 2015-3-9 09:55:28 | 显示全部楼层 |阅读模式
5金钱
我这样怎么点不亮不带字库的12864,哪里出问题了?求指导

[mw_shl_code=c,true]//lcd.h #ifndef __LCD_H #define __LCD_H #include "stm8l15x.h" #include "stm8l15x_gpio.h" #define RW_H() (GPIO_SetBits(GPIOA, GPIO_Pin_6)) #define RW_L() (GPIO_ResetBits(GPIOA, GPIO_Pin_6)) #define E_H() (GPIO_SetBits(GPIOA, GPIO_Pin_7)) #define E_L() (GPIO_ResetBits(GPIOA, GPIO_Pin_7)) #define RS_H() (GPIO_SetBits(GPIOD, GPIO_Pin_2)) #define RS_L() (GPIO_ResetBits(GPIOD, GPIO_Pin_2)) #define CS1_H() (GPIO_SetBits(GPIOE, GPIO_Pin_1)) #define CS1_L() (GPIO_ResetBits(GPIOE, GPIO_Pin_1)) #define CS2_H() (GPIO_SetBits(GPIOE, GPIO_Pin_2)) #define CS2_L() (GPIO_ResetBits(GPIOE, GPIO_Pin_2)) #define DATA_GPIO_PORT GPIOB //数据接口接PB0-PB7 #define DATA (GPIO_Pin_0|GPIO_Pin_1\ |GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4\ |GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7 ) void gpio_config(void) { GPIO_Init(GPIOA, GPIO_Pin_5, GPIO_Mode_Out_PP_High_Slow); /*初始化数据输入引脚DI*/ GPIO_Init(GPIOA, GPIO_Pin_6, GPIO_Mode_Out_PP_High_Slow); /*初始化读写端引脚RW*/ GPIO_Init(GPIOA, GPIO_Pin_7, GPIO_Mode_Out_PP_High_Slow); /*初始化使能端引脚EN*/ GPIO_Init(GPIOE, GPIO_Pin_1, GPIO_Mode_Out_PP_High_Slow); /*初始化片选CS1*/ GPIO_Init(GPIOE, GPIO_Pin_2, GPIO_Mode_Out_PP_High_Slow); /*初始化片选CS2*/ GPIO_Init(GPIOD, GPIO_Pin_2, GPIO_Mode_Out_PP_High_Slow); /*初始化复位引脚RST*/ /*初始化数据引脚*/ GPIO_Init(GPIOB, GPIO_Pin_0, GPIO_Mode_Out_PP_High_Slow); GPIO_Init(GPIOB, GPIO_Pin_1, GPIO_Mode_Out_PP_High_Slow); GPIO_Init(GPIOB, GPIO_Pin_2, GPIO_Mode_Out_PP_High_Slow); GPIO_Init(GPIOB, GPIO_Pin_3, GPIO_Mode_Out_PP_High_Slow); GPIO_Init(GPIOB, GPIO_Pin_4, GPIO_Mode_Out_PP_High_Slow); GPIO_Init(GPIOB, GPIO_Pin_5, GPIO_Mode_Out_PP_High_Slow); GPIO_Init(GPIOB, GPIO_Pin_6, GPIO_Mode_Out_PP_High_Slow); GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_Out_PP_High_Slow); } #endif //main.c #include "stm8l15x.h" #include "lcd.h" #define uchar unsigned char /*Ms 延时*/ void DelayMs(unsigned int ms) { unsigned int i,j; while(ms !=0 ) { for(i=0;i<250;i++); for(j=0;j<75;j++); ms--; } } void DelayUs2x(unsigned int t)//延时nus { while(--t); } void check_busy(void) { RS_L(); RW_H(); E_H(); while(GPIO_ReadInputData(GPIOB) & 0x80); //只要位7的值,位7是忙标志位。 E_L(); } /*液晶写命令*/ void write_cmd(unsigned char cmd) { check_busy(); RW_L(); RS_L(); // DATA=cmd; /**此处,只有直接操作寄存器才能 *达到,只改变输出数据寄存器ODR的低8位,其它位 *不变的目的。因为,只有低8位是数据引脚, *其它位可能是控制引脚,不能改变。 */ // GPIOB->ODR=((GPIOB->ODR & 0X00)|cmd); GPIO_Write(GPIOB,GPIO_Pin_0|GPIO_Pin_1\ |GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4\ |GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); E_H(); // DelayMs(2); E_L(); // DelayMs(2); } /*液晶写数据*/ void write_data(unsigned char data) { check_busy(); RW_L(); RS_H(); // DATA=data; // GPIOB->ODR=((GPIOB->ODR & 0X00)|data); GPIO_Write(GPIOB,GPIO_Pin_0|GPIO_Pin_1\ |GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4\ |GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); E_H(); // DelayMs(2); E_L(); // DelaKyMs(2); } /* *选择左右屏 case 0:代表左屏 * case 1:代表右屏 */ void cs_select(unsigned char cs) { switch(cs) { case 0: CS1_L(); CS2_H(); break; case 1: CS1_H(); CS2_L(); break; } } /*液晶清屏*/ void lcd_clear(void) { unsigned char i=0,j=0; CS1_L(); CS2_L(); for(i=0;i<8;i++) { write_cmd(0xb8+i); write_cmd(0x40); for(j=0;j<64;j++) { write_data(0x00); } } } /*液晶初始化*/ void lcd_init(void) { E_L(); CS1_L(); CS2_L(); lcd_clear(); write_cmd(0x3f); //开显示 write_cmd(0xc0); //要显示的起始行 } //void Init_12864(void) //{ //// DelayMs(40); //大于40MS的延时程序 //// PSB=1; //设置为8BIT并口工作模式 // DelayMs(1); //延时 // RS_L(); //复位 // DelayMs(1); //延时 // RS_H(); //复位置高 // DelayMs(10); // write_cmd(0x30); //选择基本指令集 // DelayUs2x(50); //延时大于100us // write_cmd(0x30); //选择8bit数据流 // DelayUs2x(20); //延时大于37us // write_cmd(0x0c); //开显示(无游标、不反白) // DelayUs2x(50); //延时大于100us // write_cmd(0x01); //清除显示,并且设定地址指针为00H // DelayMs(15); //延时大于10ms // write_cmd(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动 // DelayUs2x(50); //延时大于100us //} /**X代表横坐标,范围0-8 *Y代表纵坐标,范围1-4 */ void LCD_PutString(unsigned char x,unsigned char y,unsigned char *s) { switch(y) { case 1: write_cmd(0x80+x);break; case 2: write_cmd(0x90+x);break; case 3: write_cmd(0x88+x);break; case 4: write_cmd(0x98+x);break; default:break; } while(*s>0) { write_data(*s); s++; DelayMs(1); } } /********************************** 选择页 设置X地址 **********************************/ void setline(uchar line) //12864总共有8页(0~7),每页有8行 { line=line&0x07; //只取后三位xxxx x111 ,这3个是要改变位置的数据 line=line|0xb8; //0xb8 为1011 1000固定格式,后面3位(D2-D0)可根据要写入的页具体修改 write_cmd(line); } /********************************** 选择列 设置Y地址 **********************************/ void setcolum(uchar colum) //12864每半屏有64列(0~63),分为左右2屏,共128列 { colum=colum&0x3f; //xx11 1111,这个是要改变Y位置的数据 colum=colum|0x40; //0x40 为0100 0000固定格式,后面6位(D5-D0)可跟据要写入的列具体修改 write_cmd(colum); } /********************************** 选择起始行 **********************************/ //void setstartline(uchar startline) //{ // startline=startline&0x3f;//xx11 1111,这个是要改变x位置的数据 // startline=startline|0xc0;//11xxxxxx,是起始行设置的固定指令 // write_cmd(startline); //} void main(void) { uchar i; lcd_init(); //液晶初始化 cs_select(0); //选择左半屏 setline(0); //从第一页开始显示 setcolum(0); //从第一列开始显示 for(i=0;i<64;i++) //左半屏有64列,循环64次 { write_data(0x55); DelayMs(1000); } lcd_clear(); } [/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

回复【5楼】盲流: --------------------------------- 已经解决,是硬件问题   谢谢
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2014-11-1
在线时间
2 小时
 楼主| 发表于 2015-3-9 09:55:29 | 显示全部楼层
回复【5楼】盲流:
---------------------------------
已经解决,是硬件问题   谢谢
回复

使用道具 举报

109

主题

1606

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2222
金钱
2222
注册时间
2011-12-15
在线时间
37 小时
发表于 2015-3-9 14:42:07 | 显示全部楼层
8L的电平是3.3的,LCD的是3.3的吗
专业制作STM32 物联网通信模块板,模块交流群:369840039。
回复

使用道具 举报

15

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2014-11-1
在线时间
2 小时
 楼主| 发表于 2015-3-9 14:50:20 | 显示全部楼层
回复【2楼】ST-FAE-SALE:
---------------------------------
是的,电平没有弄错的!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-3-9 22:50:52 | 显示全部楼层
帮顶....
回复

使用道具 举报

2

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2015-3-18
在线时间
3 小时
发表于 2015-6-10 19:27:11 | 显示全部楼层
好你是没定时钟吧。。。
回复

使用道具 举报

2

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2015-3-18
在线时间
3 小时
发表于 2015-6-17 16:13:00 | 显示全部楼层
回复【6楼】XXL:
---------------------------------
液晶会显示什么???怎么感觉你的没啥显示呢?
回复

使用道具 举报

15

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2014-11-1
在线时间
2 小时
 楼主| 发表于 2015-6-17 16:38:51 | 显示全部楼层
回复【7楼】盲流:
---------------------------------
隔一行有横线显示,write_data(0x55);  这句可以显示的
回复

使用道具 举报

2

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2015-3-18
在线时间
3 小时
发表于 2015-6-18 14:29:58 | 显示全部楼层
回复【8楼】XXL:
---------------------------------
可是你都没定义RCC GPIOA.和GPIOB的时钟怎么会显示呢??/不解
回复

使用道具 举报

15

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2014-11-1
在线时间
2 小时
 楼主| 发表于 2015-6-18 14:36:41 | 显示全部楼层
回复【9楼】盲流:
---------------------------------
STM8与STM32的区别是,STM8在使用普通IO的时候,时钟是可以不需要定义的,而32是要定义时钟的
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2015-6-19
在线时间
0 小时
发表于 2015-6-19 11:33:13 | 显示全部楼层
问下 你的显示的数组放置在哪里?rom还是ram?
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2015-6-19
在线时间
0 小时
发表于 2015-6-19 11:35:23 | 显示全部楼层
回复【10楼】XXL:
---------------------------------
不是吧  是你不设置就自动开启内部时钟了吧,你这样其实是单片机内部的时钟是默认打开的
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2016-5-13
在线时间
9 小时
发表于 2016-6-3 17:33:00 | 显示全部楼层
RWEW
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 01:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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