Advertisement
Guest User

stm32f4 clcd

a guest
Dec 22nd, 2011
4,835
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.91 KB | None | 0 0
  1. #include "stm32f4xx.h"    //Include main header for MCU
  2.  
  3. #define DATA_PORT GPIOC->ODR
  4. #define CMD_PORT GPIOA->ODR
  5.  
  6. #define DATA 6
  7. #define DATA_CLR 0xFFFFFC3F
  8.  
  9. #define LCD_E  0x100     //PA8
  10. #define LCD_RS 0x200     //PA9
  11.  
  12. #define CMD 0
  13. #define TXT 1
  14.  
  15. #define        LINE1    0x80        // Start address of first line
  16. #define        LINE2    0xC0        // Start address of second line
  17.  
  18. void WaitLCDBusy(void);
  19. void LCD_Init(void);
  20. void LCD_DATA(unsigned char data,unsigned char type);
  21. void LCD_NYB(unsigned char nyb,unsigned char type);
  22. void LCD_STR(const char *text);
  23. void LCD_LINE(char line);
  24. void DelayMS(unsigned int ms);
  25. void initDiscovery(void);
  26. void delay(int ticks)
  27. {
  28.   while(ticks--);
  29. }
  30.  
  31. void lcd_init()
  32. {
  33.     CMD_PORT &= ~(LCD_E);  //LCD_E = 0;                    //clear enable
  34.     CMD_PORT &= ~(LCD_RS); //LCD_RS = 0;                 //going to write command
  35.  
  36.     DelayMS(30);                //delay for LCD to initialise.
  37.     LCD_NYB(0x30,0);              //Required for initialisation
  38.     DelayMS(5);                 //required delay
  39.     LCD_NYB(0x30,0);              //Required for initialisation
  40.     DelayMS(1);                 //required delay
  41.     LCD_DATA(0x02,0);           //set to 4 bit interface, 1 line and 5*7 font
  42.     LCD_DATA(0x28,0);           //set to 4 bit interface, 2 line and 5*10 font
  43.     LCD_DATA(0x0c,0);           //set to 4 bit interface, 2 line and 5*7 font
  44.     LCD_DATA(0x01,0);           //clear display
  45.     LCD_DATA(0x06,0);           //move cursor right after write
  46. }
  47.  
  48. //--------------------------------------------------------------------------------//
  49. void LCD_DATA(unsigned char data,unsigned char type){
  50.  
  51.     WaitLCDBusy();                  //TEST LCD FOR BUSY
  52.  
  53.     if(type == CMD){
  54.         CMD_PORT &= ~(LCD_RS);                 //COMMAND MODE
  55.     } else {
  56.         CMD_PORT |= LCD_RS;                 //CHARACTER/DATA MODE
  57.     }
  58.  
  59.     LCD_NYB(data>>4,type);               //WRITE THE UPPER NIBBLE
  60.     LCD_NYB(data,type);                  //WRITE THE LOWER NIBBLE
  61. }
  62. //--------------------------------------------------------------------------------//
  63. void WaitLCDBusy(void){
  64.     DelayMS(2);              //DELAY 1 MilliSeconds
  65. }
  66. //--------------------------------------------------------------------------------//
  67. void LCD_NYB(unsigned char nyb,unsigned char type){
  68.     DATA_PORT &= DATA_CLR;    //LCD_PORT &= 0xF0;                     //CLEAR LOWER PORT NIBBLE
  69.     DATA_PORT |= (nyb<<DATA); //LCD_PORT |= (nyb & 0x0F);             //SEND DATA LINE THE INFO
  70.  
  71.     if(type == CMD){
  72.         CMD_PORT &= ~(LCD_RS);                 //COMMAND MODE
  73.     } else {
  74.         CMD_PORT |= LCD_RS;                 //CHARACTER/DATA MODE
  75.     }
  76.  
  77.     CMD_PORT |= LCD_E;    //LCD_E = 1;          //ENABLE LCD DATA LINE
  78.     delay(100);                //SMALL DELAY
  79.     CMD_PORT &= ~(LCD_E); //LCD_E = 0;       //DISABLE LCD DATA LINE
  80. }
  81. //--------------------------------------------------------------------------------//
  82. void LCD_STR(const char *text){
  83.     while(*text){
  84.         LCD_DATA(*text++,1);
  85.     }
  86. }
  87. void LCD_STR2(unsigned char *text){
  88.     while(*text)
  89.     {
  90.         LCD_DATA(*text++,1);
  91.     }
  92. }
  93. //--------------------------------------------------------------------------------//
  94. void LCD_LINE(char line){
  95.     switch(line){
  96.         case 0:
  97.         case 1:
  98.             LCD_DATA(LINE1,0);
  99.             break;
  100.         case 2:
  101.             LCD_DATA(LINE2,0);
  102.             break;
  103.     }
  104. }
  105. //--------------------------------------------------------------------------------//
  106.  
  107. //--------------------------------------------------------------------------------//
  108. void DelayMS(unsigned int ms){
  109.     unsigned int x;
  110.     for(x=0;x<ms;x++)
  111.         delay(600);
  112. }
  113. //--------------------------------------------------------------------------------//
  114. //--------------------------------------------------------------------------------//
  115. //   MAIN   -   MAIN   -   MAIN   -   MAIN   -   MAIN   -   MAIN   -   MAIN       //
  116. //--------------------------------------------------------------------------------//
  117. //--------------------------------------------------------------------------------//
  118. void initDiscovery(void)
  119. {
  120.   RCC->CFGR = RCC_CFGR_SW_HSE;
  121.   RCC->AHB1ENR = RCC_AHB1ENR_GPIOAEN|RCC_AHB1ENR_GPIOCEN;
  122.   RCC->CR |= RCC_CR_HSEON;
  123.  
  124.   while((RCC->CR & RCC_CR_HSERDY)==0);
  125.  
  126.   GPIOC->MODER=GPIO_MODER_MODER6_0|GPIO_MODER_MODER7_0|GPIO_MODER_MODER8_0|GPIO_MODER_MODER9_0;
  127.   GPIOA->MODER=GPIO_MODER_MODER8_0|GPIO_MODER_MODER9_0;
  128.  
  129.   GPIOC->OSPEEDR = GPIO_OSPEEDER_OSPEEDR6_1 | GPIO_OSPEEDER_OSPEEDR7_1 | GPIO_OSPEEDER_OSPEEDR8_1 | GPIO_OSPEEDER_OSPEEDR9_1;
  130.   GPIOA->OSPEEDR = GPIO_OSPEEDER_OSPEEDR8_1 | GPIO_OSPEEDER_OSPEEDR9_1;
  131. }
  132.  
  133. void main()
  134. {
  135.   initDiscovery();
  136.  
  137.   lcd_init();
  138.  
  139.   DelayMS(3);
  140.   LCD_LINE(1);
  141.   LCD_STR((const char*)"    AtomTech    ");
  142.  
  143.   DelayMS(100);
  144.   LCD_LINE(2);
  145.   LCD_STR((const char*)"  Jason  Lopez  ");
  146.   DelayMS(100);
  147.  
  148.   while(1)
  149.   {
  150.  
  151.   }
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement