单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

12864液晶用STM32驱动成功 附程序

  [复制链接]
跳转到指定楼层
楼主
51黑科技 发表于 2016-2-1 01:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
试了两天终于成功了。

我写的这个程序,如果大家要参考移植的话,12864.c这个文件一个字也不用动,所有需要移植的部分我全部写到12864.h文件来了。方便大家查看。

这两天发现几个问题特别需要注意一下。

一。要开启功能复用IO口时钟,我用的是PB口。STM32F10x系列的MCU复位后,PA13/14/15 & PB3/4默认配置为JTAG功能。有时我们为了充分利用MCU I/O口的资源,会把这些端口设置为普通I/O口。所以要关闭 JTAG


二。写液晶指令或者数据的时候要注意,出错的话也是不能显示的。我用宏定义来写。
#define  LCD_WriteData(x)     {LCD12864_GPIO->BSRR = x<<8 & 0xff00;LCD12864_GPIO->BRR = ((~x)<<8) & 0xff00;}
//高8位的数据


三。PB2是BOOT1,这个脚不要用,不然USB线下载不进去。


四。因为液晶要检测忙状态,所以控制的5个引脚我设置成推挽输出模式,但是8个数据引脚PB8~PB15我设置成开漏输出模式。在开漏模式状态下,对输入寄存器的读访问可获得I/O端口状态。PB15为忙状态检测位。


