本例程為UPD78F9234(NEC) BU9793FS(ROHM 88段LCDdrive)例程。來自NEC單片機 采用I2C方式傳送數據,若使用其他廠家的I2C方式通訊的LCDdrive可能需要稍加改動,ISP 通訊方式不可使用。 ***************************************************** #define uchar unsigned char #define slave_addr 0x 7c//slave地址 #define ICSET 0xea //ICSET #define BLKCTL 0xf0 //#define DISCTL 0xa0 //正常 #define DISCTL 0xbc //低功耗 #define ADSET 0x00 #define MODESET 0xc8 #define APCTL8 0xfe #define APCTL 0xfc #define EVRSET0 0xe0 #define EVRSET1 0xe5 #define EVRSET2 0xf8 #define SDA P6.1 #define MSDA PM6.1 #define SCL P6.2 #define MSCL PM6.2 unsigned char buff[24]; void start_i2c(); void stop_i2c(); void send_byte(uchar tempb); void data_display(void); void ini_display(void); void on_display(void); void main(void) { ini_display(); on_display(); while(1) {data_display(); } } /***************************************************** 起動總線函數 函數原型: void start_i2c(); Function: start on the I2Cbus *****************************************************/ void start_i2c() { SDA=1; nop(); SCL=1; nop();nop();nop();nop(); SDA=0; nop();nop();nop();nop(); SCL=0; } /***************************************************** 停止總線函數 函數原型: void stop_i2c(); Function: stop the I2Cbus *****************************************************/ void stop_i2c() { SDA=0; nop(); SCL=1; nop();nop(); SDA=1; nop(); } /***************************************************** 字節數據傳送函數 函數原型: void send_byte(uchar tempb); Function: 將數據C發送出去,可以是地址,也可以是數據,發 完后等待回應,并對此狀態位進行操作(不應答或非應答都使 ack=0 ),發送數據正常,ack=1;ack=0 表示被控器無應答或損壞。 *****************************************************/ void send_byte(uchar tempb) { uchar bit_count; for (bit_count=0;bit_count<8;bit_count++) { if ((tempb< else {SDA=0;} nop(); SCL=1; nop();nop();nop();nop();nop(); SCL=0; } MSDA=1; nop();nop(); // SDA=1; nop();nop(); SCL=1; if (SDA==1) ack=0; else ack=1; MSDA=0; SCL=0; nop(); } void data_display(void) { register uchar i; flag_dis=0; stop_i2c(); start_i2c(); send_byte(slave_addr); // send_byte(DISCTL); // send_byte(BLKCTL); // send_byte(APCTL); // send_byte(MODESET); // if(LVIF) // send_byte(EVRSET0);//3V // else // send_byte(EVRSET1); //5V // send_byte(EVRSET2); send_byte(ADSET); clrwdt(); for(i=0;i<25;i++) {send_byte(buff);} stop_i2c(); } /************初始化LCD-DRIVER**************/ void ini_display(void) {register uchar i; MSCL=0; MSDA=0; stop_i2c(); start_i2c(); send_byte(slave_addr); send_byte(ICSET); send_byte(DISCTL); send_byte(ADSET); for(i=0;i<25;i++) send_byte(0x0); stop_i2c(); } void on_display(void) {start_i2c(); send_byte(slave_addr); send_byte(DISCTL); // send_byte(BLKCTL); send_byte(APCTL); send_byte(MODESET); 本文來自NEC單片機 |