历史上的今天
今天是:2024年11月09日(星期六)
2019年11月09日 | PIC单片机驱动LCD12864显示字符源代码
2019-11-09 来源:51hei
#include __CONFIG(XT&WDTDIS&LVPDIS); //定义配置字,晶振类型:XT,关闭开门狗,禁止低电压编程 #define Rs RB0 //并行数据/控制字选择 H:数据 L:控制字 #define RW RB1 //并行读/写选择 H:读 L:写 #define E RB2 //并行读写使能 H有效,下降沿锁定数据 #define Psb RB3 //串口,并口选择 H:并口 L:串口(开发板上引脚标识为CS1) #define Rst RB5 //复位引脚 L:液晶复位 //--------------------------------------- //名称: 延时函数 //----------------------------------------- void delay(unsigned int t) { unsigned int i,j; for(i=0;i for(j=0;j<10;j++) { asm("NOP"); } } } //--------------------------------------- //名称: 数据总线处理函数 //ND118开发板中,因为布线的原因液晶的8位数据总线和单片机的8位数据线 //是反的,所以需要调换过来,即DB0-RD7、DB1-RD6。。。。DB7-RD0 //----------------------------------------- void write_bus(unsigned char buf) { if(buf&0x01) RD7=1; else RD7=0; if(buf&0x02) RD6=1; else RD6=0; if(buf&0x04) RD5=1; else RD5=0; if(buf&0x08) RD4=1; else RD4=0; if(buf&0x10) RD3=1; else RD3=0; if(buf&0x20) RD2=1; else RD2=0; if(buf&0x40) RD1=1; else RD1=0; if(buf&0x80) RD0=1; else RD0=0; } //--------------------------------------- //名称: 写命令字节到12864函数 //----------------------------------------- void write_com(unsigned char cmdcode) { unsigned int ii=20000; Rs=0; //设置该字节数据为命令代码 RW=1; //设置此次操作为读 E=1; //使能 TRISD=0B11111111; //RD设置为输入 while((PORTD&0X01)&&(ii>0)) //读忙状态,不忙时退出 { ii--; } E=0; //失能 TRISD=0B00000000; //RD设置为输出 Rs=0; //设置该字节数据为控制命令 RW=0; //设置此次操作为读写 write_bus(cmdcode); //通过数据总线处理函数将命令字写进总线中去 E=1; //使能写 asm("NOP"); //略加延迟 asm("NOP"); asm("NOP"); E=0; //失能写 } //--------------------------------------- //名称: 写数据字节到12864函数 //----------------------------------------- void write_data(unsigned char Rsspdata) { unsigned int ii=20000; Rs=0; //设置该字节数据为命令代码 RW=1; //设置此次操作为读 E=1; //使能 TRISD=0B11111111; //RD设置为输入 while((PORTD&0X01)&&(ii>0)) //读忙状态,不忙时退出 { ii--; } E=0; //失能 TRISD=0B00000000; //RD设置为输出 Rs=1; //设置该字节数据为数据 RW=0; //设置此次操作为读写 write_bus(Rsspdata); //通过数据总线处理函数将命令字写进总线中去 E=1; //使能写 asm("NOP"); //略加延迟 asm("NOP"); asm("NOP"); E=0; //失能写 } //--------------------------------------- //名称: 写地址函数 //输入参数:x,y:显示字符串的位置,x:0-7,y:0-3 //----------------------------------------- void write_xy(unsigned char x,unsigned char y) { unsigned char address; switch(y){ case 0:address=0x80+x;break; //第一行的首地址是0x80 case 1:address=0x90+x;break; //第二行的首地址是0x90 case 2:address=0x88+x;break; //第三行的首地址是0x88 case 3:address=0x98+x;break; //第四行的首地址是0x98 default:address=0x80+x; } write_com(address); } //--------------------------------------- //名称: 初始化LCD屏 //----------------------------------------- void init_lcd(void) { Rst=0; //复位液晶 delay(250); //加些延时 delay(250); Rst=1; //复位结束 delay(250); //加些延时 Psb=1; //选择8bit并口 write_com(0x30); //基本指令集 write_com(0x0c); //显示开 write_com(0x06); //光标右移,整体显示不移动 write_com(0x01); //清除显示(清零DDRAM) delay(250); } //--------------------------------------- //名称: 指定地址中英文字符串显示函数 //----------------------------------------- void write_string(unsigned char x,unsigned char y,const unsigned char *s) { write_xy(x,y); //先写入地址参数 while(*s) //只要字符串没写完就继续写 { write_data(*s); //写入一个字符串数据 s++; //指针转到下一个 delay(10); } } //--------------------------------------- //名称: 整行中英文字符串显示函数 //----------------------------------------- void lcd12864_dis_oneline(unsigned char line,const unsigned char *p) { unsigned char c; switch(line%4) { case 0: write_com(0x80); //第一行的首地址为0x80 for(c=0;c<16;c++) //将本行的16个字符全部写进去,汉字占两个字符位 { write_data(*p); p++; if(*p==0) { break; } } break; case 1: write_com(0x90); //第二行的首地址为0x90 for(c=0;c<16;c++) //将本行的16个字符全部写进去,汉字占两个字符位 { write_data(*p); p++; if(*p==0) { break; } } break; case 2: write_com(0x88); //第三行的首地址为0x88 for(c=0;c<16;c++) //将本行的16个字符全部写进去,汉字占两个字符位 { write_data(*p); p++; if(*p==0) { break; } } break; case 3: write_com(0x98); //第四行的首地址为0x98 for(c=0;c<16;c++) //将本行的16个字符全部写进去,汉字占两个字符位 { write_data(*p); p++; if(*p==0) { break; } } break; default : break; } } //--------------------------------------- //名称: 主函数 //----------------------------------------- void main(void) { TRISB=0B11000000; //RB0-5设置为输出 TRISD=0B00000000; //RD设置为输出 init_lcd(); //初始化12864 write_string(0,0,"XXXX电子有限"); write_string(0,1,"公司"); write_string(0,2,"MovingChip.com"); write_string(0,3,"0574-86878555"); while(1) { } }
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 09:33 编辑 2010年北京电子信息大赛定于5月30号举行,赛方提供xilinx的SOPC开发板,定于4月份发放,就此请大家发一些建设性的培训意见和关于xilinx的sopc的一些技术文档,请大家多多支持。 … 查看全部问答> |
|
写的一个很简单的拼音输入程序,想植入windows mobile。我自己水平不行,希望哪个牛人帮忙做一下。愿意帮忙的留下邮箱,我发过来。… 查看全部问答> |
|
我现在已经将spce61板连,probe,电脑接好了,Load的了一个程序,调试状态下,怎么也还是从main可以呢?不连接板的时候调试也是从main开始,我是通过PC指针开始进入程序是一样的,觉的cpu是没有跑起来。要怎样cpu才能跑起来,也是从main开始吗?还 ...… 查看全部问答> |
|
最近一直在搞pxa270的camera的驱动,用的是ov2640,ov9653,现在遇到了一个奇怪的问题,就是YUV预览的时候,我设置dma直接从quick capture的3个数据寄存器到LCD的frame buffer。如果不去读pxa 270 quick capture那边的那3个数据寄存器的话,LCD上只 ...… 查看全部问答> |
|
想把PPC与PC通过串口连接同步(PPC上用的是CF转RS232 的连接卡) 但PPC上找不到repllog.exe ,不知哪里可以下载到? (目前可以通过USB同步传送文件) PPC型号是COMPAQ 3630 … 查看全部问答> |
|
帮我看下代码C2061 C2660错误原因,我搞好长时间不知道为什么错 给分 帮我看下代码C2061 C2660错误原因,我搞好长时间不知道为什么错: //presetdlgs.h // int ReadHospitalInfo (const char *path, Hospital_Info *hospital_info); //presetdlgs.cpp ...... int ReadHospitalInfo (const char *path ...… 查看全部问答> |
|
支持全系列STCortex-M3STM32Fxx的ARM开发工具 ARM公司和英蓓特公司今年5月底推出的RealView MDK中国版,共分3个版本:大众版2500元/套;企业版4600元/套;专业版8000元/套。可以支持全系列ST公司的ARM芯片,包括:最新的Cortex-M3 STM32系列芯片,还有ST公司以往发布的ARM ...… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 13:29 编辑 我使用的DSP2407A的EVM仿真板,AD转换引脚全部悬空,在AD转换过程中使用连续转换模式时,测得引脚上的电压是1.1V左右,而在启动/停止模式下测得AD转换引脚上的电压大约是500mV;在这两种情况下,当接 ...… 查看全部问答> |