耐心做。没做出来的话之前的付出都白费了。

  1. #include "lcd.h"
  2. #include "stdlib.h"
  3. #include "font.h"
  4. #include "delay.h"         
  5.                                          
  6. //画笔颜色,背景颜色
  7. u16 POINT_COLOR = 0x0000,BACK_COLOR = 0xFFFF;  
  8. u16 DeviceCode;         

  9. #if LCD_FAST_IO==1 //快速IO
  10. //写寄存器函数
  11. void LCD_WR_REG(u8 data)
  12. {
  13.         LCD_RS_CLR;//写地址  
  14.         LCD_CS_CLR;
  15.         DATAOUT(data);
  16.         LCD_WR_CLR;
  17.         LCD_WR_SET;
  18.         LCD_CS_SET;   
  19. }
  20. #else//正常IO
  21. //写寄存器函数
  22. void LCD_WR_REG(u8 data)
  23. {
  24.         LCD_RS=0;//写地址  
  25.         LCD_CS=0;
  26.         DATAOUT(data);
  27.         LCD_WR=0;
  28.         LCD_WR=1;
  29.         LCD_CS=1;   
  30. }        
  31. #endif       

  32. //写寄存器
  33. void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue)
  34. {       
  35.         LCD_WR_REG(LCD_Reg);  
  36.         LCD_WR_DATA(LCD_RegValue);                             
  37. }          
  38. //读寄存器
  39. u16 LCD_ReadReg(u8 LCD_Reg)
  40. {                                                                                  
  41.         u16 t;
  42.         LCD_WR_REG(LCD_Reg);  //写入要读的寄存器号  
  43.         GPIOB->CRL=0X88888888; //PB0-7  上拉输入
  44.         GPIOB->CRH=0X88888888; //PB8-15 上拉输入
  45.         GPIOB->ODR=0XFFFF;    //全部输出高
  46. #if LCD_FAST_IO==1 //快速IO
  47.         LCD_RS_SET;
  48.         LCD_CS_CLR;
  49.         //读取数据(读寄存器时,并不需要读2次)
  50.         LCD_RD_CLR;
  51.         delay_us(5);//FOR 8989,延时5us                                          
  52.         LCD_RD_SET;
  53.         t=DATAIN;  
  54.         LCD_CS_SET;
  55. #else
  56.         LCD_RS=1;
  57.         LCD_CS=0;
  58.         //读取数据(读寄存器时,并不需要读2次)
  59.         LCD_RD=0;                                          
  60.         LCD_RD=1;
  61.         t=DATAIN;  
  62.         LCD_CS=1;
  63. #endif  
  64.         GPIOB->CRL=0X33333333; //PB0-7  上拉输出
  65.         GPIOB->CRH=0X33333333; //PB8-15 上拉输出
  66.         GPIOB->ODR=0XFFFF;    //全部输出高
  67.         return t;  
  68. }
  69.    
  70. //开始写GRAM
  71. void LCD_WriteRAM_Prepare(void)
  72. {
  73.         LCD_WR_REG(R34);
  74. }
  75.          
  76. //LCD写GRAM
  77. void LCD_WriteRAM(u16 RGB_Code)
  78. {                                                            
  79.         LCD_WR_DATA(RGB_Code);//写十六位GRAM
  80. }
  81. /******************************************************************
  82. 函数名称:u16 LCD_BGR2RGB(u16 c)
  83. 功能说明:从ILI93xx读出的数据为GBR格式,而我们写入的时候为RGB格式。
  84.           通过该函数转换。
  85. 输入函数:c:GBR格式的颜色值
  86. 输出函数:返回值:RGB格式的颜色值
  87. ******************************************************************/
  88. u16 LCD_BGR2RGB(u16 c)
  89. {
  90.         u16  r,g,b,rgb;   
  91.         b=(c>>0)&0x1f;
  92.         g=(c>>5)&0x3f;
  93.         r=(c>>11)&0x1f;         
  94.         rgb=(b<<11)+(g<<5)+(r<<0);                 
  95.         return(rgb);
  96. }                 
  97. /******************************************************************
  98. 函数名称:u16 LCD_ReadPoint(u16 x,u16 y)
  99. 功能说明:读取个某点的颜色值       
  100. 输入函数:x:0~239  y:0~319
  101. 输出函数:返回值:此点的颜色
  102. ******************************************************************/
  103. u16 LCD_ReadPoint(u16 x,u16 y)
  104. {
  105.         u16 t;       
  106.         if(x>=LCD_W||y>=LCD_H)return 0;//超过了范围,直接返回                  
  107.         LCD_SetCursor(x,y);
  108.         LCD_WR_REG(R34);       //选择GRAM地址
  109.         GPIOB->CRL=0X88888888; //PB0-7  上拉输入
  110.         GPIOB->CRH=0X88888888; //PB8-15 上拉输入
  111.         GPIOB->ODR=0XFFFF;     //全部输出高
  112. #if LCD_FAST_IO==1 //快速IO
  113.         LCD_RS_SET;
  114.         LCD_CS_CLR;
  115.         //读取数据(读GRAM时,需要读2次)
  116.         LCD_RD_CLR;                                          
  117.         LCD_RD_SET;
  118.         delay_us(2);//FOR 9320,延时2us                                          
  119.         //dummy READ
  120.         LCD_RD_CLR;                                          
  121.         delay_us(2);//FOR 8989,延时2us                                          
  122.         LCD_RD_SET;
  123.         t=DATAIN;  
  124.         LCD_CS_SET;
  125. #else
  126.         LCD_RS=1;
  127.         LCD_CS=0;
  128.         //读取数据(读GRAM时,需要读2次)
  129.         LCD_RD=0;                                          
  130.         LCD_RD=1;
  131.         //dummy READ
  132.         LCD_RD=0;                                          
  133.         LCD_RD=1;
  134.         t=DATAIN;  
  135.         LCD_CS=1;  
  136. #endif
  137.         GPIOB->CRL=0X33333333; //PB0-7  上拉输出
  138.         GPIOB->CRH=0X33333333; //PB8-15 上拉输出
  139.         GPIOB->ODR=0XFFFF;    //全部输出高  
  140.         if(DeviceCode==0X4531||DeviceCode==0X8989||DeviceCode==0XB505)return t;//这几种IC直接返回颜色值
  141.         else return LCD_BGR2RGB(t);
  142. }
  143. /******************************************************************
  144. 函数名称:void LCD_DisplayOn(void)
  145. 功能说明:LCD开启显示
  146. ******************************************************************/
  147. void LCD_DisplayOn(void)
  148. {                                          
  149.         LCD_WriteReg(R7, 0x0173); //26万色显示开启
  150. }
  151.          
  152. /******************************************************************
  153. 函数名称:void LCD_DisplayOff(void)
  154. 功能说明:LCD关闭显示
  155. ******************************************************************/
  156. void LCD_DisplayOff(void)
  157. {          
  158.         LCD_WriteReg(R7,0x0);//关闭显示
  159. }   
  160. /******************************************************************
  161. 函数名称:__inline void LCD_SetCursor(u16 Xpos, u16 Ypos)
  162. 功能说明:设置光标位置
  163. 输入参数:Xpos:横坐标  Ypos:纵坐标
  164. 输出参数:无
  165. ******************************************************************/
  166. __inline void LCD_SetCursor(u16 Xpos, u16 Ypos)
  167. {
  168. #if USE_HORIZONTAL==1
  169.         if(DeviceCode==0X8989)
  170.         {
  171.                 LCD_WriteReg(0X4E, Ypos);
  172.                 LCD_WriteReg(0X4F, 319-Xpos);
  173.     }else
  174.         {
  175.                 LCD_WriteReg(R32, Ypos);
  176.                 LCD_WriteReg(R33, 319-Xpos);
  177.         }                                                          
  178. #else
  179.         if(DeviceCode==0X8989)
  180.         {
  181.                 LCD_WriteReg(0X4E, Xpos);
  182.                 LCD_WriteReg(0X4F, Ypos);
  183.     }else
  184.         {
  185.                 LCD_WriteReg(R32, Xpos);
  186.                 LCD_WriteReg(R33, Ypos);
  187.         }                                                    
  188. #endif
  189. }  
  190. /******************************************************************
  191. 函数名称:void LCD_DrawPoint(u16 x,u16 y)
  192. 功能说明:画点
  193. 输入参数:x:0~239  y:0~319         POINT_COLOR:此点的颜色
  194. 输出参数:无
  195. ******************************************************************/
  196. void LCD_DrawPoint(u16 x,u16 y)
  197. {
  198.         LCD_SetCursor(x,y);                //设置光标位置
  199.         LCD_WR_REG(R34);                //开始写入GRAM
  200.         LCD_WR_DATA(POINT_COLOR);
  201. }          
  202. /******************************************************************
  203. 函数名称:void LCD_Init(void)
  204. 功能说明:初始化lcd

  205. 该初始化函数可以初始化各种ILI93XX液晶,但是其他函数是基于ILI9320的!
  206. 在其他型号的驱动芯片上没有测试!
  207. ******************************************************************/
  208. void LCD_Init(void)
  209. {  
  210.                                                                                       
  211.         GPIO_InitTypeDef GPIO_InitStructure;

  212.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
  213.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);
  214.        
  215.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_9|GPIO_Pin_8|GPIO_Pin_7|GPIO_Pin_6;//GPIO_Pin_10
  216.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
  217.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  218.         GPIO_Init(GPIOC, &GPIO_InitStructure); //GPIOC       
  219.     //GPIO_WriteBit(GPIOC,GPIO_Pin_10|GPIO_Pin_9|GPIO_Pin_8|GPIO_Pin_7|GPIO_Pin_6,Bit_SET);
  220.         GPIO_SetBits(GPIOC,GPIO_Pin_10|GPIO_Pin_9|GPIO_Pin_8|GPIO_Pin_7|GPIO_Pin_6);


  221.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;        //  
  222.         GPIO_Init(GPIOB, &GPIO_InitStructure); //GPIOB
  223.         //GPIO_WriteBit(GPIOC,GPIO_Pin_All,Bit_SET);
  224.         GPIO_SetBits(GPIOB,GPIO_Pin_All);

  225.         delay_ms(50); // delay 50 ms
  226.         LCD_WriteReg(0x0000,0x0001);
  227.         delay_ms(50); // delay 50 ms
  228.         DeviceCode = LCD_ReadReg(0x0000);   
  229.         printf(" LCD ID:%x\n",DeviceCode); //打印LCD ID  
  230.         if(DeviceCode==0x9325||DeviceCode==0x9328)//ILI9325
  231.         {
  232.                   LCD_WriteReg(0x00EC,0x108F);// internal timeing  
  233.                 LCD_WriteReg(0x00EF,0x1234);// ADD
  234.                 LCD_WriteReg(0x0001,0x0100);     
  235.         LCD_WriteReg(0x0002,0x0700);//电源开启     

  236.                 //LCD_WriteReg(0x00e7,0x0010);      
  237.         //LCD_WriteReg(0x0000,0x0001);//开启内部时钟
  238.         LCD_WriteReg(0x0001,0x0100);     
  239.         LCD_WriteReg(0x0002,0x0700);//电源开启                    
  240.                 //LCD_WriteReg(0x0003,(1<<3)|(1<<4) );         //65K  RGB
  241.                 //DRIVE TABLE(寄存器 03H)
  242.                 //BIT3=AM BIT4:5=ID0:1
  243.                 //AM ID0 ID1   FUNCATION
  244.                 // 0  0   0           R->L D->U
  245.                 // 1  0   0           D->U        R->L
  246.                 // 0  1   0           L->R D->U
  247.                 // 1  1   0    D->U        L->R
  248.                 // 0  0   1           R->L U->D
  249.                 // 1  0   1    U->D        R->L
  250.                 // 0  1   1    L->R U->D 正常就用这个.
  251.                 // 1  1   1           U->D        L->R
  252.         LCD_WriteReg(0x0003,(1<<12)|(3<<4)|(0<<3) );//65K   
  253.         LCD_WriteReg(0x0004,0x0000);                                   
  254.         LCD_WriteReg(0x0008,0x0207);                   
  255.         LCD_WriteReg(0x0009,0x0000);         
  256.         LCD_WriteReg(0x000a,0x0000);//display setting         
  257.         LCD_WriteReg(0x000c,0x0001);//display setting         
  258.         LCD_WriteReg(0x000d,0x0000);//0f3c         
  259.         LCD_WriteReg(0x000f,0x0000);
  260.                 //电源配置
  261.         LCD_WriteReg(0x0010,0x0000);   
  262.         LCD_WriteReg(0x0011,0x0007);
  263.         LCD_WriteReg(0x0012,0x0000);                                                                 
  264.         LCD_WriteReg(0x0013,0x0000);                 
  265.         delay_ms(50);
  266.         LCD_WriteReg(0x0010,0x1590);   
  267.         LCD_WriteReg(0x0011,0x0227);
  268.         delay_ms(50);
  269.         LCD_WriteReg(0x0012,0x009c);                  
  270.         delay_ms(50);
  271.         LCD_WriteReg(0x0013,0x1900);   
  272.         LCD_WriteReg(0x0029,0x0023);
  273.         LCD_WriteReg(0x002b,0x000e);
  274.         delay_ms(50);
  275.         LCD_WriteReg(0x0020,0x0000);                                                            
  276.         LCD_WriteReg(0x0021,0x013f);           
  277.                 delay_ms(50);
  278.                 //伽马校正
  279.         LCD_WriteReg(0x0030,0x0007);
  280.         LCD_WriteReg(0x0031,0x0707);   
  281.         LCD_WriteReg(0x0032,0x0006);
  282.         LCD_WriteReg(0x0035,0x0704);
  283.         LCD_WriteReg(0x0036,0x1f04);
  284.         LCD_WriteReg(0x0037,0x0004);
  285.         LCD_WriteReg(0x0038,0x0000);        
  286.         LCD_WriteReg(0x0039,0x0706);     
  287.         LCD_WriteReg(0x003c,0x0701);
  288.         LCD_WriteReg(0x003d,0x000f);
  289.         delay_ms(50);
  290.         LCD_WriteReg(0x0050,0x0000); //水平GRAM起始位置
  291.         LCD_WriteReg(0x0051,0x00ef); //水平GRAM终止位置                    
  292.         LCD_WriteReg(0x0052,0x0000); //垂直GRAM起始位置                    
  293.         LCD_WriteReg(0x0053,0x013f); //垂直GRAM终止位置  
  294.         
  295.         LCD_WriteReg(0x0060,0xa700);        
  296.         LCD_WriteReg(0x0061,0x0001);
  297.         LCD_WriteReg(0x006a,0x0000);
  298.         LCD_WriteReg(0x0080,0x0000);
  299.         LCD_WriteReg(0x0081,0x0000);
  300.         LCD_WriteReg(0x0082,0x0000);
  301.         LCD_WriteReg(0x0083,0x0000);
  302.         LCD_WriteReg(0x0084,0x0000);
  303.         LCD_WriteReg(0x0085,0x0000);
  304.       
  305.         LCD_WriteReg(0x0090,0x0010);     
  306.         LCD_WriteReg(0x0092,0x0600);  
  307.         //开启显示设置   
  308.         LCD_WriteReg(0x0007,0x0133);  
  309.         }else if(DeviceCode==0x9320||DeviceCode==0x9300)
  310.         {
  311.                 LCD_WriteReg(0x00,0x0000);
  312.                 LCD_WriteReg(0x01,0x0100);        //Driver Output Contral.
  313.                 LCD_WriteReg(0x02,0x0700);        //LCD Driver Waveform Contral.
  314.                 LCD_WriteReg(0x03,0x1030);//Entry Mode Set.
  315.                 //LCD_WriteReg(0x03,0x1018);        //Entry Mode Set.
  316.        
  317.                 LCD_WriteReg(0x04,0x0000);        //Scalling Contral.
  318.                 LCD_WriteReg(0x08,0x0202);        //Display Contral 2.(0x0207)
  319.                 LCD_WriteReg(0x09,0x0000);        //Display Contral 3.(0x0000)
  320.                 LCD_WriteReg(0x0a,0x0000);        //Frame Cycle Contal.(0x0000)
  321.                 LCD_WriteReg(0x0c,(1<<0));        //Extern Display Interface Contral 1.(0x0000)
  322.                 LCD_WriteReg(0x0d,0x0000);        //Frame Maker Position.
  323.                 LCD_WriteReg(0x0f,0x0000);        //Extern Display Interface Contral 2.            
  324.                 delay_ms(50);
  325.                 LCD_WriteReg(0x07,0x0101);        //Display Contral.
  326.                 delay_ms(50);                                                                   
  327.                 LCD_WriteReg(0x10,(1<<12)|(0<<8)|(1<<7)|(1<<6)|(0<<4));        //Power Control 1.(0x16b0)
  328.                 LCD_WriteReg(0x11,0x0007);                                                                //Power Control 2.(0x0001)
  329.                 LCD_WriteReg(0x12,(1<<8)|(1<<4)|(0<<0));                                //Power Control 3.(0x0138)
  330.                 LCD_WriteReg(0x13,0x0b00);                                                                //Power Control 4.
  331.                 LCD_WriteReg(0x29,0x0000);                                                                //Power Control 7.
  332.        
  333.                 LCD_WriteReg(0x2b,(1<<14)|(1<<4));            
  334.                 LCD_WriteReg(0x50,0);        //Set X Star
  335.                 //水平GRAM终止位置Set X End.
  336.                 LCD_WriteReg(0x51,239);        //Set Y Star
  337.                 LCD_WriteReg(0x52,0);        //Set Y End.t.
  338.                 LCD_WriteReg(0x53,319);        //
  339.        
  340.                 LCD_WriteReg(0x60,0x2700);        //Driver Output Control.
  341.                 LCD_WriteReg(0x61,0x0001);        //Driver Output Control.
  342.                 LCD_WriteReg(0x6a,0x0000);        //Vertical Srcoll Control.
  343.        
  344.                 LCD_WriteReg(0x80,0x0000);        //Display Position? Partial Display 1.
  345.                 LCD_WriteReg(0x81,0x0000);        //RAM Address Start? Partial Display 1.
  346.                 LCD_WriteReg(0x82,0x0000);        //RAM Address End-Partial Display 1.
  347.                 LCD_WriteReg(0x83,0x0000);        //Displsy Position? Partial Display 2.
  348.                 LCD_WriteReg(0x84,0x0000);        //RAM Address Start? Partial Display 2.
  349.                 LCD_WriteReg(0x85,0x0000);        //RAM Address End? Partial Display 2.
  350.        
  351.                 LCD_WriteReg(0x90,(0<<7)|(16<<0));        //Frame Cycle Contral.(0x0013)
  352.                 LCD_WriteReg(0x92,0x0000);        //Panel Interface Contral 2.(0x0000)
  353.                 LCD_WriteReg(0x93,0x0001);        //Panel Interface Contral 3.
  354.                 LCD_WriteReg(0x95,0x0110);        //Frame Cycle Contral.(0x0110)
  355.                 LCD_WriteReg(0x97,(0<<8));        //
  356.                 LCD_WriteReg(0x98,0x0000);        //Frame Cycle Contral.          
  357.                 LCD_WriteReg(0x07,0x0173);        //(0x0173)
  358.         }else if(DeviceCode==0x5408)
  359.         {
  360.                 LCD_WriteReg(0x01,0x0100);                                                                  
  361.                 LCD_WriteReg(0x02,0x0700);//LCD Driving Waveform Contral
  362.                 LCD_WriteReg(0x03,0x1030);//Entry Mode设置           
  363.                 //指针从左至右自上而下的自动增模式
  364.                 //Normal Mode(Window Mode disable)
  365.                 //RGB格式
  366.                 //16位数据2次传输的8总线设置
  367.                 LCD_WriteReg(0x04,0x0000); //Scalling Control register     
  368.                 LCD_WriteReg(0x08,0x0207); //Display Control 2
  369.                 LCD_WriteReg(0x09,0x0000); //Display Control 3         
  370.                 LCD_WriteReg(0x0A,0x0000); //Frame Cycle Control         
  371.                 LCD_WriteReg(0x0C,0x0000); //External Display Interface Control 1
  372.                 LCD_WriteReg(0x0D,0x0000); //Frame Maker Position                 
  373.                 LCD_WriteReg(0x0F,0x0000); //External Display Interface Control 2
  374.                 delay_ms(20);
  375.                 //TFT 液晶彩色图像显示方法14
  376.                 LCD_WriteReg(0x10,0x16B0); //0x14B0 //Power Control 1
  377.                 LCD_WriteReg(0x11,0x0001); //0x0007 //Power Control 2
  378.                 LCD_WriteReg(0x17,0x0001); //0x0000 //Power Control 3
  379.                 LCD_WriteReg(0x12,0x0138); //0x013B //Power Control 4
  380.                 LCD_WriteReg(0x13,0x0800); //0x0800 //Power Control 5
  381.                 LCD_WriteReg(0x29,0x0009); //NVM read data 2
  382.                 LCD_WriteReg(0x2a,0x0009); //NVM read data 3
  383.                 LCD_WriteReg(0xa4,0x0000);         
  384.                 LCD_WriteReg(0x50,0x0000); //设置操作窗口的X轴开始列
  385.                 LCD_WriteReg(0x51,0x00EF); //设置操作窗口的X轴结束列
  386.                 LCD_WriteReg(0x52,0x0000); //设置操作窗口的Y轴开始行
  387.                 LCD_WriteReg(0x53,0x013F); //设置操作窗口的Y轴结束行
  388.                 LCD_WriteReg(0x60,0x2700); //Driver Output Control
  389.                 //设置屏幕的点数以及扫描的起始行
  390.                 LCD_WriteReg(0x61,0x0001); //Driver Output Control
  391.                 LCD_WriteReg(0x6A,0x0000); //Vertical Scroll Control
  392.                 LCD_WriteReg(0x80,0x0000); //Display Position – Partial Display 1
  393.                 LCD_WriteReg(0x81,0x0000); //RAM Address Start – Partial Display 1
  394.                 LCD_WriteReg(0x82,0x0000); //RAM address End - Partial Display 1
  395.                 LCD_WriteReg(0x83,0x0000); //Display Position – Partial Display 2
  396.                 LCD_WriteReg(0x84,0x0000); //RAM Address Start – Partial Display 2
  397.                 LCD_WriteReg(0x85,0x0000); //RAM address End – Partail Display2
  398.                 LCD_WriteReg(0x90,0x0013); //Frame Cycle Control
  399.                 LCD_WriteReg(0x92,0x0000);  //Panel Interface Control 2
  400.                 LCD_WriteReg(0x93,0x0003); //Panel Interface control 3
  401.                 LCD_WriteReg(0x95,0x0110);  //Frame Cycle Control
  402.                 LCD_WriteReg(0x07,0x0173);                 
  403.                 delay_ms(50);
  404.         }       
  405.         else if(DeviceCode==0x1505)
  406.         {
  407.                 // second release on 3/5  ,luminance is acceptable,water wave appear during camera preview
  408.         LCD_WriteReg(0x0007,0x0000);
  409.         delay_ms(50);
  410.         LCD_WriteReg(0x0012,0x011C);//0x011A   why need to set several times?
  411.         LCD_WriteReg(0x00A4,0x0001);//NVM         
  412.         LCD_WriteReg(0x0008,0x000F);
  413.         LCD_WriteReg(0x000A,0x0008);
  414.         LCD_WriteReg(0x000D,0x0008);            
  415.                   //伽马校正
  416.         LCD_WriteReg(0x0030,0x0707);
  417.         LCD_WriteReg(0x0031,0x0007); //0x0707
  418.         LCD_WriteReg(0x0032,0x0603);
  419.         LCD_WriteReg(0x0033,0x0700);
  420.         LCD_WriteReg(0x0034,0x0202);
  421.         LCD_WriteReg(0x0035,0x0002); //?0x0606
  422.         LCD_WriteReg(0x0036,0x1F0F);
  423.         LCD_WriteReg(0x0037,0x0707); //0x0f0f  0x0105
  424.         LCD_WriteReg(0x0038,0x0000);
  425.         LCD_WriteReg(0x0039,0x0000);
  426.         LCD_WriteReg(0x003A,0x0707);
  427.         LCD_WriteReg(0x003B,0x0000); //0x0303
  428.         LCD_WriteReg(0x003C,0x0007); //?0x0707
  429.         LCD_WriteReg(0x003D,0x0000); //0x1313//0x1f08
  430.         delay_ms(50);
  431.         LCD_WriteReg(0x0007,0x0001);
  432.         LCD_WriteReg(0x0017,0x0001);//开启电源
  433.         delay_ms(50);
  434.                   //电源配置
  435.         LCD_WriteReg(0x0010,0x17A0);
  436.         LCD_WriteReg(0x0011,0x0217);//reference voltage VC[2:0]   Vciout = 1.00*Vcivl
  437.         LCD_WriteReg(0x0012,0x011E);//0x011c  //Vreg1out = Vcilvl*1.80   is it the same as Vgama1out ?
  438.         LCD_WriteReg(0x0013,0x0F00);//VDV[4:0]-->VCOM Amplitude VcomL = VcomH - Vcom Ampl
  439.         LCD_WriteReg(0x002A,0x0000);  
  440.         LCD_WriteReg(0x0029,0x000A);//0x0001F  Vcomh = VCM1[4:0]*Vreg1out    gate source voltage??
  441.         LCD_WriteReg(0x0012,0x013E);// 0x013C  power supply on
  442.         //Coordinates Control//
  443.         LCD_WriteReg(0x0050,0x0000);//0x0e00
  444.         LCD_WriteReg(0x0051,0x00EF);
  445.         LCD_WriteReg(0x0052,0x0000);
  446.         LCD_WriteReg(0x0053,0x013F);
  447.             //Pannel Image Control//
  448.         LCD_WriteReg(0x0060,0x2700);
  449.         LCD_WriteReg(0x0061,0x0001);
  450.         LCD_WriteReg(0x006A,0x0000);
  451.         LCD_WriteReg(0x0080,0x0000);
  452.             //Partial Image Control//
  453.         LCD_WriteReg(0x0081,0x0000);
  454.         LCD_WriteReg(0x0082,0x0000);
  455.         LCD_WriteReg(0x0083,0x0000);
  456.         LCD_WriteReg(0x0084,0x0000);
  457.         LCD_WriteReg(0x0085,0x0000);
  458.                   //Panel Interface Control//
  459.         LCD_WriteReg(0x0090,0x0013);//0x0010 frenqucy
  460.         LCD_WriteReg(0x0092,0x0300);
  461.         LCD_WriteReg(0x0093,0x0005);
  462.         LCD_WriteReg(0x0095,0x0000);
  463.         LCD_WriteReg(0x0097,0x0000);
  464.         LCD_WriteReg(0x0098,0x0000);
  465.   
  466.         LCD_WriteReg(0x0001,0x0100);
  467.         LCD_WriteReg(0x0002,0x0700);
  468.         LCD_WriteReg(0x0003,0x1030);
  469.         LCD_WriteReg(0x0004,0x0000);
  470.         LCD_WriteReg(0x000C,0x0000);
  471.         LCD_WriteReg(0x000F,0x0000);
  472.         LCD_WriteReg(0x0020,0x0000);
  473.         LCD_WriteReg(0x0021,0x0000);
  474.         LCD_WriteReg(0x0007,0x0021);
  475.         delay_ms(20);
  476.         LCD_WriteReg(0x0007,0x0061);
  477.         delay_ms(20);
  478.         LCD_WriteReg(0x0007,0x0173);
  479.         delay_ms(20);
  480.         }else if(DeviceCode==0xB505)
  481.         {
  482.                 LCD_WriteReg(0x0000,0x0000);
  483.                 LCD_WriteReg(0x0000,0x0000);
  484.                 LCD_WriteReg(0x0000,0x0000);
  485.                 LCD_WriteReg(0x0000,0x0000);
  486.                
  487.                 LCD_WriteReg(0x00a4,0x0001);
  488.                 delay_ms(20);                  
  489.                 LCD_WriteReg(0x0060,0x2700);
  490.                 LCD_WriteReg(0x0008,0x0202);
  491.                
  492.                 LCD_WriteReg(0x0030,0x0214);
  493.                 LCD_WriteReg(0x0031,0x3715);
  494.                 LCD_WriteReg(0x0032,0x0604);
  495.                 LCD_WriteReg(0x0033,0x0e16);
  496.                 LCD_WriteReg(0x0034,0x2211);
  497.                 LCD_WriteReg(0x0035,0x1500);
  498.                 LCD_WriteReg(0x0036,0x8507);
  499.                 LCD_WriteReg(0x0037,0x1407);
  500.                 LCD_WriteReg(0x0038,0x1403);
  501.                 LCD_WriteReg(0x0039,0x0020);
  502.                
  503.                 LCD_WriteReg(0x0090,0x001a);
  504.                 LCD_WriteReg(0x0010,0x0000);
  505.                 LCD_WriteReg(0x0011,0x0007);
  506.                 LCD_WriteReg(0x0012,0x0000);
  507.                 LCD_WriteReg(0x0013,0x0000);
  508.                 delay_ms(20);
  509.                
  510.                 LCD_WriteReg(0x0010,0x0730);
  511.                 LCD_WriteReg(0x0011,0x0137);
  512.                 delay_ms(20);
  513.                
  514.                 LCD_WriteReg(0x0012,0x01b8);
  515.                 delay_ms(20);
  516.                
  517.                 LCD_WriteReg(0x0013,0x0f00);
  518.                 LCD_WriteReg(0x002a,0x0080);
  519.                 LCD_WriteReg(0x0029,0x0048);
  520.                 delay_ms(20);
  521.                
  522.                 LCD_WriteReg(0x0001,0x0100);
  523.                 LCD_WriteReg(0x0002,0x0700);
  524.                 LCD_WriteReg(0x0003,0x1230);
  525.                 LCD_WriteReg(0x0008,0x0202);
  526.                 LCD_WriteReg(0x000a,0x0000);
  527.                 LCD_WriteReg(0x000c,0x0000);
  528.                 LCD_WriteReg(0x000d,0x0000);
  529.                 LCD_WriteReg(0x000e,0x0030);
  530.                 LCD_WriteReg(0x0050,0x0000);
  531.                 LCD_WriteReg(0x0051,0x00ef);
  532.                 LCD_WriteReg(0x0052,0x0000);
  533.                 LCD_WriteReg(0x0053,0x013f);
  534.                 LCD_WriteReg(0x0060,0x2700);
  535.                 LCD_WriteReg(0x0061,0x0001);
  536.                 LCD_WriteReg(0x006a,0x0000);
  537.                 //LCD_WriteReg(0x0080,0x0000);
  538.                 //LCD_WriteReg(0x0081,0x0000);
  539.                 LCD_WriteReg(0x0090,0X0011);
  540.                 LCD_WriteReg(0x0092,0x0600);
  541.                 LCD_WriteReg(0x0093,0x0402);
  542.                 LCD_WriteReg(0x0094,0x0002);
  543.                 delay_ms(20);
  544.                
  545.                 LCD_WriteReg(0x0007,0x0001);
  546.                 delay_ms(20);
  547.                 LCD_WriteReg(0x0007,0x0061);
  548.                 LCD_WriteReg(0x0007,0x0173);
  549.                
  550.                 LCD_WriteReg(0x0020,0x0000);
  551.                 LCD_WriteReg(0x0021,0x0000);          
  552.                 LCD_WriteReg(0x00,0x22);  
  553.         }else if(DeviceCode==0x8989)
  554.         {          
  555.                 LCD_WriteReg(0x0000,0x0001);//打开晶振
  556.             LCD_WriteReg(0x0003,0xA8A4);//0xA8A4
  557.             LCD_WriteReg(0x000C,0x0000);   
  558.             LCD_WriteReg(0x000D,0x080C);   
  559.             LCD_WriteReg(0x000E,0x2B00);   
  560.             LCD_WriteReg(0x001E,0x00B0);   
  561.             LCD_WriteReg(0x0001,0x2B3F);//驱动输出控制320*240  0x6B3F
  562.             LCD_WriteReg(0x0002,0x0600);
  563.             LCD_WriteReg(0x0010,0x0000);  
  564.             LCD_WriteReg(0x0011,0x6070); //定义数据格式  16位色                 横屏 0x6058
  565.             LCD_WriteReg(0x0005,0x0000);  
  566.             LCD_WriteReg(0x0006,0x0000);  
  567.             LCD_WriteReg(0x0016,0xEF1C);  
  568.             LCD_WriteReg(0x0017,0x0003);  
  569.             LCD_WriteReg(0x0007,0x0233); //0x0233      
  570.             LCD_WriteReg(0x000B,0x0000);  
  571.             LCD_WriteReg(0x000F,0x0000); //扫描开始地址
  572.             LCD_WriteReg(0x0041,0x0000);  
  573.             LCD_WriteReg(0x0042,0x0000);  
  574.             LCD_WriteReg(0x0048,0x0000);  
  575.             LCD_WriteReg(0x0049,0x013F);  
  576.             LCD_WriteReg(0x004A,0x0000);  
  577.             LCD_WriteReg(0x004B,0x0000);  
  578.             LCD_WriteReg(0x0044,0xEF00);  
  579.             LCD_WriteReg(0x0045,0x0000);  
  580.             LCD_WriteReg(0x0046,0x013F);  
  581.             LCD_WriteReg(0x0030,0x0707);  
  582.             LCD_WriteReg(0x0031,0x0204);  
  583.             LCD_WriteReg(0x0032,0x0204);  
  584.             LCD_WriteReg(0x0033,0x0502);  
  585.             LCD_WriteReg(0x0034,0x0507);  
  586.             LCD_WriteReg(0x0035,0x0204);  
  587.             LCD_WriteReg(0x0036,0x0204);  
  588.             LCD_WriteReg(0x0037,0x0502);  
  589.             LCD_WriteReg(0x003A,0x0302);  
  590.             LCD_WriteReg(0x003B,0x0302);  
  591.             LCD_WriteReg(0x0023,0x0000);  
  592.             LCD_WriteReg(0x0024,0x0000);  
  593.             LCD_WriteReg(0x0025,0x8000);  
  594.             LCD_WriteReg(0x004f,0);        //行首址0
  595.             LCD_WriteReg(0x004e,0);        //列首址0
  596.         }else if(DeviceCode==0x4531)
  597.         {
  598.                 LCD_WriteReg(0X00,0X0001);   
  599.                 delay_ms(10);   
  600.                 LCD_WriteReg(0X10,0X1628);   
  601.                 LCD_WriteReg(0X12,0X000e);//0x0006   
  602.                 LCD_WriteReg(0X13,0X0A39);   
  603.                 delay_ms(10);   
  604.                 LCD_WriteReg(0X11,0X0040);   
  605.                 LCD_WriteReg(0X15,0X0050);   
  606.                 delay_ms(10);   
  607.                 LCD_WriteReg(0X12,0X001e);//16   
  608.                 delay_ms(10);   
  609.                 LCD_WriteReg(0X10,0X1620);   
  610.                 LCD_WriteReg(0X13,0X2A39);   
  611.                 delay_ms(10);   
  612.                 LCD_WriteReg(0X01,0X0100);   
  613.                 LCD_WriteReg(0X02,0X0300);   
  614.                 LCD_WriteReg(0X03,0X1030);//改变方向的   
  615.                 LCD_WriteReg(0X08,0X0202);   
  616.                 LCD_WriteReg(0X0A,0X0008);   
  617.                 LCD_WriteReg(0X30,0X0000);   
  618.                 LCD_WriteReg(0X31,0X0402);   
  619.                 LCD_WriteReg(0X32,0X0106);   
  620.                 LCD_WriteReg(0X33,0X0503);   
  621.                 LCD_WriteReg(0X34,0X0104);   
  622.                 LCD_WriteReg(0X35,0X0301);   
  623.                 LCD_WriteReg(0X36,0X0707);   
  624.                 LCD_WriteReg(0X37,0X0305);   
  625.                 LCD_WriteReg(0X38,0X0208);   
  626.                 LCD_WriteReg(0X39,0X0F0B);   
  627.                 LCD_WriteReg(0X41,0X0002);   
  628.                 LCD_WriteReg(0X60,0X2700);   
  629.                 LCD_WriteReg(0X61,0X0001);   
  630.                 LCD_WriteReg(0X90,0X0210);   
  631.                 LCD_WriteReg(0X92,0X010A);   
  632.                 LCD_WriteReg(0X93,0X0004);   
  633.                 LCD_WriteReg(0XA0,0X0100);   
  634.                 LCD_WriteReg(0X07,0X0001);   
  635.                 LCD_WriteReg(0X07,0X0021);   
  636.                 LCD_WriteReg(0X07,0X0023);   
  637.                 LCD_WriteReg(0X07,0X0033);   
  638.                 LCD_WriteReg(0X07,0X0133);   
  639.                 LCD_WriteReg(0XA0,0X0000);
  640.         }else if(DeviceCode==0x4535)
  641.         {                             
  642.                 LCD_WriteReg(0X15,0X0030);   
  643.                 LCD_WriteReg(0X9A,0X0010);   
  644.                 LCD_WriteReg(0X11,0X0020);   
  645.                 LCD_WriteReg(0X10,0X3428);   
  646.                 LCD_WriteReg(0X12,0X0002);//16   
  647.                 LCD_WriteReg(0X13,0X1038);   
  648.                 delay_ms(40);   
  649.                 LCD_WriteReg(0X12,0X0012);//16   
  650.                 delay_ms(40);   
  651.                   LCD_WriteReg(0X10,0X3420);   
  652.                 LCD_WriteReg(0X13,0X3038);   
  653.                 delay_ms(70);   
  654.                 LCD_WriteReg(0X30,0X0000);   
  655.                 LCD_WriteReg(0X31,0X0402);   
  656.                 LCD_WriteReg(0X32,0X0307);   
  657.                 LCD_WriteReg(0X33,0X0304);   
  658.                 LCD_WriteReg(0X34,0X0004);   
  659.                 LCD_WriteReg(0X35,0X0401);   
  660.                 LCD_WriteReg(0X36,0X0707);   
  661.                 LCD_WriteReg(0X37,0X0305);   
  662.                 LCD_WriteReg(0X38,0X0610);   
  663.                 LCD_WriteReg(0X39,0X0610);
  664.                   
  665.                 LCD_WriteReg(0X01,0X0100);   
  666.                 LCD_WriteReg(0X02,0X0300);   
  667.                 LCD_WriteReg(0X03,0X1030);//改变方向的   
  668.                 LCD_WriteReg(0X08,0X0808);   
  669.                 LCD_WriteReg(0X0A,0X0008);   
  670.                 LCD_WriteReg(0X60,0X2700);   
  671.                 LCD_WriteReg(0X61,0X0001);   
  672.                 LCD_WriteReg(0X90,0X013E);   
  673.                 LCD_WriteReg(0X92,0X0100);   
  674.                 LCD_WriteReg(0X93,0X0100);   
  675.                 LCD_WriteReg(0XA0,0X3000);   
  676.                 LCD_WriteReg(0XA3,0X0010);   
  677.                 LCD_WriteReg(0X07,0X0001);   
  678.                 LCD_WriteReg(0X07,0X0021);   
  679.                 LCD_WriteReg(0X07,0X0023);   
  680.                 LCD_WriteReg(0X07,0X0033);   
  681.                 LCD_WriteReg(0X07,0X0133);   
  682.         }                                 
  683.         LCD_LED=1;//点亮背光         
  684.         LCD_Clear(WHITE);
  685. }                    
  686.   
  687. //清屏函数
  688. //Color:要清屏的填充色
  689. void LCD_Clear(u16 Color)
  690. {
  691.         u32 index=0;      
  692.         LCD_SetCursor(0x00,0x0000);//设置光标位置
  693.         LCD_WriteRAM_Prepare();     //开始写入GRAM                   
  694.         for(index=0;index<76800;index++)
  695.         {
  696.                 LCD_WR_DATA(Color);   
  697.         }
  698. }   
  699. /******************************************************************
  700. 函数名称:void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)
  701. 功能说明:在指定区域内填充指定颜色
  702. 输入参数:区域大小: (xend-xsta)*(yend-ysta)
  703. 输出参数:无
  704. ******************************************************************/
  705. void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)
  706. {         
  707.         u16 i,j;
  708.         u16 xlen=0;
  709. #if USE_HORIZONTAL==1
  710.         xlen=yend-ysta+1;          
  711.         for(i=xsta;i<=xend;i++)
  712.         {
  713.                  LCD_SetCursor(i,ysta);      //设置光标位置
  714.                 LCD_WriteRAM_Prepare();     //开始写入GRAM          
  715.                 for(j=0;j<xlen;j++)LCD_WR_DATA(color);//设置光标位置           
  716.         }
  717. #else
  718.         xlen=xend-xsta+1;          
  719.         for(i=ysta;i<=yend;i++)
  720.         {
  721.                  LCD_SetCursor(xsta,i);      //设置光标位置
  722.                 LCD_WriteRAM_Prepare();     //开始写入GRAM          
  723.                 for(j=0;j<xlen;j++)LCD_WR_DATA(color);//设置光标位置             
  724.         }
  725. #endif                                                              
  726. }  
  727. /******************************************************************
  728. 函数名称:void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)
  729. 功能说明:画线
  730. 输入参数:x1,y1:起点坐标         x2,y2:终点坐标  
  731. 输出参数:无
  732. ******************************************************************/       
  733. void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)
  734. {
  735.         u16 t;
  736.         int xerr=0,yerr=0,delta_x,delta_y,distance;
  737.         int incx,incy,uRow,uCol;

  738.         delta_x=x2-x1; //计算坐标增量
  739.         delta_y=y2-y1;
  740.         uRow=x1;
  741.         uCol=y1;
  742.         if(delta_x>0)incx=1; //设置单步方向
  743.         else if(delta_x==0)incx=0;//垂直线
  744.         else {incx=-1;delta_x=-delta_x;}
  745.         if(delta_y>0)incy=1;
  746.         else if(delta_y==0)incy=0;//水平线
  747.         else{incy=-1;delta_y=-delta_y;}
  748.         if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
  749.         else distance=delta_y;
  750.         for(t=0;t<=distance+1;t++ )//画线输出
  751.         {  
  752.                 LCD_DrawPoint(uRow,uCol);//画点
  753.                 xerr+=delta_x ;
  754.                 yerr+=delta_y ;
  755.                 if(xerr>distance)
  756.                 {
  757.                         xerr-=distance;
  758.                         uRow+=incx;
  759.                 }
  760.                 if(yerr>distance)
  761.                 {
  762.                         yerr-=distance;
  763.                         uCol+=incy;
  764.                 }
  765.         }  
  766. }   
  767. /******************************************************************
  768. 函数名称:LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2)
  769. 功能说明:在指定位置画矩形
  770. 输入参数:x1,y1,x2,y2 坐标点
  771. 输出参数:无
  772. ******************************************************************/       
  773. void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2)
  774. {
  775.         LCD_DrawLine(x1,y1,x2,y1);
  776.         LCD_DrawLine(x1,y1,x1,y2);
  777.         LCD_DrawLine(x1,y2,x2,y2);
  778.         LCD_DrawLine(x2,y1,x2,y2);
  779. }
  780. /******************************************************************
  781. 函数名称:void Draw_Circle(u16 x0,u16 y0,u8 r)
  782. 功能说明:在指定位置画一个指定大小的圆
  783. 输入参数:(x,y):中心点         r    :半径
  784. 输出参数:无
  785. ******************************************************************/          
  786. void Draw_Circle(u16 x0,u16 y0,u8 r)
  787. {
  788.         int a,b;
  789.         int di;
  790.         a=0;b=r;          
  791.         di=3-(r<<1);             //判断下个点位置的标志
  792.         while(a<=b)
  793.         {
  794.                 LCD_DrawPoint(x0-b,y0-a);             //3           
  795.                 LCD_DrawPoint(x0+b,y0-a);             //0           
  796.                 LCD_DrawPoint(x0-a,y0+b);             //1      
  797.                 LCD_DrawPoint(x0-b,y0-a);             //7           
  798.                 LCD_DrawPoint(x0-a,y0-b);             //2            
  799.                 LCD_DrawPoint(x0+b,y0+a);             //4               
  800.                 LCD_DrawPoint(x0+a,y0-b);             //5
  801.                 LCD_DrawPoint(x0+a,y0+b);             //6
  802.                 LCD_DrawPoint(x0-b,y0+a);            
  803.                 a++;
  804.                 //使用Bresenham算法画圆     
  805.                 if(di<0)di +=4*a+6;          
  806.                 else
  807.                 {
  808.                         di+=10+4*(a-b);   
  809.                         b--;
  810.                 }
  811.                 LCD_DrawPoint(x0+a,y0+b);
  812.         }
  813. }
  814. /******************************************************************
  815. 函数名称:void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)
  816. 功能说明:在指定位置显示一个字符
  817. 输入参数:x:0~234  y:0~308         num:要显示的字符:" "--->"~"  
  818.                   size:字体大小 12/16
  819.                   mode:叠加方式(1)还是非叠加方式(0)
  820. 输出参数:无
  821. ******************************************************************/
  822. void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)
  823. {  
  824. #if USE_HORIZONTAL==1
  825. #define MAX_CHAR_POSX 312
  826. #define MAX_CHAR_POSY 232
  827. #else     
  828. #define MAX_CHAR_POSX 232
  829. #define MAX_CHAR_POSY 312
  830. #endif
  831.     u8 temp;
  832.     u8 pos,t;
  833.         u16 x0=x;
  834.         u16 colortemp=POINT_COLOR;      
  835.     if(x>MAX_CHAR_POSX||y>MAX_CHAR_POSY)return;            
  836.         //设置窗口                  
  837.         num=num-' ';//得到偏移后的值
  838.         if(!mode) //非叠加方式
  839.         {
  840.                 for(pos=0;pos<size;pos++)
  841.                 {
  842.                         if(size==12)temp=asc2_1206[num][pos];//调用1206字体
  843.                         else temp=asc2_1608[num][pos];                 //调用1608字体
  844.                         for(t=0;t<size/2;t++)
  845.                     {                 
  846.                         if(temp&0x01)POINT_COLOR=colortemp;
  847.                                 else POINT_COLOR=BACK_COLOR;
  848.                                 LCD_DrawPoint(x,y);       
  849.                                 temp>>=1;
  850.                                 x++;
  851.                     }
  852.                         x=x0;
  853.                         y++;
  854.                 }       
  855.         }else//叠加方式
  856.         {
  857.                 for(pos=0;pos<size;pos++)
  858.                 {
  859.                         if(size==12)temp=asc2_1206[num][pos];//调用1206字体
  860.                         else temp=asc2_1608[num][pos];                 //调用1608字体
  861.                         for(t=0;t<size/2;t++)
  862.                     {                 
  863.                         if(temp&0x01)LCD_DrawPoint(x+t,y+pos);//画一个点     
  864.                         temp>>=1;
  865.                     }
  866.                 }
  867.         }
  868.         POINT_COLOR=colortemp;                                          
  869. }   
  870. //m^n函数
  871. u32 mypow(u8 m,u8 n)
  872. {
  873.         u32 result=1;         
  874.         while(n--)result*=m;   
  875.         return result;
  876. }                         
  877. /******************************************************************
  878. 函数名称:void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size)
  879. 功能说明:显示2个数字
  880. 输入参数:x,y:起点坐标 len :数字的位数 /size:字体大小  color:颜色
  881.                   num:数值(0~4294967295);         
  882. 输出参数:无
  883. ******************************************************************/
  884. void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size)
  885. {                
  886.         u8 t,temp;
  887.         u8 enshow=0;                                                  
  888.         for(t=0;t<len;t++)
  889.         {
  890.                 temp=(num/mypow(10,len-t-1))%10;
  891.                 if(enshow==0&&t<(len-1))
  892.                 {
  893.                         if(temp==0)
  894.                         {
  895.                                 LCD_ShowChar(x+(size/2)*t,y,' ',size,0);
  896.                                 continue;
  897.                         }else enshow=1;
  898.                           
  899.                 }
  900.                  LCD_ShowChar(x+(size/2)*t,y,temp+'0',size,0);
  901.         }
  902. }
  903. /******************************************************************
  904. 函数名称:void LCD_Show2Num(u16 x,u16 y,u16 num,u8 len,u8 size,u8 mode)
  905. 功能说明:显示2个数字
  906. 输入参数:x,y:起点坐标 size:字体大小   num:数值(0~99);
  907.                   mode:模式0,填充模式;1,叠加模式       
  908. 输出参数:无
  909. ******************************************************************/
  910. void LCD_Show2Num(u16 x,u16 y,u16 num,u8 len,u8 size,u8 mode)
  911. {                
  912.         u8 t,temp;                                                  
  913.         for(t=0;t<len;t++)
  914.         {
  915.                 temp=(num/mypow(10,len-t-1))%10;
  916.                  LCD_ShowChar(x+(size/2)*t,y,temp+'0',size,mode);
  917.         }
  918. }
  919. /******************************************************************
  920. 函数名称:void LCD_ShowString(u16 x,u16 y,const u8 *p)
  921. 功能说明:显示字符串,用16字体
  922. 输入参数:x,y:起点坐标    *p:字符串起始地址
  923. 输出参数:无
  924. ******************************************************************/
  925. void LCD_ShowString(u16 x,u16 y,const u8 *p)
  926. {         
  927.     while(*p!='\0')
  928.     {      
  929.         if(x>MAX_CHAR_POSX){x=0;y+=16;}
  930.         if(y>MAX_CHAR_POSY){y=x=0;LCD_Clear(WHITE);}
  931.         LCD_ShowChar(x,y,*p,16,0);
  932.         x+=8;
  933.         p++;
  934.     }  
  935. }
