stm32f103rct6芯片控制lcd12864i控制器为HD61202,主代码贴下面

2019-07-14 21:22发布

STM32f103rct6芯片控制lcd12864i控制器为HD61202,主代码贴下面,目前程序调试无输出,测量lcd管脚上有相应输出,lcd屏无显示,求解!

  1. <P>void main()
  2. {      
  3.       
  4.        /* 设置系统时钟 */
  5.           RCC_Configuration();
  6.         
  7.         /* 设置NVIC */
  8.         NVIC_Configuration();
  9.         
  10.           /* 设置GPIO端口 */
  11.           GPIO_Configuration();
  12.         
  13.         /*设置TIM3*/
  14.         TIM3_Configuration();
  15.         
  16.           /* 设置USART1 */
  17.           USART_Configuration();
  18.         
  19.         /* 设置USART1 中断*/
  20.         USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
  21.         
  22.         /*SPI 设置*/
  23.         //SPI_Configuration();
  24.         //SPI_SSOutputCmd(SPI1,DISABLE);
  25.         /*PC.8输出高电平Led on!*/        
  26.         GPIO_SetBits(GPIOC , GPIO_Pin_8);
  27.         
  28.         Lcd_Init();
  29.         Lcd_Printf(1,2,"ABCD");//输出ABCD
  30.         Lcd_Printf(2,3,"液晶显示程序");//输出汉字“液晶显示程序”
  31.         while(1);</P>
  32. <P>}
  33. void LcdIO(unsigned char data)
  34. {
  35.     int i;
  36.    for(i=0;i<8;i++)
  37.    {
  38.       if(data>>i&0x01==0x01)
  39.         switch(i)
  40.         {
  41.         case 0: GPIO_SetBits(GPIOC,GPIO_Pin_0);
  42.                break;
  43.         case 1:GPIO_SetBits(GPIOC,GPIO_Pin_3);
  44.                break;
  45.         case 2:GPIO_SetBits(GPIOC,GPIO_Pin_6);
  46.                break;               
  47.         case 3:GPIO_SetBits(GPIOC,GPIO_Pin_7);
  48.                break;
  49.         case 4:GPIO_SetBits(GPIOC,GPIO_Pin_9);
  50.                break;
  51.         case 5:GPIO_SetBits(GPIOC,GPIO_Pin_10);
  52.                break;
  53.         case 6:GPIO_SetBits(GPIOC,GPIO_Pin_11);
  54.                break;
  55.         case 7:GPIO_SetBits(GPIOC,GPIO_Pin_12);
  56.                break;               
  57.         }
  58.    else
  59.      switch(i)
  60.      {
  61.         case 0:GPIO_ResetBits(GPIOC,GPIO_Pin_0);
  62.                break;
  63.         case 1:GPIO_ResetBits(GPIOC,GPIO_Pin_3);
  64.                break;
  65.         case 2:GPIO_ResetBits(GPIOC,GPIO_Pin_6);
  66.                break;
  67.         case 3:GPIO_ResetBits(GPIOC,GPIO_Pin_7);
  68.                break;
  69.         case 4:GPIO_ResetBits(GPIOC,GPIO_Pin_9);
  70.                break;
  71.         case 5:GPIO_ResetBits(GPIOC,GPIO_Pin_10);
  72.                break;
  73.         case 6:GPIO_ResetBits(GPIOC,GPIO_Pin_11);
  74.                break;
  75.         case 7:GPIO_ResetBits(GPIOC,GPIO_Pin_12);
  76.                break;
  77.      }
  78.    }
  79. }</P>
  80. <P>
  81. void Lcd_Init(void)//对液晶屏进行初始化
  82. {
  83.         LcdRES_L;//LcdRST = 0;//复位
  84.         DelayNms(10);
  85.         LcdRES_H;//LcdRST = 1;
  86.         DelayNms(10);
  87.         Lcd_SetL(0x3E);//关显示命令
  88.         Lcd_SetR(0x3E);
  89.         Lcd_SetL(0x3F);//开显示命令
  90.         Lcd_SetR(0x3F);
  91.                Lcd_SetL(0xC0);//显示起始行设置
  92.         Lcd_SetR(0xC0);
  93.                Lcd_SetL(0xB8);//显示起始行设置
  94.         Lcd_SetR(0xB8);
  95.                Lcd_SetL(0x40);//显示起始行设置
  96.         Lcd_SetR(0x40);
  97. }</P>
  98. <P>
  99. void Lcd_Clear(void)
  100. {
  101.         u8 i,j,k;
  102.         
  103.         for(i=0;i<8;i++)
  104.         {
  105.                 Lcd_SetL(i+0xB8);//设置页地址
  106.                 Lcd_SetR(i+0xB8);
  107.                 for(j=0;j<64;j++)//设置列地址
  108.                 {
  109.                         Lcd_SetL(j+0x40);
  110.                         Lcd_SetR(j+0x40);
  111.                         for(k=0;k<64;k++)
  112.                         {
  113.                                 Lcd_DataL(0x00);//清屏
  114.                                 Lcd_DataR(0x00);
  115.                         }
  116.                 }
  117.         }
  118. }</P>
  119. <P>
  120. u8 Lcd_BusyL(void)//检测左半屏是否忙
  121. {
  122.         u8 dat=0;
  123.         //LcdEN_L;//LcdE = 0;
  124.         //delay_(400);
  125.         LcdCSL_H;//LcdCSL = 1;
  126.         LcdCSR_L;//LcdCSR = 0;
  127.         LcdDI_L;//LcdDI = 0;
  128.         LcdRW_H;//LcdRW = 1;
  129.         // delay_(400);
  130.         LcdEN_H;//LcdE = 1;
  131.         GPIO_Configuration1();
  132.         dat=GPIO_ReadInputDataBit( GPIOC, GPIO_Pin_12);//dat = LcdIO;
  133.         LcdEN_L;//LcdE = 0;
  134.         GPIO_Configuration2();
  135.         if((dat&0x1) == 0x01)
  136.         return Yes;
  137.         else return No;
  138.         
  139. }
  140. u8 Lcd_BusyR(void)//检测右半屏是否忙
  141. {
  142.         u8 dat=0;
  143.         //LcdEN_L;//LcdE = 0;
  144.           //delay_(400);        
  145.         LcdCSL_L;//LcdCSL = 0;
  146.         LcdCSR_H;//LcdCSR = 1;
  147.         LcdDI_L;//LcdDI = 0;
  148.         LcdRW_H;//LcdRW = 1;
  149.         // delay_(400);
  150.         LcdEN_H;//LcdE = 1;
  151.         GPIO_Configuration1();
  152.         dat=GPIO_ReadInputDataBit( GPIOC, GPIO_Pin_12);//dat = LcdIO;
  153.         LcdEN_L;//LcdE = 0;
  154.         GPIO_Configuration2();
  155.         if((dat&0x1) == 0x01)
  156.         return Yes;
  157.         else return No;
  158.         
  159. }</P>
  160. <P>
  161. void Lcd_SetL(u8 dat)//对左半屏进行设置
  162. {
  163.         while(Lcd_BusyL() == Yes);
  164.         //LcdEN_L;//LcdE = 0;        
  165.         // delay_(400);
  166.         LcdCSL_H;//LcdCSL = 1;
  167.         LcdCSR_L;//LcdCSR = 0;
  168.         LcdRW_L;//LcdRW = 0;
  169.         LcdDI_L;//LcdDI = 0;
  170.          //delay_(400);
  171.         LcdIO(dat);//LcdIO = dat;
  172.         LcdEN_H;//LcdE = 1;
  173.         DelayNms(3);
  174.         LcdEN_L;//LcdE = 0;
  175.         LcdCSL_L;
  176. }
  177. void Lcd_DataL(u8 dat)//对左半屏写入点阵数据
  178. {
  179.         while(Lcd_BusyL() == Yes);
  180.         //LcdEN_L;//LcdE = 0;
  181.         // delay_(400);        
  182.         LcdCSL_H;//LcdCSL = 1;
  183.         LcdCSR_L;//LcdCSR = 0;
  184.         LcdRW_L;//LcdRW = 0;
  185.         LcdDI_H;//LcdDI = 1;
  186.          //delay_(400);
  187.         LcdIO(dat);//LcdIO = dat;
  188.         LcdEN_H;//LcdE = 1;
  189.         DelayNms(3);
  190.         LcdEN_L;//LcdE = 0;
  191.         LcdCSL_L;
  192. }</P>
  193. <P>
  194. void Lcd_SetR(u8 dat)//对右半屏进行设置
  195. {
  196.         while(Lcd_BusyR() == Yes);
  197.         //LcdEN_L;//LcdE = 0;        
  198.         // delay_(400);
  199.         LcdCSL_L;//LcdCSL = 0;
  200.         LcdCSR_H;//LcdCSR = 1;
  201.         LcdRW_L;//LcdRW = 0;
  202.         LcdDI_L;//LcdDI = 0;
  203.         // delay_(400);
  204.         LcdIO(dat);//LcdIO = dat;
  205.         LcdEN_H;//LcdE = 1;
  206.         DelayNms(3);
  207.         LcdEN_L;//LcdE = 0;
  208.         LcdCSR_L;
  209. }
  210. void Lcd_DataR(u8 dat)//对右半屏写入点阵数据
  211. {
  212.         while(Lcd_BusyR() == Yes);
  213.         //LcdEN_L;//LcdE = 0;
  214.         // delay_(400);
  215.         LcdCSL_L;//LcdCSL = 0;
  216.         LcdCSR_H;//LcdCSR = 1;
  217.         LcdRW_L;//LcdRW = 0;
  218.         LcdDI_H;//LcdDI = 1;
  219.          //delay_(400);
  220.         LcdIO(dat);//LcdIO = dat;
  221.         LcdEN_H;//LcdE = 1;
  222.         DelayNms(3);
  223.         LcdEN_L;//LcdE = 0;
  224.         LcdCSR_L;
  225. }</P>
  226. <P> </P>
  227. <P>
  228. /*延时时间ms,晶振为8MHz*/
  229. void DelayNms(u32 T)
  230. {</P>
  231. <P>    u8 I;
  232.     while(--T)
  233.     for(I=0;I<100;I++);
  234. }</P>
  235. <P>/*
  236. void DELAY(UINT T)
  237. {
  238.     UINT I;
  239.     while(--T)
  240.     for(I=0;I<100;I++);
  241. }
  242. */</P>
  243. <P>
  244. void Lcd_Printf(u8 row,u8 column,u8 *pString)//在液晶屏对应的行列位置输出字符串,把液晶屏分成4行16列
  245. {
  246.         u8 i=0;
  247.         if((row>4)||(column>16)) return;//如果行列值超出范围,直接返回。                          
  248.         while(pString[i] != 0)
  249.         {
  250.                 if(pString[i]<=0x80)//如果是ASC字符
  251.                 {
  252.                         Lcd_PutAsc(row,column,pString+i);//输出ASC码
  253.                         if(++column > 16)        //调整行列值,如果到达液晶最后点,则返回  
  254.                         {
  255.                                 column = 1;
  256.                                 if(++row > 4)        return;
  257.                         }
  258.                         i++;
  259.                 }
  260.                 else        //如果是汉字
  261.                 {
  262.                         if(column == 16)//如果当前行无法显示整个汉字,则变换到下一行   
  263.                         {
  264.                                 column = 1;
  265.                                 if(++row > 4) return;
  266.                         }
  267.                         Lcd_PutHz(row,column,pString+i);//输出汉字
  268.                         column++;column++;//调整行列值,如果到达液晶最后点,则返回  
  269.                         if(column >16)
  270.                         {
  271.                                 column = 1;
  272.                                 if(++row > 4) return;
  273.                         }
  274.                         i = i+2;
  275.                 }
  276.         }
  277. }</P>
  278. <P>
  279. void Lcd_PutAsc(u8 row,u8 column,u8 *pChar)//在液晶屏对应的行列位置输出ASC字符
  280. {
  281.         u8 i,j,FontNum;
  282.         FontNum = sizeof(Font_Asc8x16)/sizeof(Font_Asc8x16[0]);
  283.         for(i=0;i<FontNum;i++)
  284.         {
  285.                 if(Font_Asc8x16[i].Index[0] == (*pChar))                 
  286.            {               
  287.                         if(column<=8)//设置行列地址
  288.                         {
  289.                                 Lcd_SetL((column-1)*8+0x40);//左半屏
  290.                                 Lcd_SetL((row-1)*2+0xB8);
  291.                                 for(j=0;j<8;j++)
  292.                                 {                                       
  293.                                         Lcd_DataL(Font_Asc8x16[i].Msk[j]);
  294.                                 }
  295.                                 Lcd_SetL((column-1)*8+0x40);
  296.                                 Lcd_SetL((row-1)*2+1+0xB8);
  297.                                 for(j=9;j<16;j++)
  298.                                 {
  299.                                         Lcd_DataL(Font_Asc8x16[i].Msk[j]);
  300.                                 }
  301.                         }
  302.                         else
  303.                         {
  304.                                 Lcd_SetR((column-8-1)*8+0x40);//右半屏
  305.                                 Lcd_SetR((row-1)*2+0xB8);
  306.                                 for(j=0;j<8;j++)
  307.                                 {                                       
  308.                                         Lcd_DataR(Font_Asc8x16[i].Msk[j]);
  309.                                 }
  310.                                 Lcd_SetR((column-8-1)*8+0x40);
  311.                                 Lcd_SetR((row-1)*2+1+0xB8);
  312.                                 for(j=9;j<16;j++)
  313.                                 {
  314.                                         Lcd_DataR(Font_Asc8x16[i].Msk[j]);
  315.                                 }
  316.                         }
  317.                 }
  318.         }
  319. }</P>
  320. <P>
  321. void Lcd_PutHz(u8 row,u8 column,u8 *pHz)//在液晶屏对应的行列位置输出汉字
  322. {
  323.         u8 i,j,FontNum;
  324.         FontNum = sizeof(Font_Hz16x16)/sizeof(Font_Hz16x16[0]);
  325.         for(i=0;i<FontNum;i++)
  326.         {
  327.                 if((Font_Hz16x16[i].Index[0]==(*pHz)) && ((Font_Hz16x16[i].Index[1])==(*(pHz+1))))                 
  328.            {               
  329.                         if(column <= 8)
  330.                         {
  331.                                 Lcd_SetL((column-1)*8+0x40);//写左半屏
  332.                                 Lcd_SetL((row-1)*2+0xB8);
  333.                                 for(j=0;j<8;j++)//显示汉字左上角
  334.                                 {                                       
  335.                                         Lcd_DataL(Font_Hz16x16[i].Msk[j]);
  336.                                 }
  337.                                 Lcd_SetL((column-1)*8+0x40);
  338.                                 Lcd_SetL((row-1)*2+1+0xB8);
  339.                                 for(j=16;j<24;j++)//显示汉字左下角
  340.                                 {
  341.                                         Lcd_DataL(Font_Hz16x16[i].Msk[j]);
  342.                                 }
  343.                         }
  344.                         else
  345.                         {
  346.                                 Lcd_SetR((column-8-1)*8+0x40);//写左半屏
  347.                                 Lcd_SetR((row-1)*2+0xB8);
  348.                                 for(j=0;j<8;j++)//显示汉字左上角
  349.                                 {                                       
  350.                                         Lcd_DataR(Font_Hz16x16[i].Msk[j]);
  351.                                 }
  352.                                 Lcd_SetR((column-8-1)*8+0x40);
  353.                                 Lcd_SetR((row-1)*2+1+0xB8);
  354.                                 for(j=16;j<24;j++)//显示汉字左下角
  355.                                 {
  356.                                         Lcd_DataR(Font_Hz16x16[i].Msk[j]);
  357.                                 }
  358.                         }
  359.                         column++;
  360.                         //显示汉字右半屏
  361.                         if(column <= 8)
  362.                         {
  363.                                 Lcd_SetL((column-1)*8+0x40);//写右半屏
  364.                                 Lcd_SetL((row-1)*2+0xB8);
  365.                                 for(j=8;j<16;j++)//显示汉字右上角
  366.                                 {                                       
  367.                                         Lcd_DataL(Font_Hz16x16[i].Msk[j]);
  368.                                 }
  369.                                 Lcd_SetL((column-1)*8+0x40);
  370.                                 Lcd_SetL((row-1)*2+1+0xB8);
  371.                                 for(j=24;j<32;j++)//显示汉字右下角
  372.                                 {
  373.                                         Lcd_DataL(Font_Hz16x16[i].Msk[j]);
  374.                                 }
  375.                         }
  376.                         else
  377.                         {
  378.                                 Lcd_SetR((column-8-1)*8+0x40);//写右半屏
  379.                                 Lcd_SetR((row-1)*2+0xB8);
  380.                                 for(j=8;j<16;j++)//显示汉字右上角
  381.                                 {                                       
  382.                                         Lcd_DataR(Font_Hz16x16[i].Msk[j]);
  383.                                 }
  384.                                 Lcd_SetR((column-8-1)*8+0x40);
  385.                                 Lcd_SetR((row-1)*2+1+0xB8);
  386.                                 for(j=24;j<32;j++)//显示汉字右下角
  387.                                 {
  388.                                         Lcd_DataR(Font_Hz16x16[i].Msk[j]);
  389.                                 }
  390.                         }
  391.                 }
  392.         }
  393. } </P>
复制代码
lcd.png
0条回答

一周热门 更多>