OSDN Git Service

[Device] ADD AKC6955(Initial), ADD ACM1602 LCD Controller.
[openi2cradio/OpenI2CRadio.git] / lcd_acm1602.c
1 /*
2  * OpenI2CRADIO
3  * I2C-LCD ACM1602 Handler
4  * (C) 2013-06-10 K.Ohta <whatisthis.sowhat ai gmail.com>
5  * License: GPL2
6  */
7
8 #include <stdarg.h>
9 #include <stdio.h>
10 #include <delay.h>
11 #include <string.h>
12
13 #include "i2c_io.h"
14
15
16 static void sendcmd(unsigned char addr, unsigned char cmd)
17 {
18     i2c_idle();
19     OPENASMASTER();
20     i2c_writechar(addr);
21     i2c_writechar(0x00);
22     i2c_writechar(cmd);
23     CLOSEASMASTER();
24     delay1ktcy(1); // 0.1ms
25 }
26
27 static void delay_lcd(void)
28 {
29     delay1ktcy(40); // (1000cycle * (8*5) = 5ms
30 }
31
32 void acm1602_cls(unsigned char addr)
33 {
34     i2c_idle();
35     OPENASMASTER();
36     i2c_writechar(addr);
37     i2c_writechar(0x00); // CMD
38     i2c_writechar(0x01); // CLS
39     CLOSEASMASTER();
40     delay_lcd();
41 }
42
43 void acm1602_putchar(unsigned char addr, unsigned char c)
44 {
45     i2c_idle();
46     OPENASMASTER();
47     i2c_writechar(addr);
48     i2c_writechar(0x80); //Data
49     i2c_writechar(c); // Putchar
50     CLOSEASMASTER();
51     delay1ktcy(1); //0.1ms
52 }
53
54 void acm1602_locate(unsigned char addr, char x, char y)
55 {
56     unsigned char ramaddr;
57     if((x < 0) || (x > 15)) return;
58     if((y < 0) || (y > 1)) return;
59     if(y == 0){
60         ramaddr = 0x80 | (x & 0x0f);
61     } else {
62         ramaddr = 0xc0 | (x & 0x0f);
63     }
64     sendcmd(addr, ramaddr);
65 }
66
67 void acm1602_home(unsigned char addr)
68 {
69     i2c_idle();
70     OPENASMASTER();
71     i2c_writechar(addr);
72     i2c_writechar(0x00); // CMD
73     i2c_writechar(0x02); // HOME
74     CLOSEASMASTER();
75     delay_lcd();
76 }
77
78 void acm1602_printf(unsigned char addr, const char *fmt, ...)
79 {
80     char strbuf[32]; // Max 32 bytes.
81     va_list args;
82     int i;
83     int l;
84
85     strbuf[0] = '\0';
86     va_start(args, fmt );
87     sprintf(strbuf, args);
88     l = strlen(strbuf);
89     if((l >= 32) || (l <= 0))return;
90     for(i = 0; i < l; i++) {
91         acm1602_putchar(addr, strbuf[i]);
92     }
93 }
94
95 void acm1602_cursordir(unsigned char addr, unsigned char right)
96 {
97     unsigned char cmd;
98     if(right == 0) {
99         cmd = 0x18;
100     } else {
101         cmd=0x1c;
102     }
103     sendcmd(addr, cmd);
104 }
105
106 void acm1602_init(unsigned char addr, unsigned char cls)
107 {
108     sendcmd(addr, 0x38); // 2lines, 8x10dot fonts.
109     sendcmd(addr, 0x0f); // Display ON.
110     if(cls == 0){
111         acm1602_home(addr);
112     } else {
113         acm1602_cls(addr);
114     }
115 }