复制代码



DIS12864.zip

305.42 KB, 下载次数: 561, 下载积分: 黑币 -5

评分

参与人数 5黑币 +24 收起 理由
ioe + 5 很给力!
swap1 + 5 5
芦苇劫 + 8 赞一个!
waerdeng + 5 共享资料的黑币奖励!
1821164 + 1 赞一个!

查看全部评分

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

使用道具 举报

来自 2#
ganbc 发表于 2017-12-15 17:15 | 只看该作者
很好的分享。希望能用得上。
以前我移植普中51开发板的12864mini屏示范程序到STM32,可是没有成功。
有空再按楼主的代码试试看。谢谢分享。
回复

使用道具 举报

板凳
Mingfly 发表于 2016-4-28 20:57 | 只看该作者
胜利不少事,谢谢了
回复

使用道具 举报

地板
Mingfly 发表于 2016-4-28 20:58 | 只看该作者
好东西,收藏了
回复

使用道具 举报

5#
hslcac 发表于 2016-5-6 23:00 | 只看该作者
好东西,收藏了谢谢楼主
回复

使用道具 举报

6#
greatfun2006 发表于 2016-5-14 20:21 | 只看该作者
正在学习STM32,谢谢分享!
回复

使用道具 举报

7#
ifan 发表于 2016-5-21 00:17 来自手机 | 只看该作者
很受用
回复

