📄 ad7109.c
字号:
/********************************************************************
VIIC_C51.C
此程序是I2C操作平台(主方式的软件平台)的底层的C子程序,如发送数据
及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,它很方便的
与用户程序连接并扩展.....
注意:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作
一定的修改....(本例是1us机器周期,即晶振频率要小于12MHZ)
********************************************************************/
// adress-8bits
//#include <reg764.h>
#include <SST89x5x4.H> /*头文件的包含*/
#include <intrins.h>
#include <math.h>
//#include <SST89x5x4.H>
#define uchar unsigned char
#define uint unsigned int
#define lcd_clr 0x01
#define you_on 0x0f
#define BIT0 0X01
#define BIT1 0X02
#define BIT2 0X04
#define BIT3 0X08
#define BIT4 0X10
#define BIT5 0X20
#define BIT6 0X40
#define BIT7 0X80
#define _Nop() _nop_() /*定义空指令*/
/*
keyboard data
0 12
1 8
2 4
3 0
4 1
5 2
6 3
7 5
8 6
9 7
10-ok 9
11 10
12-wrong11
13 13
14 14
15 15
*/
//全局变量定义
//lcd_bits
sbit rs = P1^7;
sbit rw = P1^6;
sbit e = P2^1;
sbit lcd_deng = P2^3;
//ad_bits
sbit sta = P3^2;
sbit le = P3^6;
sbit he = P3^7;
sbit ce = P2^4;
//函数申明
void lcd_ini(void);
void lcd_wrc(uchar com);
void lcd_wrd(uchar dat);
void lcd_checkbusy();
void delay(unsigned int n);
void lcd_on();
void lcd_off();
uchar lcd_read_ac();
void lcd_dis_num(uint dat);
void lcd_dis_ch(uchar h,uchar l);
void lcd_add(uchar h,uchar l);
void lcd_dis_int(long dat,uint int_bits); //显示一个有符号的整数,显示为dat的低int_bits位
uchar key_data(void);
//i2c相关函数
void Start_I2c(); //起动总线函数
void Stop_I2c(); //结束总线函数
void SendByte(uchar c); //字节数据传送函数send
uchar RcvByte(); //字节数据传送函数 receive
void Ack_I2c(bit a); //主控器进行应答信号
bit ISendStr_8(uchar add,uchar son_add,uchar dat); //向子地址为8位的器件发送多字节数据函数
bit ISendStr_16(uchar add,uint son_add,uchar dat); //向子地址为16位的器件发送多字节数据函数
uchar IRcvStr_8(uchar add,uchar son_add); //向子地址为8位的器件读取多字节数据函数
uchar IRcvStr_16(uchar add,uint son_add); //向子地址为16位的器件读取多字节数据函数
void lcd_dis_time(void); //时钟显示函数
void set_time(uchar sec, uchar min, uchar hr, uchar dy, uchar dt,uchar mn,uchar yr); //时钟设置sec, min, hr, dy, dt, mn, yr
void ad_ce_and_xian(void);
/* 常,变量定义区 */
/*端口位定义*/
sbit SDA = P3^3; /*模拟I2C数据传送位*/
sbit SCL = P1^4; /*模拟I2C时钟控制位*/
sbit WP = P1^3;
/*状态标志*/
bit ack; /*应答标志位*/
uchar s;
void main()
{
// uchar i = 0;
// uchar v;
// uchar mydata = 0;
// uchar keydata = 0;
// uint pot_i;
// pot_i = &i;
// uchar max=58;
// uchar *s;
// s = &max;
lcd_off();
lcd_on();
lcd_ini();
// lcd_add(2,1);
// lcd_dis_ch(0xb4,0xa1);
// I2C
// WP = 0;
// write to rom
/*
lcd_add(2,1);
i = ISendStr_16(0xa0,0x0000,19);
lcd_wrd(0x30+i);
*/
/*
lcd_add(3,1);
for(v=0x0000;v<8;v++)
{
i = 0;
while(i == 0)
{
i = ISendStr_16(0xa0,v,250+2*v+1);
}
lcd_wrd(0x30+(uchar)i);
}
*/
// read rom set address
/*
for(v=0x0000;v<8;v++)
{
i = IRcvStr_16(0xa0,v);
lcd_wrc(0x88+2*v);
lcd_dis_num(i);
}
/*
*/
// while(1);
// set_time(30,6,2,2,30,1,7); //时钟设置sec, min, hr, dy, dt, mn, yr
// lcd_add(2,1);
// lcd_wrd(0x03);
// lcd_dis_num(54);
while(1)
{
lcd_dis_time(); //时钟显示函数
// lcd_add(3,1);
// lcd_dis_int(987,2); //显示一个有符号的整数,显示为dat的低int_bits位
// ad_ce_and_xian();
/*
keydata = key_data();
lcd_add(4,6);
switch(keydata)
{
case 0:
{
v = 3;
lcd_dis_num(v);
break;
}
case 1:
{
v = 4;
lcd_dis_num(v);
break;
}
case 2:
{
v = 5;
lcd_dis_num(v);
break;
}
case 3:
{
v = 6;
lcd_dis_num(v);
break;
}
case 4:
{
v = 2;
lcd_dis_num(v);
break;
}
case 5:
{
v = 7;
lcd_dis_num(v);
break;
}
case 6:
{
v = 8;
lcd_dis_num(v);
break;
}
case 7:
{
v = 9;
lcd_dis_num(v);
break;
}
case 8:
{
v = 1;
lcd_dis_num(v);
break;
}
case 9:
{
v = 10;
lcd_dis_num(v);
break;
}
case 10:
{
v = 11;
lcd_dis_num(v);
break;
}
case 11:
{
v = 12;
lcd_dis_num(v);
break;
}
case 12:
{
v = 0;
lcd_dis_num(v);
break;
}
case 13:
{
v = 13;
lcd_dis_num(v);
break;
}
case 14:
{
v = 14;
lcd_dis_num(v);
break;
}
case 15:
{
v = 15;
lcd_dis_num(v);
break;
}
default:
// case 16:
{
v = 16;
lcd_dis_num(v);
break;
}
}
*/
}
}
void lcd_ini()
{
delay(100);
lcd_wrc(0x34);
lcd_wrc(0x30);
lcd_wrc(0x01);
lcd_wrc(0x06);
lcd_wrc(0x0c);
delay(100);
}
void lcd_wrc(uchar com)
{
lcd_checkbusy();
rs = 0;
rw = 0;
e = 1;
P0 = com;
P0 = com;
delay(10);
e = 0;
}
void lcd_wrd(uchar dat)
{
lcd_checkbusy();
rs = 1;
rw = 0;
e = 1;
P0 = dat;
P0 = dat;
delay(5);
e = 0;
}
void lcd_checkbusy()
{
uchar busy;
P0 = 0XFF;
busy = P0;
if(busy>0x7f)
{
rs = 0;
rw = 1;
e = 1;
busy = P0;
e = 0;
delay(10);
}
}
uchar lcd_rdd();
void delay(unsigned int n)
{
while(n--);
}
void lcd_on()
{
lcd_deng = 0;
}
void lcd_off()
{
lcd_deng = 1;
}
uchar lcd_read_ac()
{
uchar dat;
// P0 = 0X00;
rs = 0;
rw = 1;
e = 1;
dat = P0;
dat = P0;
e = 0;
return(dat&0x7f);
}
void lcd_dis_num(uint dat)
{
uint a=0;
dat =dat%10000;
a =dat/1000;
lcd_wrd(0x30+a);
dat =dat%1000;
a =dat/100;
lcd_wrd(0x30+a);
dat =dat%100;
a=dat/10;
lcd_wrd(0x30+a);
dat =dat%10;
lcd_wrd(0x30+dat);
}
void lcd_dis_ch(uchar h,uchar l)
{
lcd_wrd(h);
lcd_wrd(l);
}
void lcd_add(uchar h,uchar l) //定位地址
{
l--;
switch(h)
{
case 1:
{
lcd_wrc(0x80+l);
break;
}
case 2:
{
lcd_wrc(0x90+l);
break;
}
case 3:
{
lcd_wrc(0x88+l);
break;
}
case 4:
{
lcd_wrc(0x98+l);
break;
}
}
}
unsigned char key_data() //判断键值
{
uchar a=0,b=0,c=0,d=0,i=0;
a = 0xef;
for(i = 0;i<4;i++) //读行
{
P1 = a;
delay(10);
b = P1;
b = b&0x0f;
// b = b>>4;
if(b!=0x0F) //表示有键按下
{
delay(200); //软件延时 确认有键按下
b = P1&0X0F;
// b = b>>4;
if(b != 0x0F)
{
// return b;
c=b;
if(c==0X07)
{
d=i*4+3;
}
else if(c==0X0B)
{
d=i*4+2;
}
else if(c==0X0D)
{
d=i*4+1;
}
else if(c==0X0E)
{
d=i*4;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -