2019-03-24 18:00发布
人民币的幻想 发表于 2015-5-9 09:35 #include "12864.h" #include "delay.h" //#include "lcd_table.h" /************************************************************************************* 需要实现 从数据线读数据函数(拼凑) 向数据线写数据函数(拼凑) 写命令/数据函数 点亮任意位置一个点 2015年4月14日完成 2015年4月17日修改 更换方法实现画点函数 实现一个[32][32]RAM缓冲区 格式如下 //[0]0 1 2 3 ... 31(字节) //[1]0 1 2 3 ... 31(字节) //[2]0 1 2 3 ... 31(字节) //[3]0 1 2 3 ... 31(字节) 将此缓冲区直接更新到GDRAM中即可 *************************************************************************************/ /************************************************************************************* LCD12864 LCD_RS PB1 LCD_RW PE3 LCD_EN PE4 LCD_PSB PE5 LCD_RST 接到板子RST上 LCD_D0 PE6 LCD_D1 PF6 LCD_D2 PF11 LCD_D3 PG6 LCD_D4 PG7 LCD_D5 PG8 LCD_D6 PG12 LCD_D7 PG15 LCD_BL PB0 ************************************************************************************/ uint8_t xdata LCD_GRAM[32][32]; //数据格式 //D7 D6 D5 D4 D3 D2 D1 D0 uint8_t ReadByteFromLCD(void) { uint8_t res=0; P0=0xFF; res=P0; return res; } void WriteByteToLCD(uint8_t byte) { P0=byte; } /************************************************************************************* ************************************************************************************/ /************************************************************************************* LCD判忙函数 1:忙 0:不忙 ************************************************************************************/ uint8_t LCD_Busy(void) { uint8_t res=0; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delay_us(5); //读数据 res=(ReadByteFromLCD()&0x80); LCD_EN = 0; return res; } //写指令/数据到LCD void WriteToLCD(uint8_t mode,uint8_t byte) { if(mode==LCD_CMD)//写指令 { while(LCD_Busy()); LCD_RS = 0;//指令 LCD_RW = 0;//写 LCD_EN = 0; delay_us(5); WriteByteToLCD(byte);//写 delay_us(5); LCD_EN = 1; delay_us(5); LCD_EN = 0; }else //写数据 { while(LCD_Busy()); LCD_RS = 1;//数据 LCD_RW = 0; LCD_EN = 0; delay_us(5); WriteByteToLCD(byte);//写 delay_us(5); LCD_EN = 1; delay_us(5); LCD_EN = 0; } } void LCD12864_Init(void) { LCD_PSB=1; WriteToLCD(LCD_CMD,0x34);//扩充指令操作 delay_ms(100); WriteToLCD(LCD_CMD,0x30);//基本指令操作 delay_ms(100); WriteToLCD(LCD_CMD,0x0C);//显示开,关光标 delay_ms(100); WriteToLCD(LCD_CMD,0x01);//清LCD delay_ms(5); } void LCD_Clear(void) { WriteToLCD(LCD_CMD,0x01);//清LCD delay_ms(5); } //设定显示位置 //x=0-3,y=0-7 //128*64=16*8*16*4 void LCD_SetCursor(uint8_t x,uint8_t y) { if (x==1) {x=0x80;} else if (x==2) {x=0x90;} else if (x==3) {x=0x88;} else if (x==4) {x=0x98;} WriteToLCD(LCD_CMD,x+y); //显示地址 } void LCD_ShowString(uint8_t x,uint8_t y, uint8_t *s) { LCD_SetCursor(x,y); while(*s!=' ') { WriteToLCD(LCD_DATA,*s++); } *s=0; } //画点函数 /* GDRAM分布 256(16*16) X |-----------------------------|-----------------------------------| |0 | | | 上半屏128*32 | 下半屏128*32 | Y|32 | | |-----------------------------|-----------------------------------| 水平x坐标每隔16个点才有一个位址,因此改变某个点需要知道该点位于这16个点的哪个位置 垂直y坐标在大于31时处于下半屏,小于31处于上半屏 */ //x:0-127 //y:0-63 //mode:1,画点 //mode:0,清空 void LCD_DrawPoint(uint8_t x,uint8_t y,uint8_t mode) { //判断处于哪行哪列 uint8_t x_pos,x_bit;//x_pos用来判断处于位址,x_bit用来判断处于位址中的位置 uint8_t y_pos,y_bit;//y_pos用来判断处于上半屏还是下半屏 y_bit用来判断位于哪行 // uint8_t x_pos_temp; // if((x>127)||(y>63)||(x
最多设置5个标签!
谢谢,不过你确定这是用的串口?
一周热门 更多>