使用道具 举报

8#
greatfun2006 发表于 2016-5-21 07:38 | 只看该作者
感谢分享,之前用arduino驱动,现在学STM32。
回复

使用道具 举报

9#
rekca 发表于 2016-5-31 10:30 | 只看该作者
收藏下!
回复

使用道具 举报

10#
jianke1807 发表于 2016-6-10 00:10 | 只看该作者
怎么复制代码跟压缩包里的代码不一样呢
回复

使用道具 举报

11#
286458071 发表于 2016-6-10 07:15 来自手机 | 只看该作者
菜鸟路过学习啦!
回复

使用道具 举报

12#
jianke1807 发表于 2016-6-10 11:16 | 只看该作者
Mingfly 发表于 2016-4-28 20:57
胜利不少事,谢谢了

怎么弄的,我的怎么只亮不显示呢
回复

使用道具 举报

13#
absflash 发表于 2016-6-16 09:07 | 只看该作者
看来51想学stm32,困难重重啊
回复

使用道具 举报

14#
linlin7077 发表于 2016-7-26 21:21 | 只看该作者
请问8个数据引脚PB8~PB15设置成开漏输出模式,那么你电路设计上是不是要把PB8~PB15接上拉电阻?正在做这个,急切想知道?还有请问你液晶屏C86引脚接高还是低?
回复

