大佬们好,最近想用单片机+lcd做个显示的功能,某一个宝买的pcf8574+lcd1602的模块,单片机用的STC16C5A60S2,外接20MHz的晶振,看了论坛里面各位大佬的帖子,受益匪浅,试着移植过来用,但是一直没有显示,给pcf8574外接的5V10A的电源,不知道有没有影响,下面是我的程序,还请各位大佬给看看程序有什么问题。如果解决的话,可以有报酬(rmb)。另外发现一个奇怪的问题,单独给IIC俩引脚赋值时,SDA置1,SCL置0的时候,SDA引脚测电压是负的0.5;都置1的时候,SDA电压是2.2V,菜鸡新手确实不知道什么问题了,希望各位大佬不吝赐教。
主程序的:
程序里的延时是用STC-ISP的工具生成的,我用示波器看是比较准确的。
- #include <STC12C5A60S2.H>
- #include <PCF8574.h>
- #include "intrins.h"
- /************IO口工作模式初始化函数***********/
- 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;
-
- }
- /**************延时函数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) //写命令函数
- { 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) //写数据函数
- {
- 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() //初始化函数
- {
- write_com(0x33); //显示模式设置
- Delay6ms();
- write_com(0x32); //显示模式设置
- Delay6ms();
- write_com(0x28); //4位总线,双行显示,显示5×7的点阵字符
- Delay6ms();
- write_com(0x01); //清屏
- Delay6ms();
- write_com(0x06); //字符进入模式:屏幕不动,字符后移
- Delay6ms();
- write_com(0x0c); //显示开,关光标
- //write_LCD_Command(0x0f); //显示开,开光标,光标闪烁
- Delay6ms();
- }
- //显示字符串:第x行第y列显示什么内容
- 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)
- {
- }
-
- }
复制代码
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应答
- {
- uchar i;
- scl=1;
- delayus();
- while((sda==1)&&(i<250))i++;
- scl=0;
- delayus();
- }
- void write_byte(uchar date)//IIC写入数据
- {
- 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)//写入数据到IO
- {
- start();
- //write_byte(0x7e);
- write_byte(0x4e);
- respons();
- write_byte(date1);
- respons();
- stop();
- }
复制代码
|