|
100黑幣
大佬們好,最近想用單片機(jī)+lcd做個(gè)顯示的功能,某一個(gè)寶買的pcf8574+lcd1602的模塊,單片機(jī)用的STC16C5A60S2,外接20MHz的晶振,看了論壇里面各位大佬的帖子,受益匪淺,試著移植過來用,但是一直沒有顯示,給pcf8574外接的5V10A的電源,不知道有沒有影響,下面是我的程序,還請各位大佬給看看程序有什么問題。如果解決的話,可以有報(bào)酬(rmb)。另外發(fā)現(xiàn)一個(gè)奇怪的問題,單獨(dú)給IIC倆引腳賦值時(shí),SDA置1,SCL置0的時(shí)候,SDA引腳測電壓是負(fù)的0.5;都置1的時(shí)候,SDA電壓是2.2V,菜雞新手確實(shí)不知道什么問題了,希望各位大佬不吝賜教。
主程序的:
程序里的延時(shí)是用STC-ISP的工具生成的,我用示波器看是比較準(zhǔn)確的。
- #include <STC12C5A60S2.H>
- #include <PCF8574.h>
- #include "intrins.h"
- /************IO口工作模式初始化函數(shù)***********/
- void IO_Init()
- {
- P0M0=0x00;
- P0M1=0x00;
-
- P1M0=0x00;
- P1M1=0x00;
-
- P2M0=0x00;
- P2M1=0x00;
-
- P3M0=0x00;
- P3M1=0x00;
-
- P4M0=0x00;
- P4M1=0x00;
-
- P5M0=0x00;
- P5M1=0x00;
-
- }
- /**************延時(shí)函數(shù)ms**************/
- /*
- void delayms(uchar x)
- {
- uchar a,b;
- for(a=0;a<x;a++)
- for(b=0;b<200;b++)
- delayus();
- }*/
- void Delay6ms() //@20.000MHz
- {
- unsigned char i, j;
- _nop_();
- _nop_();
- i = 117;
- j = 183;
- do
- {
- while (--j);
- } while (--i);
- }
- void write_com(uchar com) //寫命令函數(shù)
- { uchar com1,com2;
- com1=com|0x0f;
- write_add(com1&0xfc);
- delayus();
- write_add(com1&0xf8);
- com2=com<<4;
- com2=com2|0x0f;
- write_add(com2&0xfc);
- delayus();
- write_add(com2&0xf8);
-
- }
- void write_date(uchar date) //寫數(shù)據(jù)函數(shù)
- {
- uchar date1,date2;
- date1=date|0x0f;
- write_add(date1&0xfd);
- delayus();
- write_add(date1&0xf9);
- date2=date<<4;
- date2=date2|0x0f;
- write_add(date2&0xfd);
- delayus();
- write_add(date2&0xf9);
-
- }
- void init_lcd() //初始化函數(shù)
- {
- write_com(0x33); //顯示模式設(shè)置
- Delay6ms();
- write_com(0x32); //顯示模式設(shè)置
- Delay6ms();
- write_com(0x28); //4位總線,雙行顯示,顯示5×7的點(diǎn)陣字符
- Delay6ms();
- write_com(0x01); //清屏
- Delay6ms();
- write_com(0x06); //字符進(jìn)入模式:屏幕不動(dòng),字符后移
- Delay6ms();
- write_com(0x0c); //顯示開,關(guān)光標(biāo)
- //write_LCD_Command(0x0f); //顯示開,開光標(biāo),光標(biāo)閃爍
- Delay6ms();
- }
- //顯示字符串:第x行第y列顯示什么內(nèi)容
- void ShowString(unsigned char x,unsigned char y,unsigned char *str)
- {
-
- if(x == 1)
- {
- write_com(0x80 | y-1);
- }
- if(x == 2)
- {
- write_com(0xc0 | y-1);
- }
- //輸出字符串
-
- while(*str!='\0')
- {
- write_date(*str);
- str++;
- }
- }
- void main()
- {
- IO_Init();
- init();
- init_lcd();
- ShowString(1,1,"0123456789123456");
- ShowString(2,1,"1234567891234560");
- delayus();
- while(1)
- {
- }
-
- }
復(fù)制代碼
PCF8574.h
- sbit scl=P2^3;
- sbit sda=P2^4;
- #define uchar unsigned char
- #define uint unsigned int
- void delayus() //@20.000MHz 5um
- {
- unsigned char i;
- i = 22;
- while (--i);
- }
- void init()//IIC初始化
- {
- sda=1;
- delayus();
- scl=1;
- delayus();
- }
- void start() //IIC開始信號
- {
- sda=1;
- delayus();
- scl=1;
- delayus();
- sda=0;
- delayus();
- }
- void stop() //IIC停止
- {
- sda=0;
- delayus();
- scl=1;
- delayus();
- sda=1;
- delayus();
- }
- void respons() //IIC應(yīng)答
- {
- uchar i;
- scl=1;
- delayus();
- while((sda==1)&&(i<250))i++;
- scl=0;
- delayus();
- }
- void write_byte(uchar date)//IIC寫入數(shù)據(jù)
- {
- uchar i,temp;
- temp=date;
- for(i=0;i<8;i++)
- {
- temp=temp<<1;
- scl=0;
- delayus();
- sda=CY;
- delayus();
- scl=1;
- delayus();
- }
- scl=0;
- delayus();
- sda=1;
- delayus();
- }
- void write_add(uchar date1)//寫入數(shù)據(jù)到IO
- {
- start();
- //write_byte(0x7e);
- write_byte(0x4e);
- respons();
- write_byte(date1);
- respons();
- stop();
- }
復(fù)制代碼
|
最佳答案
查看完整內(nèi)容
根據(jù)你的描述,I2C通訊貌似都是有問題的,就不著急先看代碼的問題,先把I2C處理好,確認(rèn)沒問題了在看代碼的邏輯?梢韵葘懸粋(gè)簡單的程序,就直接給I2C兩個(gè)IO口賦值,看看高低電平正不正常,如果有問題那就先找到問題是什么解決了再看代碼,根據(jù)你的描述來看I2C硬件估計(jì)是有問題的,LCD和單片機(jī)共地了嗎?I2C上拉電阻有沒有?
|