使用道具 举报

15#
sailorx 发表于 2016-8-31 16:06 | 只看该作者
贴出来的代码是ILI93xx的LCD驱动程序,下载的文件中有个12864.c的,就是这个,并且在文件管理器中删除掉lcd.c这个文件,编译即可通过。具体是否可行晚上实验
回复

使用道具 举报

16#
zhangbinxlz 发表于 2016-10-26 19:20 | 只看该作者
正巧   在玩12864
回复

使用道具 举报

17#
lordyoung 发表于 2016-11-1 16:09 | 只看该作者
大神好棒!正好需求,拿走多谢多谢多谢多谢!
回复

使用道具 举报

18#
dykonka 发表于 2016-11-27 20:26 | 只看该作者
谢谢分享,项目中需要,分析的不错
回复

使用道具 举报

19#
momomomo 发表于 2017-1-1 15:50 | 只看该作者
学习一下
回复

使用道具 举报

20#
lancer_zhang 发表于 2017-2-13 20:32 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

21#
刘W杰 发表于 2017-2-19 14:01 | 只看该作者
厉害哟。学习了
回复

使用道具 举报

22#
ljhya 发表于 2017-2-20 21:14 | 只看该作者
谢谢分享
回复

使用道具 举报

23#
KUNCHENG 发表于 2017-2-21 07:09 | 只看该作者
菜鸟路过学习啦!
回复

