OSDN Git Service

[General] Licence changed to GPL2->GPL+LE cause of sdcc's libraries; See http://sdcc...
[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+LE
6  */
7
8 #include "lcd_acm1602.h"
9
10 static void sendcmd(unsigned char addr, unsigned char cmd)
11 {
12     i2c_idle();
13     OPENASMASTER();
14     i2c_writechar(addr);
15     i2c_writechar(0x00);
16     i2c_writechar(cmd);
17     CLOSEASMASTER();
18     delay1ktcy(1); // 0.1ms
19 }
20
21 static void delay_lcd(void)
22 {
23     delay1ktcy(40); // (1000cycle * (8*5) = 5ms
24 }
25
26 void acm1602_cls(unsigned char addr)
27 {
28     i2c_idle();
29     OPENASMASTER();
30     i2c_writechar(addr);
31     i2c_writechar(0x00); // CMD
32     i2c_writechar(0x01); // CLS
33     CLOSEASMASTER();
34     delay_lcd();
35 }
36
37 void acm1602_putchar(unsigned char addr, unsigned char c)
38 {
39     i2c_idle();
40     OPENASMASTER();
41     i2c_writechar(addr);
42     i2c_writechar(0x80); //Data
43     i2c_writechar(c); // Putchar
44     CLOSEASMASTER();
45     delay1ktcy(1); //0.1ms
46 }
47
48 void acm1602_locate(unsigned char addr, char x, char y)
49 {
50     unsigned char ramaddr;
51     if((x < 0) || (x > 15)) return;
52     if((y < 0) || (y > 1)) return;
53     if(y == 0){
54         ramaddr = 0x80 | (x & 0x0f);
55     } else {
56         ramaddr = 0xc0 | (x & 0x0f);
57     }
58     sendcmd(addr, ramaddr);
59 }
60
61 void acm1602_home(unsigned char addr)
62 {
63     i2c_idle();
64     OPENASMASTER();
65     i2c_writechar(addr);
66     i2c_writechar(0x00); // CMD
67     i2c_writechar(0x02); // HOME
68     CLOSEASMASTER();
69     delay_lcd();
70 }
71
72 void acm1602_printf(unsigned char addr, const char *fmt, ...)
73 {
74     char strbuf[32]; // Max 32 bytes.
75     va_list args;
76     int i;
77     int l;
78
79     strbuf[0] = '\0';
80     va_start(args, fmt );
81     sprintf(strbuf, args);
82     l = strlen(strbuf);
83     if((l >= 32) || (l <= 0))return;
84     for(i = 0; i < l; i++) {
85         acm1602_putchar(addr, strbuf[i]);
86     }
87 }
88
89 void acm1602_cursordir(unsigned char addr, unsigned char right)
90 {
91     unsigned char cmd;
92     if(right == 0) {
93         cmd = 0x18;
94     } else {
95         cmd=0x1c;
96     }
97     sendcmd(addr, cmd);
98 }
99
100 void acm1602_init(unsigned char addr, unsigned char cls)
101 {
102     sendcmd(addr, 0x38); // 2lines, 8x10dot fonts.
103     sendcmd(addr, 0x0f); // Display ON.
104     if(cls == 0){
105         acm1602_home(addr);
106     } else {
107         acm1602_cls(addr);
108     }
109 }