lcdd.h
上传用户:njxy551199
上传日期:2022-04-06
资源大小:1990k
文件大小:14k
源码类别:

RFID编程

开发平台:

C/C++

  1. #include "lcd.h"
  2. #include "asc_zimo.h"
  3. #include "Hz_zimo.h"
  4. #define ILI9325
  5. #define ILI9325_12864
  6. U16 PenColor;
  7. U16 BackColor;
  8. //===================== 微秒延时子程序 ==========================
  9. void DelayUs(U16 us)  
  10. {
  11. while(us--);
  12. }
  13. //==================== 毫秒延时子程序 ===========================
  14. void DelayMs( U16 ms)
  15. {
  16. while(ms--)
  17. DelayUs(149);
  18. }
  19. //=================================
  20. #ifdef ILI9325_12864
  21. void LCD_WrCmd(U16 cmd)    //时序见手册          
  22. {
  23.     LCD_nCS=0;
  24.     LCD_RS=0; 
  25.     LCD_DAT=(cmd>>8); //write high byte
  26.     LCD_nWR=0;
  27.     LCD_nWR=1;
  28.     LCD_DAT=(cmd&0xff);  //write low byte
  29.     LCD_nWR=0;
  30.     LCD_nWR=1;
  31.     LCD_nCS=1;
  32. }
  33. //=================================
  34. void LCD_WrDat(U16 dat)           
  35. {
  36.     LCD_nCS=0;
  37.     LCD_RS=1;
  38.     LCD_DAT=(dat>>8); //write high byte
  39.     LCD_nWR=0;
  40.     LCD_nWR=1;
  41.     LCD_DAT=(dat&0xff);  //write low byte
  42.     LCD_nWR=0;
  43.     LCD_nWR=1;
  44.     LCD_nCS=1;
  45. }
  46. //=================================
  47. /*
  48. void LCD_WrDat8(U8 dat)           
  49. {
  50.     LCD_nCS=0;
  51.     LCD_RS=1;
  52.     LCD_DAT=(dat);
  53.     LCD_nWR=0;
  54.     LCD_nWR=1;
  55.     LCD_nCS=1;
  56. }
  57. U16 LCD_RdDat(void)              
  58. {
  59.     U16 buf;
  60. buf = XBYTE[0x1C00];
  61.    
  62.     LCD_nCS_0;
  63.     LCD_RS_1;
  64.     LCD_nRD_0;
  65.     buf=LCD_Dat_Rd; 
  66.     buf=buf & 0xff00;   //read high byte
  67.     LCD_nRD_1;
  68.     LCD_nRD_0; 
  69.     buf=(LCD_Dat_Rd>>8)|buf;//read low byte
  70.     LCD_nRD_1;
  71.     LCD_nCS_1; 
  72.     return buf;
  73. }
  74. */
  75. #endif  
  76.  
  77. //=================================
  78. void LCD_WrCmdDat(U16 addr,U16 dat)
  79. {
  80.     LCD_WrCmd(addr);
  81.     LCD_WrDat(dat);
  82. }
  83. #ifdef  ILI9325
  84. void LCD_Init(void)
  85. {
  86.     LCD_BLEN_0;
  87.     LCD_nRST_0;      //低电平复位
  88.     DelayMs(10);
  89.     LCD_nRST_1;   
  90.  //************* Start Initial Sequence **********// 
  91.     LCD_WrCmdDat(0x00E3, 0x3008);// Set internal timing 
  92.     LCD_WrCmdDat(0x00E7, 0x0012); // Set internal timing 
  93.     LCD_WrCmdDat(0x00EF, 0x1231);   // Set internal timing 
  94.     LCD_WrCmdDat(0x0001, 0x0100);  // set SS and SM bit 
  95.     LCD_WrCmdDat(0x0002, 0x0700);     // set 1 line inversion 
  96.     LCD_WrCmdDat(0x0003, 0x1030);  // set GRAM write direction and BGR=1.  
  97.     LCD_WrCmdDat(0x0004, 0x0000);    // Resize register 
  98.     LCD_WrCmdDat(0x0008, 0x0207);    // set the back porch and front porch 
  99.     LCD_WrCmdDat(0x0009, 0x0700);    //00,00// set non-display area refresh cycle ISC[3:0] 
  100.     LCD_WrCmdDat(0x000A, 0x0000);    // FMARK function 
  101.     LCD_WrCmdDat(0x000C, 0x0000);    // RGB interface setting 
  102.     LCD_WrCmdDat(0x000D, 0x0000);    // Frame marker Position 
  103.     LCD_WrCmdDat(0x000F, 0x0000);    // RGB interface polarity 
  104.   //*************Power On sequence ****************// 
  105.     LCD_WrCmdDat(0x0010, 0x00f0);    //00,00// SAP, BT[3:0], AP, DSTB, SLP, STB 
  106.     LCD_WrCmdDat(0x0011, 0x0007);     // DC1[2:0], DC0[2:0], VC[2:0] 
  107.     LCD_WrCmdDat(0x0012, 0x0096);    //00,00 // VREG1OUT voltage 
  108.     LCD_WrCmdDat(0x0013, 0x0000);     // VDV[4:0] for VCOM amplitude 
  109.       DelayMs(200);                            // Dis-charge capacitor power voltage 
  110.     LCD_WrCmdDat(0x0010, 0x1490);   // SAP, BT[3:0], AP, DSTB, SLP, STB 
  111.     LCD_WrCmdDat(0x0011, 0x0227);    // Set DC1[2:0], DC0[2:0], VC[2:0] 
  112.       DelayMs(50);                       // Delay 50ms   
  113.     LCD_WrCmdDat(0x0012, 0x001D);    // External reference voltage= Vci; 
  114.       DelayMs(50);                       // Delay 50ms 
  115.     LCD_WrCmdDat(0x0013, 0x1A00);     // Set VDV[4:0] for VCOM amplitude 
  116.     LCD_WrCmdDat(0x0029, 0x0033);   //00,0b // SetVCM[5:0] for VCOMH 
  117.     LCD_WrCmdDat(0x002B, 0x000e);  //00,00 // Set Frame Rate 
  118.       DelayMs(50);                              // Delay 50ms 
  119.     LCD_WrCmdDat(0x0020, 0x0000);   // GRAM horizontal Address 
  120.     LCD_WrCmdDat(0x0021, 0x0000);     // GRAM Vertical Address  
  121.   // ----------- Adjust the Gamma  Curve ----------// 
  122.     LCD_WrCmdDat(0x0030, 0x0007);   
  123.     LCD_WrCmdDat(0x0031, 0x0206);    
  124.     LCD_WrCmdDat(0x0032, 0x0506);   
  125.     LCD_WrCmdDat(0x0035, 0x0704); 
  126.   
  127.     LCD_WrCmdDat(0x0036, 0x1203); 
  128.   
  129.     LCD_WrCmdDat(0x0037, 0x0007); 
  130.   
  131.     LCD_WrCmdDat(0x0038, 0x0000); 
  132.   
  133.     LCD_WrCmdDat(0x0039, 0x0706); 
  134.   
  135.     LCD_WrCmdDat(0x003C, 0x0701); 
  136.    
  137.     LCD_WrCmdDat(0x003D, 0x000F); 
  138.  
  139.   //------------------ Set GRAM area ---------------// 
  140.     LCD_WrCmdDat(0x0050, 0x0000);    // Horizontal GRAM Start Address 
  141.     LCD_WrCmdDat(0x0051, 0x00EF);     // Horizontal GRAM End Address 
  142.     LCD_WrCmdDat(0x0052, 0x0000);    // Vertical GRAM Start Address 
  143.     LCD_WrCmdDat(0x0053, 0x013F);    // Vertical GRAM Start Address 
  144.     LCD_WrCmdDat(0x0060, 0xA700);    // Gate Scan Line 
  145.     LCD_WrCmdDat(0x0061, 0x0001);   // NDL,VLE, REV 
  146.     LCD_WrCmdDat(0x006A, 0x0000);    // set scrolling line 
  147.   //-------------- Panel Control -------------------// */
  148.     LCD_WrCmdDat(0x0090, 0x0010);  
  149.     LCD_WrCmdDat(0x0092, 0x0600);    
  150.     LCD_WrCmdDat(0x0093, 0x0003);  
  151.     LCD_WrCmdDat(0x0095, 0x0110); 
  152.     LCD_WrCmdDat(0x0097, 0x0000);   
  153.     LCD_WrCmdDat(0x0098, 0x0000);   
  154.  
  155.     LCD_WrCmdDat(0x0007, 0x0133);  // 262K color and display ON 
  156.     DelayMs(100);  
  157.     LCD_BLEN_1;
  158.     
  159.     PenColor=YELLOW;
  160.     BackColor=RED;
  161. }
  162. #endif
  163. /*==================================================================
  164. * Function : LCD_SetPoit
  165. * Description : 设置lcd memory point
  166. * Input Para : U8 StartX, U8 StartY
  167. * Output Para : void
  168. * Return Value: void
  169. ==================================================================*/
  170. #ifdef  ILI9325
  171. void LCD_SetGramPoit(U16 x,U16 y)
  172. {
  173.     LCD_WrCmdDat(0x0020,x);
  174.     LCD_WrCmdDat(0x0021,y);      
  175.     LCD_WrCmd(0x0022);               //设置地址后重新启动写RAM命令
  176. }
  177. #endif
  178. /*==================================================================
  179. * Function : lcd_set_write_area
  180. * Description : 设置lcd memory write的区域
  181. * Input Para : U8 StartX, U8 StartY,U8 EndX, U8 EndY
  182. * Output Para : void
  183. * Return Value: void
  184. ==================================================================*/
  185. #ifdef  ILI9325
  186. void LCD_SetWindows(U16 HSA, U16 VSA,U16 HEA, U16 VEA)
  187. {
  188.     LCD_WrCmdDat(0x0050,HSA);
  189.     LCD_WrCmdDat(0x0051,HEA);
  190.     LCD_WrCmdDat(0x0052,VSA);
  191.     LCD_WrCmdDat(0x0053,VEA);
  192.     
  193.     LCD_SetGramPoit(HSA,VSA); //根据扫描方式不同而不同
  194. }
  195. #endif
  196. /**************************************************************************************
  197. * 名    称: DispOneColor
  198. * 功    能: 使任意矩形显示某种颜色
  199. * 参    数: 颜色值:Color
  200. * 返 回 值: 无
  201. **************************************************************************************/
  202. void DispOneColor(U16 X,U16 Y,U16 W,U16 H,U16 Color)
  203. {
  204.    U16 i,j;
  205.    LCD_SetWindows(X, Y, W, H);
  206. for(i = Y; i <= H ; i++)
  207. {
  208. for(j = X; j <= W; j++)
  209. {
  210. LCD_WrDat(Color);
  211. }
  212. }
  213. }
  214. /*
  215. void LCD_Clear(void)
  216. {
  217.     DispOneColor(LCD_Sx, LCD_Sy, LCD_W, LCD_H,BackColor);
  218. }
  219. */
  220. /*==================================================================
  221. * Function : lcd_display_full_screen_color
  222. * Description : 将全屏刷为某一颜色
  223. * Input Para : U16 val
  224. * Output Para : void
  225. * Return Value: void
  226. ==================================================================*/
  227. void Display_full_screen_color(U16 color)
  228. {
  229. U16 X, Y;
  230. LCD_SetWindows(LCD_Sx, LCD_Sy, LCD_Ex, LCD_Ey);
  231. LCD_SetGramPoit(LCD_Sx,LCD_Sy); //根据扫描方式不同而不同
  232. for(X = 0; X < LCD_W; X++)
  233. {
  234. for(Y = 0; Y < LCD_H; Y++)
  235. {
  236. LCD_WrDat(color);
  237. }
  238. }
  239. return;
  240. }
  241. /**************************************************************************************
  242. * 名    称: DrawSingleAscii
  243. * 功    能: 在指定的位置显示单个字符
  244. * 参    数: 坐标:x
  245. *           坐标:y
  246. *           字符的颜色:LineColor 
  247. *           字符背景颜色:FillColor   : 
  248. * 返 回 值: 无
  249. **************************************************************************************/
  250. void DrawSingleAscii(U16 x, U16 y, U8 *pHz, U16 LineColor,U16 FillColor, U8 Mod)
  251. {
  252. U16 j=0,i=0,k=0;
  253. U8 str;
  254. U16 len;
  255. //---------------------------查找该字是否已在字库中 
  256. len=sizeof(AsciiLib)/sizeof(AsciiLib[0]);
  257. for(j=0;j<sizeof(AsciiLib)/sizeof(AsciiLib[0]);j++)   
  258.     if((U8)AsciiLib[j].Index==pHz[0])break;
  259. //--------------------------      
  260.     if(j<len) //j<len,说明该字已经在汉字中出现
  261.     {
  262. LCD_SetWindows(x, y, x+7, y+15);
  263.         for (i=0;i<16;i++)
  264.         {
  265.             str = (U8)AsciiLib[j].Msk[i]; 
  266.             for (k=0;k<8;k++)
  267.             {
  268.                 if ( str & (0x80>>k) )     //通过移位逐位发送数据
  269. {
  270.                     LCD_WrDat((U16)(LineColor&0xffff));
  271. }
  272.                 else 
  273. {
  274. if (Mod == NORMAL)
  275.                          LCD_WrDat((U16)(FillColor&0xffff));
  276. }
  277. else
  278. {
  279.                       LCD_SetGramPoit(x+k+1,y+i); //跳过这一点,即保留该点原有的信息
  280. }
  281. }
  282.              }                            
  283.         }
  284.     }
  285. }
  286. /**************************************************************************************
  287. * 名    称: DrawSingleHz
  288. * 功    能: 在指定的位置显示汉字
  289. * 参    数: 坐标:x
  290. *           坐标:y
  291. *           字符的颜色:LineColor 
  292. *           字符背景颜色:FillColor 
  293. **************************************************************************************/
  294. void DrawSingleHz(U16 x, U16 y, U8 *pHz, U16 LineColor,U16 FillColor, U8 Mod)
  295. {
  296. U16 i=0,j=0,k=0;
  297. U16 str,len;
  298. //---------------------------查找该字是否已在字库中
  299. len=sizeof(HzLib)/sizeof(HzLib[0]);
  300. for(i=0;i<sizeof(HzLib)/sizeof(HzLib[0]);i++)   
  301.     if((U8)HzLib[i].Index[0]==pHz[0]&&(U8)HzLib[i].Index[1]==pHz[1])break;
  302. //--------------------------      
  303.     if(i<len) //j<len,说明该字已经在汉字中出现
  304.     {
  305. LCD_SetWindows(x, y, x+15, y+15);
  306.         for (j=0;j<16;j++)
  307.         {
  308.             str = (U8)HzLib[i].Msk[j*2]<<8|(U8)HzLib[i].Msk[j*2+1]; 
  309.             for (k=0;k<16;k++)
  310.             {
  311.                 if ( str & (0x8000>>k) )     //通过移位逐位发送数据
  312.                 {
  313.                     LCD_WrDat((U16)(LineColor&0xffff));
  314.                 }
  315.                 else
  316.                 {
  317.                     if (Mod == NORMAL)
  318. {
  319.                         LCD_WrDat((U16)(FillColor&0xffff));
  320. }
  321.                     else
  322.                     {
  323.                         LCD_SetGramPoit(x+k+1,y+j); //跳过这一点,即保留该点原有的信息
  324.                     }
  325.                 }               
  326.             } 
  327.         }
  328.     }
  329. }
  330. /**************************************************************************************
  331. * 名    称: DrawString
  332. * 功    能: 在指定的位置显示多个字符
  333. * 参    数: 坐标:x
  334. *           坐标:y
  335. *           字符的颜色:LineColor
  336. *           字符背景颜色:FillColor
  337. *
  338. * 返 回 值: 无
  339. *
  340. **************************************************************************************/
  341. void DrawString(U16 x, U16 y, U8 *pStr, U16 LineColor,U16 FillColor, U8 Mod)
  342. { //把字符串的第一个字符的地址赋给字符指针变量pstr,
  343. //不是*pStr="    "详见濉跺《C程序设计》-谭浩强P252
  344.     while(1)
  345.     {
  346.         if (*pStr == 0)
  347.         {
  348.             return;
  349.         }
  350.         if (*pStr > 0x80)           //大于0x80的为汉字
  351.         {
  352.             DrawSingleHz(x, y, pStr, LineColor, FillColor, Mod);   //调用显示单个汉字函数处理
  353.             x += 16;
  354.             pStr += 2;              
  355.         } //移动指针
  356.         else                        //英文字符
  357.         {
  358.             DrawSingleAscii(x, y, pStr, LineColor, FillColor, Mod);   //调用显示单个字符函数处理
  359.             x += 8;
  360.             pStr += 1;              //移动指针
  361.         }
  362.     }   
  363. }
  364. /**************************************************************************************
  365. * 名    称: DispNum
  366. * 功    能: 显示触摸屏点击处的坐标(用于调试用)
  367. * 参    数: 坐标竖直要显示的位置:x,y
  368. 要显示的坐标值
  369. 存放坐标值的数组名:str
  370. * 返 回 值: 无
  371. **************************************************************************************/
  372. /*
  373. void DispNum(U16 x, U16 y, U16 num,U16 LineColor,U16 FillColor, U8 Mod)
  374. {
  375.     uchar i;
  376.     uchar n[9];
  377.     n[0] =  num/10000000+0x30;
  378.     n[1] = (num%10000000)/1000000+0x30;
  379.     n[2] = (num%10000000)%1000000/100000+0x30;
  380.     n[3] = (num%10000000)%1000000%100000/10000+0x30;
  381.     n[4] = (num%10000000)%1000000%100000%10000/1000+0x30;
  382.     n[5] = (num%10000000)%1000000%100000%10000%1000/100+0x30;
  383.     n[6] = (num%10000000)%1000000%100000%10000%1000%100/10+0x30;
  384. n[7] = (num%10000000)%1000000%100000%10000%1000%100%10+0x30;
  385.     n[8] = '';
  386.    
  387.   for (i=0;i<sizeof(n);i++)
  388.     {  
  389.     if ((n[i]-0x30!=0)||(i==sizeof(n)-1)) //抑制前导0
  390.         {
  391.                 DrawString( x+Size_Asic_W/2*(i), y, n+i, LineColor, FillColor, Mod);
  392.                 return;
  393.         }
  394.     }
  395. }
  396. */
  397. /**************************************************************************************
  398. * 名    称: DispSmallPic
  399. * 功    能: 在指定的位置显示一张65K色的图片
  400. * 参    数: 显示的起始坐标:x,y
  401. 图片的宽度和高度:w,h
  402. 图片数据的数组名:str
  403. * 返 回 值: 无
  404. **************************************************************************************/
  405. /*
  406. void DispSmallPic(U16 x, U16 y, U16 w, U16 h, const U8 *pPoint)
  407. {
  408.     U16 i,j;
  409.     for(j=0;j<h;j++)
  410.     {
  411.         LCD_SetGramPoit(x,y+j);
  412.         for(i=0;i<w;i++)   //图片数据存放的格式是高字节在前,低字节在后
  413.         {
  414.             LCD_WrDat8(*pPoint++);
  415. LCD_WrDat8(*pPoint++);
  416.         }
  417.     }
  418. }
  419. */
  420. /**************************************************************************************
  421. * 名    称: disintlcd
  422. * 返 回 值: 无
  423. ***************************************************************************************/
  424. void disintlcd(void)
  425. {
  426.  
  427.         DispOneColor(0,0,239,69,BLUE) ; //head
  428. DispOneColor(0,70,239,93,RED)  ;   //biaoti
  429. DrawString(38, 74,"射 频 卡 缴 费 系 统",BLACK, RED,  NORMAL);
  430. DispOneColor(0,94,239,319,GREEN) ;
  431.   
  432.      DispOneColor(15,170,64,219,BLUE)  ;
  433. DispOneColor(120,200,230,231,WHITE) ;//baibiao
  434. DispOneColor(120,236,230,267,WHITE) ;
  435. DrawString(80, 208,"卡号",BLACK, GREEN,  NORMAL);
  436. DrawString(80, 244,"余额",BLACK, GREEN,  NORMAL);
  437. DispOneColor(120,297,239,316,BLUE) ;
  438.     DrawString(50, 299,"伟嵌科技",BLACK, GREEN,  NORMAL);
  439. }