使用道具 举报

24#
身骑白马驾 发表于 2017-3-2 09:22 | 只看该作者
希望这次能行
回复

使用道具 举报

25#
身骑白马驾 发表于 2017-3-2 09:25 | 只看该作者
希望这次可以,可以的话我会反馈的
回复

使用道具 举报

26#
DA飞翔浮萍 发表于 2017-3-27 17:12 | 只看该作者
感谢楼主,正在学习用STM32驱动192160液晶
回复

使用道具 举报

27#
树叶的人生 发表于 2017-4-22 11:33 | 只看该作者
很好的参考学习程序,谢谢楼主分享
回复

使用道具 举报

28#
xinghai 发表于 2017-5-29 10:09 来自手机 | 只看该作者
不错哦
回复

使用道具 举报

29#
mark1273240242 发表于 2017-5-29 19:41 | 只看该作者
楼主你好,我想请问一下,这段程序一开始include的LCD,FONT,STDLIB,DELAY,都在程序包里面吗?还是要自己再写?(新人没币下载程序包,只能先问问了,不好意思)
回复

使用道具 举报

30#
mark1273240242 发表于 2017-5-29 19:44 | 只看该作者
楼主你好,请问一下,这个程序一开头include的LCD,FONT,STDLIB,DELAY什么的,都在这个压缩包里面吗?还要自己写吗?(新人没币,只能先问问了,不好意思了)
回复

