找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4436|回复: 0
打印 上一主题 下一主题
收起左侧

驱动内核为LGM12641BS1R和AMPIRE128X64显示程序

[复制链接]
跳转到指定楼层
楼主



LGM12641BS1R.rar (2.5 KB, 下载次数: 53)

  1. /*
  2. 文件:LCD12864显示
  3. 作者:孙涛
  4. 备注:驱动内核为LGM12641BS1R和AMPIRE128X64
  5. */
  6. #include "LGM12641BS1R.h"
  7. #include <string.h>
  8. #include "DB.h"

  9. //函数:LCD_Delay()
  10. //描述:液晶延时
  11. //参数:T延时系数
  12. static void LCD_Delay(unsigned int T)
  13. {
  14.         while(T--);
  15. }
  16. //函数:LCD_Check_Busy()
  17. //描述:忙检
  18. //参数:无
  19. static void LCD_Check_Busy(void)
  20. {
  21.         unsigned char LCB_Busy_Flag = 0, i = 0;
  22.         for(i=250; i>0; i--)
  23.         {
  24.                 LCD_E_0;  _nop_();_nop_();
  25.                 LCD_DI_0;        _nop_();_nop_();
  26.                 LCD_RW_1; _nop_();_nop_();
  27.                 LCD_DB = 0xFF;
  28.     LCD_E_1;  _nop_();_nop_();
  29.                 LCD_Delay(LCD_Wait_Data);
  30.                 LCB_Busy_Flag  = LCD_DB;
  31.                 LCD_E_0;  _nop_();_nop_();
  32.                 if((LCB_Busy_Flag & 0x80) == 0) break; //BIT7:BUSY BIT5:ON/OFF BIT4:RESET
  33.         }        
  34. }
  35. //函数:LCD_Write()
  36. //描述:写数据,写命令
  37. //参数:Write_CorD  命令数据
  38. //      L           左屏
  39. //      R           右屏
  40. //      Data        写入值
  41. static void LCD_Write(unsigned char Write_CorD, unsigned char L, unsigned char R, unsigned char Data)
  42. {
  43.         LCD_Check_Busy();
  44.         LCD_CS1 = R;LCD_CS2 = L;        
  45.          LCD_E_0;
  46.         if(Write_CorD == 1) LCD_DI_1;
  47.         else LCD_DI_0;
  48.         LCD_RW_0;                     _nop_();_nop_();
  49.         LCD_DB = Data;         _nop_();_nop_();
  50.         LCD_E_1;                     _nop_();_nop_();
  51.         LCD_Delay(LCD_Wait_Data);
  52.         LCD_E_0;                     _nop_();_nop_();
  53. }
  54. //函数:LCD_Setpage()
  55. //描述:设置页
  56. //参数:Page   页
  57. static void LCD_Setpage(unsigned char Page)
  58. {        
  59.         LCD_Write(LCD_Write_CMD,1,1,Page & 0x07 | Set_Page_CMD);                  
  60. }
  61. //函数:LCD_Setcolumn()
  62. //描述:设置行
  63. //参数:Column  列
  64. static void LCD_Setcolumn(unsigned char Column)
  65. {     
  66.         LCD_Write(LCD_Write_CMD,1,1,Column & 0x3F | Set_Column_CMD);         
  67. }
  68. //函数:Set_Coordinate()
  69. //描述:设定显示坐标
  70. //参数:Page    页
  71. //      Colunm  列
  72. static void Set_Coordinate(unsigned char Page, unsigned char Column)
  73. {        
  74.         LCD_Setpage(Page); LCD_Setcolumn(Column);
  75. }
  76. //函数:LCD_Row()
  77. //描述:设置行
  78. //参数:Row  行
  79. void LCD_Setrow(unsigned char Row)
  80. {
  81.         LCD_Write(LCD_Write_CMD, 1, 1, Row & 0x3f | Set_Start_Row_CMD);
  82. }
  83. //函数:Display_ON()
  84. //描述:显示器开关
  85. //参数:OpenorDown  开关命令
  86. void Display_ON(unsigned char OpenorDown)
  87. {        
  88.         LCD_Write(LCD_Write_CMD,1,1,OpenorDown & 0x01 | Set_Display_ON_Down_CMD);
  89. }
  90. //函数:LCD_Reset()
  91. //描述:液晶复位
  92. //参数:无
  93. void LCD_Reset(void)
  94. {
  95.         Reset = 0; LCD_Delay(20); Reset = 1; LCD_Delay(20);
  96. }
  97. //函数:LCD_Clear_Screen()
  98. //描述:液晶清屏
  99. //参数:无
  100. void LCD_Clear_Screen(void)
  101. {
  102.         unsigned char page_temp, column_temp;
  103.         for(page_temp = 0xb8; page_temp < 0xc0; page_temp++)
  104.         {
  105.                 LCD_Write(LCD_Write_CMD,1,1,page_temp);
  106.                 LCD_Write(LCD_Write_CMD,1,1,0x40);
  107.                 for(column_temp = 0; column_temp < 64; column_temp++)
  108.                 {
  109.                         LCD_Write(LCD_Write_Data,1,1,0x00);
  110.                 }
  111.         }
  112. }
  113. //函数:Disp_Half_Char()
  114. //描述:写半个字符
  115. //参数:Page    页
  116. //      Column  列
  117. //      Data    数据
  118. void Display_Half_Char(unsigned char Page, unsigned char Column, unsigned char Date)
  119. {        
  120.         if(Column<64)
  121.         {
  122.                 Set_Coordinate(Page, Column);LCD_Write(LCD_Write_Data,0,1,Date);
  123.         }
  124.         else
  125.         {
  126.                 Set_Coordinate(Page, Column-64);LCD_Write(LCD_Write_Data,1,0,Date);
  127.         }
  128. }
  129. //函数:Display_Char()
  130. //描述:写半个字符
  131. //参数:Invert_Flag   黑白反选标志
  132. //      Page          页
  133. //      Column        列
  134. //      Data          数据
  135. void Display_Char(unsigned char Invert_Flag, unsigned char Page,
  136.                                                             unsigned char Column, unsigned char Num)
  137. {  
  138.         unsigned char num_temp,date_temp;
  139.         for(num_temp = 0; num_temp < 8; num_temp++)
  140.         {        
  141.                 date_temp = LGM_AMP_char[Num][2*num_temp];
  142.                  if(Invert_Flag)
  143.                 date_temp = 255 - date_temp;
  144.                 Display_Half_Char(Page * 2, Column * 8 + num_temp, date_temp);

  145.                 date_temp = LGM_AMP_char[Num][2*num_temp+1];
  146.                 if(Invert_Flag)
  147.                 date_temp = 255 - date_temp;
  148.                 Display_Half_Char(Page * 2 + 1, Column * 8 + num_temp, date_temp);
  149.         }
  150. }
  151. //函数:Display_Ascii_Chinese()
  152. //描述:写半个字符
  153. //参数:Invert_Flag   黑白反选标志
  154. //      Page          页
  155. //      Column        列
  156. //      p             数据
  157. unsigned char Display_Ascii_Chinese(unsigned char Invert_Flag, unsigned char Page,
  158.                                     unsigned char Column, char *p)
  159. {
  160.   unsigned char i = 0, j, z;
  161.   unsigned char HZ_ku_length,CHAR_ku_length,display_length;
  162.   char data_temp_0,data_temp_1;
  163.   unsigned char display_data_buf = 0;
  164.   
  165.   HZ_ku_length = sizeof(HZ_16_16)/sizeof(HZ_16_16[0]);
  166.   CHAR_ku_length = sizeof(CHAR_8_16)/sizeof(CHAR_8_16[0]);
  167.   display_length = strlen(p);
  168.   
  169.   while(i < display_length)
  170.   {
  171.     data_temp_0 = p[i]; data_temp_1 = p[i+1];
  172.     if(data_temp_0 >= 0)
  173.     {
  174.       for(j=0;j<CHAR_ku_length;j++)
  175.       {
  176.         if( (data_temp_0 == CHAR_8_16[j].Index)) break;
  177.       }
  178.       for(z = 0; z < 8; z++)
  179.       {        
  180.         display_data_buf = CHAR_8_16[j].CHAR_Code[2*z];
  181.         if(Invert_Flag) display_data_buf = 255 - display_data_buf;
  182.         Display_Half_Char(Page * 2, Column*8 + z, display_data_buf);

  183.         display_data_buf = CHAR_8_16[j].CHAR_Code[2*z+1];
  184.         if(Invert_Flag) display_data_buf = 255 - display_data_buf;
  185.         Display_Half_Char(Page * 2 + 1, Column*8 + z, display_data_buf);
  186.       }
  187.       Column+=1;
  188.     }
  189.     else
  190.     {  
  191.       for(j=0;j<HZ_ku_length;j++)
  192.       {
  193.         if( (data_temp_0 == HZ_16_16[j].Index[0]) && (data_temp_1 == HZ_16_16[j].Index[1]) ) break;
  194.       }     
  195.       for(z = 0; z < 16; z++)
  196.       {        
  197.         display_data_buf = HZ_16_16[j].HZ_Code[2*z];
  198.         if(Invert_Flag) display_data_buf = 255 - display_data_buf;
  199.         Display_Half_Char(Page*2, Column*8 + z, display_data_buf);
  200.         display_data_buf = HZ_16_16[j].HZ_Code[2*z+1];
  201.         if(Invert_Flag) display_data_buf = 255 - display_data_buf;
  202.         Display_Half_Char(Page*2+1, Column*8 + z, display_data_buf);
  203.       }      
  204.       Column+=2; i++;
  205.     }
  206.     i++;
  207.   }
  208.   return display_length;
  209. }
  210. //函数:Disp_Picture()
  211. //描述:写半个字符
  212. //参数:Invert_Flag   黑白反选标志
  213. //      Page          页
  214. //      Column        列
  215. //      Data          数据
  216. void Disp_Picture(unsigned char Invert_Flag)
  217. {
  218.         unsigned int i;
  219.         unsigned char date_temp;
  220.         for(i=0;i<512;i++)
  221.         {
  222.                 date_temp = tupian[2*i];
  223.                 if(Invert_Flag) date_temp = 255 - date_temp;
  224.                 Display_Half_Char(i%4*2, i/4, date_temp);

  225.                 date_temp = tupian[2*i + 1];
  226.                 if(Invert_Flag) date_temp = 255 - date_temp;
  227.                 Display_Half_Char(i%4*2+1, i/4, date_temp);
  228.         }        
  229. }
  230. //函数:LCD_Init()
  231. //描述:液晶初始化
  232. //参数:无
  233. void LCD_Init(void)
  234. {        
  235.         unsigned char column_temp, page_temp;
  236.         LCD_Reset();
  237.         Display_ON(0);
  238.         for(page_temp=0; page_temp<8; page_temp++)
  239.         {
  240.                 for(column_temp=0; column_temp<128; column_temp++)
  241.                         Display_Half_Char(column_temp, page_temp, 0);
  242.         }
  243.         Display_ON(1);
  244.         LCD_Clear_Screen();
  245. }
