微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第78节:多个窗口里移动光标设置参数的液晶屏菜单程序

第78节:多个窗口里移动光标设置参数的液晶屏菜单程序

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

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

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

网站地图

Top