使用道具 举报

31#
makesure 发表于 2017-5-29 20:44 | 只看该作者
楼主你好,请问一下,这个程序一开头include的LCD,FONT,STDLIB,DELAY什么的,都在这个压缩包里面吗?还要自己写吗?(新人没币,只能先问问了,不好意思了)
回复

使用道具 举报

32#
xiaolangwj 发表于 2017-6-27 21:56 | 只看该作者
请教下,我想把这个程序移植到stm32f103ZE芯片上,需要注意什么啊?我直接吧你程序中对应的IO口插上就可以了吗?
回复

使用道具 举报

33#
moveme123 发表于 2017-6-28 09:47 | 只看该作者
谢谢分享  新人学习一下
回复

使用道具 举报

34#
ypoofml 发表于 2017-7-3 20:27 | 只看该作者
谢谢分享  新人学习一下
回复

使用道具 举报

35#
发挥 发表于 2017-7-22 10:27 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

36#
华建坤 发表于 2017-8-5 10:57 | 只看该作者
谢谢楼主~~
回复

使用道具 举报

37#
风飒飒 发表于 2017-8-9 13:59 | 只看该作者
感谢感谢,省了不少事,虽然还没调
回复

使用道具 举报

38#
garonleo 发表于 2017-8-18 10:12 | 只看该作者
顶一个
回复

使用道具 举报

39#
garonleo 发表于 2017-8-18 10:14 | 只看该作者
下载看看
回复

使用道具 举报

40#
ZXJ_ZYF 发表于 2017-8-30 15:38 | 只看该作者
好东西,谢谢
回复

使用道具 举报

41#
2651145773 发表于 2017-9-14 09:24 | 只看该作者

能发给我一份吗?谢谢。2651145773@QQ.COM
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

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