复制代码
  1. #include <at89x52.h>
  2. #include <intrins.h>

  3. #ifndef _LGM12641BS1R_H_
  4. #define _LGM12641BS1R_H_

  5. sbit LCD_DI  = P2^0;
  6. sbit LCD_RW  = P2^1;
  7. sbit LCD_E   = P2^2;
  8. sbit LCD_CS1 = P2^3;
  9. sbit LCD_CS2 = P2^4;
  10. sbit Reset   = P3^2;

  11. #define LCD_DI_1    LCD_DI  = 1
  12. #define LCD_DI_0    LCD_DI  = 0
  13. #define LCD_RW_1    LCD_RW  = 1
  14. #define LCD_RW_0    LCD_RW  = 0
  15. #define LCD_E_1     LCD_E   = 1
  16. #define LCD_E_0     LCD_E   = 0
  17. #define LCD_LED_1   LCD_LED = 1
  18. #define LCD_LED_0   LCD_LED = 0
  19. #define LCD_DB            P0

  20. //数据建立延时
  21. #define LCD_Wait_Data                                  6
  22. //命令、数据
  23. #define LCD_Write_CMD                                        0
  24. #define LCD_Write_Data                                      1

  25. void LCD_Setrow(unsigned char Row);
  26. void Display_ON(unsigned char OpenorDown);
  27. void LCD_Reset(void);
  28. void LCD_Clear_Screen(void);
  29. void Display_Half_Char(unsigned char DHC_Page, unsigned char Column, unsigned char Date);
  30. void Disp_Picture(unsigned char Invert_Flag);
  31. void Display_Char(unsigned char Invert_Flag, unsigned char Page,
  32.                                                             unsigned char Column, unsigned char Num);
  33. unsigned char Display_Ascii_Chinese(unsigned char Invert_Flag, unsigned char Page,
  34.                                     unsigned char Column, char *p);
  35. void LCD_Init(void);


  36. // 显示开关
  37. #define Set_Display_ON_Down_CMD    0x3E
  38. // 起始行
  39. #define Set_Start_Row_CMD          0xC0
  40. // 页设置
  41. #define Set_Page_CMD               0xB8
  42. // 列设置
  43. #define Set_Column_CMD             0x40

  44. #endif
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表