第79节:通过主菜单移动光标来进入子菜单窗口的液晶屏程序
时间:11-22
来源:互联网
点击:
- 3,因为画布的横向只要4个字节。y的范围是0至15,因为画布的纵向只有16行。
- * 第3个参数*ucArray是字模的数组。
- * 第4个参数ucFbFlag是反白显示标志。0代表正常显示,1代表反白显示。
- * 第5,6个参数x_amount,y_amount分别代表字模数组的横向有多少个字节,纵向有几横。
- */
- void insert_buffer_to_canvas(unsigned int x,unsigned int y,const unsigned char*ucArray,unsigned char ucFbFlag,unsigned int x_amount,unsigned int y_amount)
- {
- unsigned int j=0;
- unsigned int i=0;
- unsigned char ucTemp;
- for(j=0;j
- {
- for(i=0;i
- {
- ucTemp=ucArray[j*x_amount+i];
- if(ucFbFlag==0)
- {
- ucCanvasBuffer[(y+j)*4+x+i]=ucTemp; //这里的4代表画布每一行只有4个字节
- }
- else
- {
- ucCanvasBuffer[(y+j)*4+x+i]=~ucTemp; //这里的4代表画布每一行只有4个字节
- }
- }
- }
- }
- /* 注释六:
- * 显示任意点阵函数.
- * 注意,本函数在前几节的基础上多增加了第7个参数uiOffSetAddr,它是偏移地址。
- * 对于这个函数,读者尤其要搞懂x_amount和y_amount对应的显示关系。
- * 第1,2个参数x,y是坐标体系。x的范围是0至15,y的范围是0至31.
- * 第3个参数*ucArray是字模的数组。
- * 第4个参数ucFbFlag是反白显示标志。0代表正常显示,1代表反白显示。
- * 第5,6个参数x_amount,y_amount分别代表字模数组的横向有多少个字节,纵向有几横。
- * 第7个参数uiOffSetAddr是偏移地址,代表字模数组的从第几个数据开始显示。
- */
- void display_lattice(unsigned int x,unsigned int y,const unsigned char*ucArray,unsigned char ucFbFlag,unsigned int x_amount,unsigned int y_amount,unsigned int uiOffSetAddr)
- {
- unsigned int j=0;
- unsigned int i=0;
- unsigned char ucTemp;
- //注意,要把以下两行指令屏蔽,否则屏幕在更新显示时会整屏闪动
- //WriteCommand(0x34);//关显示缓冲指令
- //WriteCommand(0x34);//关显示缓冲指令故意写2次,怕1次关不了 这个是因为我参考到某厂家的驱动程序也是这样写的
- for(j=0;j
- {
- WriteCommand(y+j+0x80); //垂直地址
- WriteCommand(x+0x80); //水平地址
- for(i=0;i
- {
- ucTemp=ucArray[j*x_amount+i+uiOffSetAddr]; //uiOffSetAddr是字模数组的偏移地址
- if(ucFbFlag==1)//反白显示
- {
- ucTemp=~ucTemp;
- }
- LCDWriteData(ucTemp);
- // delay_short(30000);//把上一节这个延时函数去掉,加快刷屏速度
- }
- }
- WriteCommand(0x36); //开显示缓冲指令
- }
- void SendByteToLcd(unsigned char ucData)//发送一个字节数据到液晶模块
- {
- unsigned char i;
- for ( i = 0; i < 8; i++ )
- {
- if ( (ucData < i) & 0x80 )
- {
- LCDSID_dr = 1;
- }
- else
- {
- LCDSID_dr = 0;
- }
- LCDCLK_dr = 0;
- LCDCLK_dr = 1;
- }
- }
- void SPIWrite(unsigned char ucWData, unsigned char ucWRS) //模拟SPI发送一个字节的命令或者数据给液晶模块的底层驱动
- {
- SendByteToLcd( 0xf8 + (ucWRS < 1) );
- SendByteToLcd( ucWData & 0xf0 );
- SendByteToLcd( (ucWData < 4) & 0xf0);
- }
- void WriteCommand(unsigned char ucCommand) //发送一个字节的命令给液晶模块
- {
- LCDCS_dr = 0;
- LCDCS_dr = 1;
- SPIWrite(ucCommand, 0);
- delay_short(90);
- }
- void LCDWriteData(unsigned char ucData)//发送一个字节的数据给液晶模块
- {
- LCDCS_dr = 0;
- LCDCS_dr = 1;
- SPIWrite(ucData, 1);
- }
- void LCDInit(void) //初始化函数内部包括液晶模块的复位
- {
- LCDRST_dr = 1;//复位
- LCDRST_dr = 0;
- LCDRST_dr = 1;
- }
- void delay_short(unsigned int uiDelayShort) //延时函数
- {
- unsigned int i;
- for(i=0;i
- {
- ;
- }
- }
- void delay_long(unsigned int uiDelayLong)
- {
- unsigned int i;
- unsigned int j;
- for(i=0;i
- {
- for(j=0;j<500;j++)//内嵌循环的空指令数量
- {
- ; //一个分号相当于执行一条空语句
- }
- }
- }
总结陈词:
我前面几节液晶屏程序的字模都是通过外围工具软件生成的,其实这款12864液晶模块本身就是自带字库,编程的时候只要在源代码里直接写入所需要的汉字或者字符,就可以自动调用相对应的字库了。但是细心的网友一定会问,为什么在源代码上直接写入某个汉字就可以调用到这个汉字的字库?在这个过程中,C51编译器到底还干了哪些鲜为人知的好事?欲知详情,请听下回分解-----液晶屏自带字库跟汉字机内码的关系。
主菜单移动光标子菜单窗口液晶屏程 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)