STM8L 不带字库12864显示

2019-07-19 21:15发布

我这样怎么点不亮不带字库的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]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。