daily pastebin goal
67%
SHARE
TWEET

Untitled

a guest Mar 13th, 2018 51 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //4-bit LCD init code  Pieter Thomas & Patrick Van Torre 2018
  2.  
  3. #include <c8051f340.h>
  4. #include <stdio.h>
  5.  
  6. #define LCD         P4  //P4 and higher ports cannot be bit addressed!
  7. #define RS 2  //Px^1
  8. #define RW 1  //Px^0
  9. #define EN 8  //Px^3
  10.  
  11.  
  12. //-----------------------------------------------------------------------------
  13. // Function PROTOTYPES
  14. //-----------------------------------------------------------------------------
  15. void Init_Device(void);
  16. void LCD_Init(void);
  17. void LCD_Delay(int time);
  18. void LCD_Clock(char lcddata);
  19. void LCD_Busy(void);
  20. void LCD_Send(char teken);
  21. void LCD_uitschrijvenGetal(unsigned long input);
  22. void LCD_pos(void);
  23.  
  24. char buffer[17];
  25.  
  26. void main(void)
  27. {
  28.     unsigned char n=1;
  29.     unsigned long teller=0;
  30.    
  31.    
  32.     Init_Device();
  33.    
  34.     LCD_Init();
  35.     /*
  36.     LCD_Send('U');
  37.     LCD_Send('G');
  38.     LCD_Send('e');
  39.     LCD_Send('n');
  40.     LCD_Send('t');
  41.     */
  42.     //Opdracht 1
  43.     /*
  44.     LCD_printString("De Dies Natalis stond dit jaar volledig in het teken van de 200e verjaardag van de UGent en was het ankerevent in het jubileumjaar, waarin maatschappelijk engagement centraal staat.");
  45.    
  46.     LCD_Clear();
  47.     LCD_Delay(255);
  48.    
  49.     LCD_printString("Na de zitting vond een feestelijk concert plaats in de Opera Gent, met onder meer de universitaire hymne.");
  50.     */
  51.    
  52.     LCD_uitschrijvenGetal(83);
  53.     while(1);
  54.  
  55.    
  56.  
  57. }
  58.  
  59.  
  60.  
  61. //-----------------------------------------------------------------------------
  62. // LCD_Init   Robust version written by P. Van Torre DEC 2014
  63. //-----------------------------------------------------------------------------
  64. //
  65. void LCD_Init (void)
  66. {
  67.     //wait a while after power on  
  68.     LCD_Delay(2550);
  69.    
  70.     //go to 8-bit mode no matter what (8 -> 8 / 4 -> 8)
  71.     LCD_Clock(0x30);
  72.     LCD_Delay(2550);  
  73.     LCD_Clock(0x30);
  74.     LCD_Delay(250);  
  75.     LCD_Clock(0x30);
  76.     LCD_Delay(250);  
  77.    
  78.    
  79.     //now go to 4-bit mode
  80.     LCD_Clock(0x20);
  81.     LCD_Delay(250);  
  82.  
  83.   //interface definitely in 4-bit mode now, independent of history  
  84.    
  85.     //4-bit 2-line
  86.     LCD_Clock(0x20);  
  87.     LCD_Clock(0x80);  
  88.     LCD_Delay(250);  
  89.  
  90.     //no shift ; cursor right
  91.     LCD_Clock(0x10);  
  92.     LCD_Clock(0x40);  
  93.     LCD_Delay(250);  
  94.  
  95.     //display on ; cursor off ; no blinking
  96.     LCD_Clock(0x00);  
  97.     LCD_Clock(0xC0);  
  98.     LCD_Delay(250);  
  99.  
  100.     //cursor moves right ; no display shift
  101.     LCD_Clock(0x00);  
  102.     LCD_Clock(0x60);  
  103.     LCD_Delay(250);
  104.  
  105.  
  106. }
  107.  
  108. //-----------------------------------------------------------------------------
  109. // LCD_Delay
  110. //-----------------------------------------------------------------------------
  111. //
  112. void LCD_Delay (int time)
  113. {
  114. int n,m;
  115. for (n=0;n<time;n++)
  116.     {
  117.     for (m=0;m<255;m++);
  118.     }
  119. }
  120.  
  121. //-----------------------------------------------------------------------------
  122. // LCD_Clock
  123. //-----------------------------------------------------------------------------
  124. //
  125. void LCD_Clock (char lcddata)
  126. {
  127.     LCD = lcddata;
  128.     LCD &= ~EN;
  129.     LCD_Delay(10);
  130.     LCD |= EN;
  131.     LCD_Delay(10);
  132.     LCD &= ~EN;
  133.     LCD_Delay(10);
  134. }
  135.  
  136.  
  137.  
  138. //-----------------------------------------------------------------------------
  139. // LCD_Busy PVT2014
  140. //-----------------------------------------------------------------------------
  141. //
  142. void LCD_Busy (void)
  143. {
  144.     bit busy=1;
  145.     unsigned char timeout=0;
  146.    
  147.     while(busy&++timeout)
  148.     {
  149.     LCD=0xF1;  //check busy flag command
  150.     LCD_Delay(1);
  151.     LCD |= EN;
  152.     LCD_Delay(1);
  153.     busy=((LCD&0x80)==0x80);
  154.     LCD &= ~EN;
  155.     LCD_Delay(1);
  156.        
  157.     // 2 cycles in 4-bit mode
  158.     LCD |= EN;
  159.     LCD_Delay(1);
  160.     LCD &= ~EN;
  161.     LCD_Delay(1);
  162.     }
  163. }
  164.  
  165.  
  166. //-----------------------------------------------------------------------------
  167. // LCD_Send
  168. //-----------------------------------------------------------------------------
  169. //
  170. void LCD_Send (char teken)
  171. {
  172.     LCD_Clock(teken & 0xf0 | RS);      
  173.     LCD_Clock(((teken & 0x0f)<<4) | RS);
  174.     LCD_Busy(); //wait until LCD ready
  175. }
  176. /*
  177. void binairNaarDecimaal(unsigned long input){
  178.     int decimaalGetal = 0, i = 0, rest;
  179.     while(input != 0) {
  180.         rest = input%10;
  181.         input /= 10;
  182.         decimaalGetal += rest * pow(2,i);
  183.         ++i;
  184.     }
  185.     return decimaalGetal;
  186. }
  187. */
  188. void LCD_uitschrijvenGetal(unsigned long input){
  189.     int i;
  190.     int teller = 0;
  191.     int getalInArray[16];       //Getal kan maximum 16 tekens bevatten
  192.     while(input > 0){
  193.         getalInArray[teller] = (input%10);
  194.         input = input / 10;
  195.         teller++;
  196.     }
  197.     for(i = teller-1; i >= 0 ; i--){
  198.         LCD_Send(getalInArray[teller]);
  199.     }
  200. }
  201.  
  202. void LCD_sprintf(unsigned long input){
  203.     int i;
  204.     char output [16];
  205.     sprintf(output, "%lu", input);
  206.     while(output[i] != 0){
  207.         LCD_Send(output[i]);
  208.         i++;
  209.     }
  210. }
  211.  
  212. void LCD_pos(void){
  213.     //Duurde wel eventjes voor ik dit vond. Ik heb de informatie uit
  214.     //bestand minerva: "LCD__Interfacing_with_Microcontrollers_tutorial" p 12
  215.     //0x8* is de eerste rij, met * de verticale positie
  216.     //0xC* is de tweede rij, met * de verticale positie
  217.     LCD_clock(0xC0); //CF = 1100 1111
  218.     LCD_clock(0xF0);
  219.     LCD_delay(100);
  220. }
  221.  
  222. void LCD_clear(void){
  223.     //We zitten 4-bit mode, dus we moeten in 2 keer klokken (0000 0001)
  224.     //DB0 = 1 --> clears entire display and sets DDRAM adress 0 in AC
  225.     LCD_clock(0x00);    
  226.     LCD_clock(0x10);    
  227.     LCD_delay(100);     //geen idee waarom je delay moet gebruiken, het wordt altijd gedaan.   
  228. }
  229.  
  230. void LCD_home(void){
  231.     //Bij deze instructie begrijp ik niet 100% wat ze bedoelen, op p26 datasheet
  232.     //Staat er meer info, ik heb deze instructies dan ook gevolgd.
  233.     LCD_clock(0x00);
  234.     LCD_clock(0x20);
  235.     LCD_delay(100);
  236. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top