完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
/*************************************************
函数名:12864.c 功 能 :驱动12864液晶(带字库,串行方式) 时 间 :2013/06/27 更新 :2013/07/05 *************************************************/ #include "STM32f10x.h" #include "12864.h" #include "delay.h" // 选择PB10:CLK(E),输出 PB9R/W(SID),数据 PB8:RS/CS,片选 void LCD12864_Init(void) { RCC->APB2ENR|=1<<3; //使能PORTB时钟 GPIOB->CRH&=0XFFFF0000; GPIOB->CRH|=0X00003333;//PB.8~11推挽输出 GPIOB->ODR|=1<<8; //PB.8输出高 GPIOB->ODR|=1<<9; GPIOB->ODR|=1<<10; GPIOB->ODR|=1<<11; PSB_L; /*--------------------LCD基本指令-----------------------*/ delay_ms(2); Write_LCD_Command(0x30); //30--基本指令动作 delay_ms(5); Write_LCD_Command(0x0c); //光标右移画面不动 delay_ms(5); Write_LCD_Command(0x01); //清屏 delay_ms(5); //清屏时间较长 Write_LCD_Command(0x06); //显示打开,光标开,反白关 delay_ms(5); // Write_LCD_Command(0x34); // 扩充指令 // Write_LCD_Command(0x36); // 打开绘图指令 Draw_Clear(); // 清屏 //Draw_Update(); } /********************************************************* 函数名:Send_Byte() 返回值:无 功 能: 写数据到LCD *********************************************************/ void Send_Byte(u8 zdata) { u16 i; for(i=0; i<8; i++) { if((zdata << i) & 0x80) SID_H; else SID_L; SCLK_H; SCLK_L; } } /********************************************************* 函数名:Receive_Byte() 返回值:temp1+temp2 功 能: 读LCD数据 *********************************************************/ u8 Receive_Byte(void) { u8 i,temp1,temp2,value; temp1=0; temp2=0; for(i=0;i<8;i++) { temp1=temp1<<1; SCLK_L; SCLK_H; SCLK_L; if(PAout(7)==1) { temp1++; } } for(i=0;i<8;i++) { temp2=temp2<<1; SCLK_L; SCLK_H; SCLK_L; if(PAout(7)==1) { temp2++; } } temp1=0xf0&temp1; temp2=0x0f&temp2; value=temp1+temp2; return value ; } /********************************************************* 函数名:Check_Busy() 返回值:无 功 能: LCD忙检查 *********************************************************/ void Check_Busy(void) { do Send_Byte(0xfc); //11111,RW(1),RS(0),0 while(0x80&Receive_Byte()); } /********************************************************* 函数名: Write_LCD_Command() 返回值:无 功 能: 写命令到LCD *********************************************************/ void Write_LCD_Command(u8 cmdcode) { CS_H; Check_Busy(); Send_Byte(0xf8); Send_Byte(cmdcode & 0xf0); Send_Byte((cmdcode << 4) & 0xf0); delay_ms(2); CS_L; } /********************************************************* 函数名: Write_LCD_Data() 返回值:无 功 能: 写显示内容到LCD *********************************************************/ void Write_LCD_Data(u8 Dispdata) { CS_H; Check_Busy(); Send_Byte(0xfa); //11111,RW(0),RS(1),0 Send_Byte(Dispdata & 0xf0); Send_Byte((Dispdata << 4) & 0xf0); delay_ms(2); CS_L; } /********************************************************* 函数名: Read_LCD_Data() 返回值:LCD收到的数据 功 能: 读取LCD显示内容 *********************************************************/ u8 Read_Data(void) { Check_Busy(); Send_Byte(0xfe); //11111,RW(1),RS(1),0 LCD->MCU return Receive_Byte(); } /********************************************************* 函数名: LCD_Clear_Txt 返回值:无 功 能: 文本区清除 *********************************************************/ void LCD_Clear_TXT( void ) { u8 i; Write_LCD_Command(0x30); //8BitMCU,基本指令集合 Write_LCD_Command(0x80); //AC归起始位 for(i=0;i<64;i++) { Write_LCD_Data(0x20); } } /********************************************************* 函数名: LCD_Clear_BMP 返回值:无 功 能: 图片区清除 *********************************************************/ void LCD_Clear_BMP( void ) { u8 i,j; Write_LCD_Command(0x34); //8Bit扩充指令集,即使是36H也要写两次 Write_LCD_Command(0x36); //绘图ON,基本指令集里面36H不能开绘图 for(i=0;i<32;i++) //12864实际为256x32 { Write_LCD_Command(0x80|i); //行位置 Write_LCD_Command(0x80); //列位置 for(j=0;j<32;j++) //256/8=32 byte Write_LCD_Data(0); } } /********************************************************* 函数名: Display_LCD_Pos 返回值:无 功 能:设置显示位置 *********************************************************/ void Display_LCD_Pos(u8 x,u8 y) { u8 pos; switch(x) { case 0: x=0x80;break; case 1: x=0x90;break; case 2: x=0x88;break; case 3: x=0x98;break; } pos=x+y; Write_LCD_Command(pos); } /****************************************** 函数名称:Disp_HZ 功 能:控制液晶显示汉字 参 数:addr--显示位置的首地址 pt--指向显示数据的指针 num--显示字符个数 返回值 :无 ********************************************/ void Disp_HZ(u8 X,const u8 * pt,u8 num) { u8 i,addr; if (X==0) {addr=0x80;} else if (X==1) {addr=0x90;} else if (X==2) {addr=0x88;} else if (X==3) {addr=0x98;} Write_LCD_Command(addr); for(i = 0;i < (num*2);i++) Write_LCD_Data(*(pt++)); } /********************************************************* 函数名:Display_LCD_String() 返回值:无 功 能:显示字符串 *********************************************************/ void Display_LCD_String(u8 x,u8 *p,u8 time1) { u8 i,addr,num; num=sizeof p; switch(x) { case 0: addr=0x80;break; case 1: addr=0x90;break; case 2: addr=0x88;break; case 3: addr=0x98;break; } Write_LCD_Command(addr); for(i=0;i<(num*4);i++) { Write_LCD_Data(*(p++)); delay_us(time1); } } /************************************************************* * 函数名称 :PutBMP **************************************************************/ void PutBMP(u8 *puts) { u16 x=0; u8 i,j; Write_LCD_Command(0x34); //8Bit扩充指令集,即使是36H也要写两次 Write_LCD_Command(0x36); //绘图ON,基本指令集里面36H不能开绘图 for(i=0;i<32;i++) //12864实际为256x32 { Write_LCD_Command(0x80|i); //行位置 Write_LCD_Command(0x80); //列位置 for(j=0;j<16;j++) //256/8=32 byte { //列位置每行自动增加 Write_LCD_Data(puts[x]); x++; } } for(i=0;i<32;i++) //12864实际为256x32 { Write_LCD_Command(0x80|i); //行位置 Write_LCD_Command(0x88); //列位置 for(j=0;j<16;j++) //256/8=32 byte { //列位置每行自动增加 Write_LCD_Data(puts[x]); x++; } } } /*------------------------------------------------- LCD显示缓存 --------------------------------------------------*/ u16 LCD12864_Buffer[64][16] = {0}; const u8 m_ch4x5[][6] = { {0x06,0x09,0x09,0x09,0x06,5}, // 0,字符宽度5点阵 {0x02,0x06,0x02,0x02,0x07,5}, // 1 {0x06,0x09,0x02,0x04,0x0F,5}, // 2 {0x06,0x09,0x02,0x09,0x06,5}, // 3 {0x02,0x06,0x0A,0x0F,0x02,5}, // 4 {0x0E,0x08,0x0E,0x01,0x0E,5}, // 5 {0x06,0x08,0x0E,0x09,0x06,5}, // 6 {0x0F,0x01,0x02,0x04,0x04,5}, // 7 {0x06,0x09,0x06,0x09,0x06,5}, // 8 {0x06,0x09,0x07,0x01,0x06,5}, // 9 {0x00,0x00,0x00,0x00,0x01,2}, // . {0x00,0x01,0x00,0x01,0x00,2}, // : {0x00,0x00,0x00,0x00,0x00,5}, // 空格 }; /*------------------------------------------------------------------------------ 功能:画点 参数: x:横坐标 y:纵坐标 color:颜色,0不显示,1显示 ------------------------------------------------------------------------------*/ const u16 DrawDotsTable[] = {0x8000, 0x4000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0200, 0x0100, 0x0080, 0x0040, 0x0020, 0x0010, 0x0008, 0x0004, 0x0002, 0x0001}; void Draw_Dots(u8 x, u8 y, u8 color) { u8 i0, y0; u16 value; // 获得坐标 if ( y >= 32 ) { y0 = y-32; i0 = x/16+8; } else { y0 = y; i0 = x/16; } value = DrawDotsTable[x%16]; if (color == 0) { LCD12864_Buffer[y0][i0] &= ~value; } else { LCD12864_Buffer[y0][i0] |= value; } } /*------------------------------------------------------------------------------ 功能:刷新显示 ------------------------------------------------------------------------------*/ void Draw_Update(void) { u8 x, y; for (y=0; y<64; y++) { Write_LCD_Command(0x80|y); Write_LCD_Command(0x80); for (x=0; x<16; x++) { Write_LCD_Data(LCD12864_Buffer[y][x]>>8); Write_LCD_Data(LCD12864_Buffer[y][x]); } } } /*------------------------------------------------------------------------------ 功能:显示清屏 ------------------------------------------------------------------------------*/ void Draw_Clear(void) { u8 x, y; for (y=0; y<64; y++) { for (x=0; x<16; x++) { LCD12864_Buffer[y][x] = 0; } } } /*------------------------------------------------------------------------------ 功能:显示4*5字符 参数: x:写出横坐标 y:写出纵坐标 value:字符 ------------------------------------------------------------------------------*/ void Draw_Char4x5(u8 x, u8 y, u8 value) { u8 i, j, p, z, a; a = m_ch4x5[value][5]; for (i=0; i<5; i++) { p = 0x10>>(5-a); for (j=0; j { z = m_ch4x5[value][i]; if ( z & p ) { Draw_Dots(j+x, i+y, 1); } p >>= 1; } } } /*-------------------------------------------------------- 功能:显示一行4*5字符 参数: x:写出横坐标 y:写出纵坐标 value:字符串 len:长度 ---------------------------------------------------------*/ void Draw_Char4x5Line(u8 x, u8 y, u8 *value, u8 len) { u8 i; for (i=0; i Draw_Char4x5(x, y, value[i]); x += m_ch4x5[value[i]][5]; } } |
|
相关推荐
6个回答
|
|
void Send_Byte(u8 zdata),这个子程序写得很清楚,是串行方式,只有时钟和数据引脚
最佳答案
|
|
|
|
你是要液晶本身的引脚分布,还是要程序中单片机和液晶的引脚连接,这个程序里用的是串行方式和液晶连接
|
|
|
|
你好 我想问的是程序中单片机和液晶的引脚连接 |
|
|
|
您好 您的意思是说db0-db7这八个管脚就空置就行吗 |
|
|
|
是的,你可以搜搜带字库的12864液晶,看看资料
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1361 浏览 1 评论
1099 浏览 1 评论
MCU友好过渡MPU,米尔基于STM32MP135开发板裸机开发应用笔记
647 浏览 0 评论
自定义系统时钟频率后,用库函数和微带两种方式点亮LED灯,为什么灯的闪烁频率不一致?
1632 浏览 2 评论
1860 浏览 2 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-4-27 03:52 , Processed in 0.458364 second(s), Total 44, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号