Advertisement
Guest User

Untitled

a guest
Mar 13th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.28 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement