微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第79节:通过主菜单移动光标来进入子菜单窗口的液晶屏程序

第79节:通过主菜单移动光标来进入子菜单窗口的液晶屏程序

时间:11-22 来源:互联网 点击:

  1. 3,因为画布的横向只要4个字节。y的范围是0至15,因为画布的纵向只有16行。
  2. * 第3个参数*ucArray是字模的数组。
  3. * 第4个参数ucFbFlag是反白显示标志。0代表正常显示,1代表反白显示。
  4. * 第5,6个参数x_amount,y_amount分别代表字模数组的横向有多少个字节,纵向有几横。
  5. */
  6. 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)
  7. {
  8. unsigned int j=0;
  9. unsigned int i=0;
  10. unsigned char ucTemp;
  11. for(j=0;j
  12. {
  13. for(i=0;i
  14. {
  15. ucTemp=ucArray[j*x_amount+i];
  16. if(ucFbFlag==0)
  17. {
  18. ucCanvasBuffer[(y+j)*4+x+i]=ucTemp; //这里的4代表画布每一行只有4个字节
  19. }
  20. else
  21. {
  22. ucCanvasBuffer[(y+j)*4+x+i]=~ucTemp; //这里的4代表画布每一行只有4个字节
  23. }
  24. }
  25. }
  26. }
  27. /* 注释六:
  28. * 显示任意点阵函数.
  29. * 注意,本函数在前几节的基础上多增加了第7个参数uiOffSetAddr,它是偏移地址。
  30. * 对于这个函数,读者尤其要搞懂x_amount和y_amount对应的显示关系。
  31. * 第1,2个参数x,y是坐标体系。x的范围是0至15,y的范围是0至31.
  32. * 第3个参数*ucArray是字模的数组。
  33. * 第4个参数ucFbFlag是反白显示标志。0代表正常显示,1代表反白显示。
  34. * 第5,6个参数x_amount,y_amount分别代表字模数组的横向有多少个字节,纵向有几横。
  35. * 第7个参数uiOffSetAddr是偏移地址,代表字模数组的从第几个数据开始显示。
  36. */
  37. 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)
  38. {
  39. unsigned int j=0;
  40. unsigned int i=0;
  41. unsigned char ucTemp;
  42. //注意,要把以下两行指令屏蔽,否则屏幕在更新显示时会整屏闪动
  43. //WriteCommand(0x34);//关显示缓冲指令
  44. //WriteCommand(0x34);//关显示缓冲指令故意写2次,怕1次关不了 这个是因为我参考到某厂家的驱动程序也是这样写的
  45. for(j=0;j
  46. {
  47. WriteCommand(y+j+0x80); //垂直地址
  48. WriteCommand(x+0x80); //水平地址
  49. for(i=0;i
  50. {
  51. ucTemp=ucArray[j*x_amount+i+uiOffSetAddr]; //uiOffSetAddr是字模数组的偏移地址
  52. if(ucFbFlag==1)//反白显示
  53. {
  54. ucTemp=~ucTemp;
  55. }
  56. LCDWriteData(ucTemp);
  57. // delay_short(30000);//把上一节这个延时函数去掉,加快刷屏速度
  58. }
  59. }
  60. WriteCommand(0x36); //开显示缓冲指令
  61. }
  62. void SendByteToLcd(unsigned char ucData)//发送一个字节数据到液晶模块
  63. {
  64. unsigned char i;
  65. for ( i = 0; i < 8; i++ )
  66. {
  67. if ( (ucData < i) & 0x80 )
  68. {
  69. LCDSID_dr = 1;
  70. }
  71. else
  72. {
  73. LCDSID_dr = 0;
  74. }
  75. LCDCLK_dr = 0;
  76. LCDCLK_dr = 1;
  77. }
  78. }
  79. void SPIWrite(unsigned char ucWData, unsigned char ucWRS) //模拟SPI发送一个字节的命令或者数据给液晶模块的底层驱动
  80. {
  81. SendByteToLcd( 0xf8 + (ucWRS < 1) );
  82. SendByteToLcd( ucWData & 0xf0 );
  83. SendByteToLcd( (ucWData < 4) & 0xf0);
  84. }
  85. void WriteCommand(unsigned char ucCommand) //发送一个字节的命令给液晶模块
  86. {
  87. LCDCS_dr = 0;
  88. LCDCS_dr = 1;
  89. SPIWrite(ucCommand, 0);
  90. delay_short(90);
  91. }
  92. void LCDWriteData(unsigned char ucData)//发送一个字节的数据给液晶模块
  93. {
  94. LCDCS_dr = 0;
  95. LCDCS_dr = 1;
  96. SPIWrite(ucData, 1);
  97. }
  98. void LCDInit(void) //初始化函数内部包括液晶模块的复位
  99. {
  100. LCDRST_dr = 1;//复位
  101. LCDRST_dr = 0;
  102. LCDRST_dr = 1;
  103. }
  104. void delay_short(unsigned int uiDelayShort) //延时函数
  105. {
  106. unsigned int i;
  107. for(i=0;i
  108. {
  109. ;
  110. }
  111. }
  112. void delay_long(unsigned int uiDelayLong)
  113. {
  114. unsigned int i;
  115. unsigned int j;
  116. for(i=0;i
  117. {
  118. for(j=0;j<500;j++)//内嵌循环的空指令数量
  119. {
  120. ; //一个分号相当于执行一条空语句
  121. }
  122. }
  123. }


总结陈词:
我前面几节液晶屏程序的字模都是通过外围工具软件生成的,其实这款12864液晶模块本身就是自带字库,编程的时候只要在源代码里直接写入所需要的汉字或者字符,就可以自动调用相对应的字库了。但是细心的网友一定会问,为什么在源代码上直接写入某个汉字就可以调用到这个汉字的字库?在这个过程中,C51编译器到底还干了哪些鲜为人知的好事?欲知详情,请听下回分解-----液晶屏自带字库跟汉字机内码的关系。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top