今天调试了一下pcf8951,用12864进行显示,请先看程序。图在后面
Mian.C文件中的内容为:
//pcf8591调试程序
#include "main.h"
#include "lcd12864.h"
#include "pcf8591.h"
uint time=0;
uchar ADFlag=0;
uchar str[] = "ch : . v";
//12864显示ad转换的值
void dis(uchar *date)
{
uchar i=0;
for(i=0; i<4; i++)
{
str[2]=i+0x30;
str[4]=date[i]/50+0x30;
str[6]=date[i]%50/10+0x30;
writelcdwords(0x80+i*8, str);
}
}
void main()
{
uchar i=0;
uchar vot[4];
init_lcd();
while(1)
{
vot[3]=read(2); //器件在上一次转换结果读出后才进行下次采样转换
vot[2]=read(1);
vot[1]=read(0);
vot[0]=read(3);
dis(vot);
}
}
Pcf8951.c文件中的内容为:
#include "main.h"
#include "pcf8591.h"
//延时1US
void delay(uint cnt)
{
while(--cnt);
}
void start()
{
SDA_SET;
delay(1);
SCL_SET;
delay(5);
SDA_CLR;
}
void stop()
{
SDA_CLR;
delay(1);
SCL_SET;
delay(5);
SDA_SET;
}
void ack()
{
SDA_CLR;
SCL_SET;
delay(1);
SCL_CLR;
}
void noAck()
{
SDA_SET;
SCL_SET;
delay(1);
SCL_CLR;
}
//向器件发送一个字节
void send(uchar Data)
{
uchar i=0;
uchar temp=0;
temp=Data;
for(i=0; i<8; i++)
{
SCL_CLR;
delay(1);
if(temp&0x80) SDA_SET;
else SDA_CLR;
delay(1);
SCL_SET;
delay(1);
temp<<=1;
}
SCL_CLR;
}
//接收一个字节
uchar recive()
{
uchar i=0;
uchar temp=0;
SDA_SET;//必须设置
for(i=0; i<8; i++)
{
SCL_CLR;//拉低允许数据改变
delay(1);
SCL_SET;//拉高保持数据,等待读走
delay(2);
if(SDA) temp|=0x01;
else temp&=0xfe;
if(i<7) temp<<=1;//最低位发送完成不能移位,否则出错
}
SCL_CLR;
return temp;
}
//adc数据读取
//ch为要进行ad转换的通道号
uchar read(uchar ch )
{
uchar temp=0;
start();
send(AddWr);//确认芯片
ack();
send(adCon|ch);//确认通道
ack();
//读出数据,放进temp
start();
send(AddRd);
ack();
temp=recive();
noAck();
stop();
return temp;
}
//dac输出程序
//light:设置dac要输出的值
uchar DAC(uchar light)
{
start();
send(AddWr);
ack();
send(0x40); //写入控制位,使能DAC输出
ack();
send(light);
ack();
stop();
return 1;
}
由于这次比赛用的pcb上没有3.3V的电源,所以我将我从自己diy的开发板上做的程序发给大家,给大家一个参考:
#include "main.h"
#include "lcd5110.h"
unsigned char code shuzi[]={0};
unsigned char code hanzi[][32]={
//字模数据,自己提取,提取方法见图片
};
void delay_1ms(void)//1ms延时函数
{
unsigned int i;
for (i=0;i<500;i++) ;
;
}
/*--------------------------------------------
LCD_write_byte: 使用SPI接口写数据到LCD
输入参数:dt:写入的数据;
command :写数据/命令选择;数据为1,命令为0
编写日期:20080918
----------------------------------------------*/
void LCD_write_byte(unsigned char dt, bit command)
{
unsigned char i;
sce=0;
dc=command;
for(i=0;i<8;i++)
{
if(dt&0x80)
sdin=1;
else
sdin=0;
dt=dt<<1;
sclk=0;
sclk=1;
}
dc=1;
sce=1;
sdin=1;
}
/*---------------------------------------
LCD_init: 3310LCD初始化
编写日期:20080918
----------------------------------------- */
void LCD_init(void)
{
res=0;
delay_1ms();
res=1;
LCD_write_byte(0x21,0);//初始化Lcd,功能设定使用扩充指令
LCD_write_byte(0xd0,0);//设定液晶偏置电压
LCD_write_byte(0x22,0);//使用基本指令
LCD_write_byte(0x0c,0);//设定显示模式,正常显示
}
/*-------------------------------------------
LCD_set_XY: 设置LCD坐标函数
输入参数:X:0-83 Y:0-5
编写日期:20080918
---------------------------------------------*/
void LCD_set_XY(unsigned char X, unsigned char Y)
{
LCD_write_byte(0x40 | Y, 0);// column
LCD_write_byte(0x80 | X, 0);// row
}
/*------------------------------------------
LCD_clear: LCD清屏函数
编写日期:20080918
--------------------------------------------*/
void LCD_clear(void)
{
unsigned char t;
unsigned char k;
LCD_set_XY(0,0);
for(t=0;t<6;t++)
{
for(k=0;k<84;k++)
{
LCD_write_byte(0x00,1);
}
}
}
/*---------------------------------------------
LCD_write_shu: 显示8(宽)*16(高)点阵列数字字母符号等半角类
输入参数:c:显示的字符;
编写日期:20080918
-----------------------------------------------*/
void LCD_write_shu(unsigned char row, unsigned char page,unsigned char c) //row:列 page:页 dd:字符
{
unsigned char i;
LCD_set_XY(row*8, page);// 列,页
for(i=0; i<8;i++)
{
LCD_write_byte(shuzi[c*16+i],1);
}
LCD_set_XY(row*8, page+1);// 列,页
for(i=8; i<16;i++)
{
LCD_write_byte(shuzi[c*16+i],1);
}
}
/*---------------------------------------------
LCD_write_hanzi: 显示16(宽)*16(高)点阵列汉字等半角类
输入参数:c:显示的字符;
编写日期:20080918
-----------------------------------------------*/
void LCD_write_hanzi(unsigned char row, unsigned char column,unsigned char c) //row:列 page:页 dd:字符
{
unsigned char rowCount,columnCount,i;
for(columnCount=0,i=0;columnCount<16;columnCount++) //共16列
{
for(rowCount=0;rowCount<2;rowCount++,i++)
{
LCD_set_XY(column*16+columnCount, row*2+1-rowCount);//设置坐标
LCD_write_byte(hanzi[c][i],1);
}
}
}
main.c中为:
#include "main.h"
#include "lcd5110.h"
void main()
{
unsigned char k;
res=0;
for(k=0;k<250;k++);
res=1;
LCD_init(); //初始化LCD模块
LCD_clear(); //清屏幕
LCD_write_hanzi(0,0,4); //
LCD_write_hanzi(0,1,3); //
LCD_write_hanzi(0,2,2); //
LCD_write_hanzi(0,3,1); //
LCD_write_hanzi(0,4,0); //
}
将得到的字模数据放到hanzi[][32]数组中。
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |